利用select實現年月日三級聯動的日期選擇效果

来源:http://www.cnblogs.com/xiaohuochai/archive/2016/09/16/5877594.html
-Advertisement-
Play Games

× 目錄 [1]演示 [2]規劃 [3]結構生成[4]演算法處理 前面的話 關於select控制項,可能年月日三級聯動的日期選擇效果是最常見的應用了。本文是選擇框腳本的實踐,下麵將對日期選擇效果進行詳細介紹 演示 規劃 預設情況下,年、月、日分別由3個select控制項組成,id分別為sel1,sel2, ...


×
目錄
[1]演示 [2]規劃 [3]結構生成[4]演算法處理

前面的話

  關於select控制項,可能年月日三級聯動的日期選擇效果是最常見的應用了。本文是選擇框腳本的實踐,下麵將對日期選擇效果進行詳細介紹

 

演示

規劃

  預設情況下,年、月、日分別由3個select控制項組成,id分別為sel1,sel2,sel3。它們且所包含的option[0]的值,分別為'年'、'月'、'日'

  年份範圍為1900-2100,月份範圍為1-12,天的範圍為1-31

  年份範圍、月份範圍是不變的。而天的範圍根據實際日期的計算來改變其範圍值

  id為result的span元素儲存最終選擇的日期值及對應的星期值

<div id="box">
    <select name="sel1" id="sel1">
        <option value="year"></option>
    </select>
    <select name="sel2" id="sel2">
    <option value="month"></option>
    </select>
    <select name="sel3" id="sel3">
    <option value="day"></option>
    </select>
    <span id="result"></span>
</div>

 

結構生成

  由於數據太過龐大,所以使用javascript生成的方式生成結構

//生成1900年-2100年
for(var i = 1900; i<=2100;i++){
    var option = document.createElement('option');
    option.setAttribute('value',i);
    option.innerHTML = i;
    sel1.appendChild(option);
}
//生成1月-12月
for(var i = 1; i <=12; i++){
    var option = document.createElement('option');
    option.setAttribute('value',i);
    option.innerHTML = i;
    sel2.appendChild(option);    
}
//生成1日—31日
for(var i = 1; i <=31; i++){
    var option = document.createElement('option');
    option.setAttribute('value',i);
    option.innerHTML = i;
    sel3.appendChild(option);    
}

 

演算法處理

  演算法的實質就是確定某年某月到底有多少天,然後對多餘的天數進行刪除或者對少的天數進行添加

【1】閏年

  年分為閏年和平年,平年有365天,閏年有366天。閏年的2月比平年多一天

  閏年的定義是(可被4整除)且((不可被100整除)或(可被400整除))的年份

  口訣是:四年一閏,百年不閏,四百年再閏

if((year % 4 === 0 && year % 100 !== 0)  || year % 400 === 0){
    return 'leap year'
}else{
    return 'common year'
}

【2】大小月

  一年有12個月,其中4、6、9、11月每月有30天;如果是閏年,2月有29天,否則 ,2月有28天。1、3、5、7、8、10、12月每月有31天

if(month == 2){
    //如果是閏年
    if((year % 4 === 0 && year % 100 !== 0)  || year % 400 === 0){
        days = 29;
    //如果是平年
    }else{
        days = 28;
    }
//如果是第4、6、9、11月
}else if(month == 4 || month == 6 ||month == 9 ||month == 11){
    days = 30;
}else{
    days = 31;
}

【3】增減情況

  考慮特殊情況,如果先選擇31日,再選擇2月,則發生錯誤。所以,選擇年份時,月份和天數自動置為預設值'月'和'日',天數的範圍重置為'31'

//年份點擊
sel1.onclick = function(){
    //月份顯示預設值
    sel2.options[0].selected = true;
    //天數顯示預設值
    sel3.options[0].selected = true;
}

  選擇月份時,天數自動置為預設值'日',天數的範圍根據計算顯示相應天數

  此時,天數可能為28、29、30、31四種情況

    //增加或刪除天數
    //如果是28天,則刪除29、30、31天(即使他們不存在也不報錯)
    if(days == 28){
        sel3.remove(31);
        sel3.remove(30);
        sel3.remove(29);
    }
    //如果是29天
    if(days == 29){
        sel3.remove(31);
        sel3.remove(30);
        //如果第29天不存在,則添加第29天
        if(!sel3.options[29]){
            sel3.add(new Option('29','29'),undefined)
        }
    }
    //如果是30天
    if(days == 30){
        sel3.remove(31);
        //如果第29天不存在,則添加第29天
        if(!sel3.options[29]){
            sel3.add(new Option('29','29'),undefined)
        }
        //如果第30天不存在,則添加第30天
        if(!sel3.options[30]){
            sel3.add(new Option('30','30'),undefined)
        }
    }
    //如果是31天
    if(days == 31){
        //如果第29天不存在,則添加第29天
        if(!sel3.options[29]){
            sel3.add(new Option('29','29'),undefined)
        }
        //如果第30天不存在,則添加第30天
        if(!sel3.options[30]){
            sel3.add(new Option('30','30'),undefined)
        }
        //如果第31天不存在,則添加第31天
        if(!sel3.options[31]){
            sel3.add(new Option('31','31'),undefined)
        }
    }

【4】結果顯示

  每次年、月、日的點擊事件,都判斷年份、月份和天數是否都已經設置為非預設值。如果是的,則顯示最終結果,並計算星期值;如果不是,則什麼都不執行

//星期格式切換
function changDay(num){
    switch(num){
        case 0:
            return '日';
        case 1:
            return '一';
        case 2:
            return '二';
        case 3:
            return '三';
        case 4:
            return '四';
        case 5:
            return '五';
        case 6:
            return '六';            
    }
}
//結果顯示
box.onclick = function(){
    //當年、月、日都已經為設置值時
    if(sel1.value !='year' && sel2.value != 'month' && sel3.value !='day'){
        var day = new Date(sel1.value,sel2.value-1,sel3.value).getDay();
        result.innerHTML = sel1.value + '年' + sel2.value + '月' +  sel3.value + '日' + '星期' + changDay(day);
    }else{
        result.innerHTML = '';
    }
}

源碼查看


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.預備知識 最近開始嘗試做一些tornado商城項目,在開始之前需要引入一些項目設計知識,如介面,抽象方法抽象類,組合,程式設計原則等,個人理解項目的合理設計可增加其靈活性,降低數據之間的耦合性,提高穩定性,下麵介紹一些預備知識 1.介面 其實py中沒有介面這個概念。要想實現介面的功能,可以通過主 ...
  • 在進行列表排序時,有個“上移”和“下移”操作,這個一般在記憶體里完成,然後統一提交到資料庫中,對於上移與下移的設計,大叔在LIND.DDD.DOMAIN里有一個ISortBehavor介面,主要是說,如果實體對象支持排序功能,可以實現這個介面,而在擴展庫中,將有為本地結果集動態排序(上移和下移)的方法 ...
  • 架構目標 業務系統 架構設計原則 應用架構 基礎架構 資料庫架構 分散式資料庫特性 • 支持MySQL,MariaDB,MongoDB等資料庫 • 服務高可用,主庫故障,從庫自動切換 • 數據高可靠,定期快照備份,增量備份 • 數據自動拆分,一鍵無縫遷移擴容 • 針對特殊業務需求,定製優化特殊的數據... ...
  • 職責鏈模式(Chain of responsibility),就是使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。通過職責鏈模式,簡單地使用JavaScript模擬了冒泡事件。 ...
  • leonaScroll-1.1最新版-豎向 leonaScroll-1.1.js歡迎使用leonaScroll-1.1.js,此滾動條僅支持豎向滾動,如您在使用過程中發現更多問題,歡迎指正! 更新:1.1版本1、修複了前面初始版本中的一些bug,比如不能自適應用戶的文本內容,css文件繁雜2、用戶只 ...
  • 在上一篇CSS3選擇器的研究中列出了幾乎所有的CSS3選擇器,和偽類選擇器,當是並沒有做案例的研究,本想在那篇文章裡面寫,但想想如果把案例都寫在那篇文章裡面,對於查找來說就不是很方便,所有另開一篇來講實例。 屬性選擇器 [title]:選擇帶有title屬性的元素 [title='hello']:選 ...
  • Jquery屬性遍歷、HTML操作。 Jquery擁有可操作HTML元素和屬性的強大方法。 下麵是我整理的一些jquery遍歷函數: .add() 將元素添加到匹配元素的集合中。 .andSelf() 把堆棧中之前的元素集添加到當前集合中。 .children() 獲得匹配元素集合中每個元素的所有子 ...
  • 概述 要求:兩邊頂寬,中間自適應的三欄佈局,中間欄要在放在文檔流前面以優先渲染。 異同點:聖杯是採用left和right相對定位的方式;而雙飛翼是在center裡面又創建了一個子div,在該子div里用margin left和margin right為左右兩欄div留出位置。 聖杯佈局 雙飛翼佈局 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...