解決ExtNET ExtJS 特定日期選擇月份跳轉導致無法選擇月份的問題

来源:http://www.cnblogs.com/hijushen/archive/2017/04/06/6672771.html
-Advertisement-
Play Games

背景 項目使用 , 對應Ext JS4.2版本。 結果 2017/3/31 號的時候偶然間點日曆選擇控制項選擇2月,10月等月份突然就跳到3月份,9月份之類。 就是無法選擇, 選擇谷歌以後發現有同樣的問題, 然後各種嘗試, 重寫了預設屬性,如下代碼後解決。 現記錄。 改動的部分就是 這一句, 設置為當 ...


背景

項目使用 Ext.NET 2.2.0.40838 , 對應Ext JS4.2版本。 結果 2017/3/31 號的時候偶然間點日曆選擇控制項選擇2月,10月等月份突然就跳到3月份,9月份之類。 就是無法選擇, 選擇谷歌以後發現有同樣的問題, 然後各種嘗試, 重寫了預設屬性,如下代碼後解決。 現記錄。

改動的部分就是 dt.setDate(1); 這一句, 設置為當前月份第一天。

代碼

  • 原則上放到公共js裡面, 然後就行了, 確保生效。 當然也可以放在頁面裡面調試, 先看看是不是可行。 本項目驗證通過。
//修複日期月份模式下在本地日期為31號時跳到下個月的問題 2017年3月31日

(function () { 

if(!window.Ext){return;}
if(!window.Ext.Date){return;}

Ext.Date.createParser = function (format) {
    var utilDate = Ext.Date;



    var xf = function (format) {
        var args = Array.prototype.slice.call(arguments, 1);


        var numberTokenRe = /\{(\d+)\}/g;

        return format.replace(numberTokenRe, function (m, i) {
            return args[i];
        });
    }


    var code = [
    // date calculations (note: the code below creates a dependency on Ext.Number.from())
        "var me = this, dt, y, m, d, h, i, s, ms, o, O, z, zz, u, v, W, year, jan4, week1monday,",
            "def = me.defaults,",
            "from = Ext.Number.from,",
            "results = String(input).match(me.parseRegexes[{0}]);", // either null, or an array of matched strings

        "if(results){",
            "{1}",

            "if(u != null){", // i.e. unix time is defined
                "v = new Date(u * 1000);", // give top priority to UNIX time
            "}else{",
    // create Date object representing midnight of the current day;
    // this will provide us with our date defaults
    // (note: clearTime() handles Daylight Saving Time automatically)
                "dt = me.clearTime(new Date);dt.setDate(1);",

                "y = from(y, from(def.y, dt.getFullYear()));",
                "m = from(m, from(def.m - 1, dt.getMonth()));",
                "d = from(d, from(def.d, dt.getDate()));",

                "h  = from(h, from(def.h, dt.getHours()));",
                "i  = from(i, from(def.i, dt.getMinutes()));",
                "s  = from(s, from(def.s, dt.getSeconds()));",
                "ms = from(ms, from(def.ms, dt.getMilliseconds()));",

                "if(z >= 0 && y >= 0){",
    // both the year and zero-based day of year are defined and >= 0.
    // these 2 values alone provide sufficient info to create a full date object

    // create Date object representing January 1st for the given year
    // handle years < 100 appropriately
                    "v = me.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), me.YEAR, y < 100 ? y - 100 : 0);",

    // then add day of year, checking for Date "rollover" if necessary
                    "v = !strict? v : (strict === true && (z <= 364 || (me.isLeapYear(v) && z <= 365))? me.add(v, me.DAY, z) : null);",
                "}else if(strict === true && !me.isValid(y, m + 1, d, h, i, s, ms)){", // check for Date "rollover"
                    "v = null;", // invalid date, so return null
                "}else{",
                    "if (W) {", // support ISO-8601
    // http://en.wikipedia.org/wiki/ISO_week_date
    //
    // Mutually equivalent definitions for week 01 are:
    // a. the week starting with the Monday which is nearest in time to 1 January
    // b. the week with 4 January in it
    // ... there are many others ...
    //
    // We'll use letter b above to determine the first week of the year.
    //
    // So, first get a Date object for January 4th of whatever calendar year is desired.
    //
    // Then, the first Monday of the year can easily be determined by (operating on this Date):
    // 1. Getting the day of the week.
    // 2. Subtracting that by one.
    // 3. Multiplying that by 86400000 (one day in ms).
    // 4. Subtracting this number of days (in ms) from the January 4 date (represented in ms).
    // 
    // Example #1 ...
    //
    //       January 2012
    //   Su Mo Tu We Th Fr Sa
    //    1  2  3  4  5  6  7
    //    8  9 10 11 12 13 14
    //   15 16 17 18 19 20 21
    //   22 23 24 25 26 27 28
    //   29 30 31
    //
    // 1. January 4th is a Wednesday.
    // 2. Its day number is 3.
    // 3. Simply substract 2 days from Wednesday.
    // 4. The first week of the year begins on Monday, January 2. Simple!
    //
    // Example #2 ...
    //       January 1992
    //   Su Mo Tu We Th Fr Sa
    //             1  2  3  4
    //    5  6  7  8  9 10 11
    //   12 13 14 15 16 17 18
    //   19 20 21 22 23 24 25
    //   26 27 28 29 30 31
    // 
    // 1. January 4th is a Saturday.
    // 2. Its day number is 6.
    // 3. Simply subtract 5 days from Saturday.
    // 4. The first week of the year begins on Monday, December 30. Simple!
    //
    // v = Ext.Date.clearTime(new Date(week1monday.getTime() + ((W - 1) * 604800000)));
    // (This is essentially doing the same thing as above but for the week rather than the day)
                        "year = y || (new Date()).getFullYear(),",
                        "jan4 = new Date(year, 0, 4, 0, 0, 0),",
                        "week1monday = new Date(jan4.getTime() - ((jan4.getDay() - 1) * 86400000));",
                        "v = Ext.Date.clearTime(new Date(week1monday.getTime() + ((W - 1) * 604800000)));",
                    "} else {",
    // plain old Date object
    // handle years < 100 properly
                        "v = me.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), me.YEAR, y < 100 ? y - 100 : 0);",
                    "}",
                "}",
            "}",
        "}",

        "if(v){",
    // favor UTC offset over GMT offset
            "if(zz != null){",
    // reset to UTC, then add offset
                "v = me.add(v, me.SECOND, -v.getTimezoneOffset() * 60 - zz);",
            "}else if(o){",
    // reset to GMT, then add offset
                "v = me.add(v, me.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));",
            "}",
        "}",

        "return v;"
      ].join('\n');



    var regexNum = utilDate.parseRegexes.length,
            currentGroup = 1,
            calc = [],
            regex = [],
            special = false,
            ch = "",
            i = 0,
            len = format.length,
            atEnd = [],
            obj;

    for (; i < len; ++i) {
        ch = format.charAt(i);
        if (!special && ch == "\\") {
            special = true;
        } else if (special) {
            special = false;
            regex.push(Ext.String.escape(ch));
        } else {
            obj = utilDate.formatCodeToRegex(ch, currentGroup);
            currentGroup += obj.g;
            regex.push(obj.s);
            if (obj.g && obj.c) {
                if (obj.calcAtEnd) {
                    atEnd.push(obj.c);
                } else {
                    calc.push(obj.c);
                }
            }
        }
    }

    calc = calc.concat(atEnd);

    utilDate.parseRegexes[regexNum] = new RegExp("^" + regex.join('') + "$", 'i');
    utilDate.parseFunctions[format] = Ext.functionFactory("input", "strict", xf(code, regexNum, calc.join('')));

}
})();

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

-Advertisement-
Play Games
更多相關文章
  • 前端開發中,在做前後端分離的時候,經常需要手寫json數據,有3個問題特別揪心: 1,數據是寫死的,不能按一定的條件隨機生成長度不一,內容不一的數據 2,寫數組的時候,如果有很多條,需要一條一條地寫,費時費力 3,mock圖片特別困難 randomjson用來根據模型隨機生成json,mock js ...
  • ready()、DOM對象、jQuery對象、DOM對象與jQuery對象的相互轉換 ...
  • 上一篇講到局部變數可以修改全局變數,那麼反過來是否可以由外而內的拿到函數內的數據呢?答案是可以的下麵就介紹兩種方法。 1、通過聲明全局變數的方式: 執行結果 要由外而內的進行操作需要先聲明一個全局變數,然後通過給全局變數賦值的形式進行。 2、局部變數的調用 由外而內的進行操作也可以通過局部變數的調用 ...
  • 最近看見別人問的問題,點擊雷達圖的拐點,獲取點擊數據的問題,直接上代碼。 echarts配置問題:https://www.douban.com/note/509404582/ 還有一個就是給雷達圖的文字綁定點擊事件,上代碼。api地址:http://echarts.baidu.com/tutoria ...
  • 一個項目開發完,開發除了做好功能測試以外,還要做些性能方面的測試,除了依賴一些工具去檢查,有一些常用的檢查也是必要的: 1.弱網情況下測試網頁載入速度,以及是否有良好的loading體驗 2.js、css、image這些是否都懶載入 3.js和css是否都儘量合併壓縮到一個文件 4.icon是否都盡 ...
  • 在預解析原理(一)中我們簡單介紹了一下JS的解析過程,這篇文章會對這個過程進行深入的分析。 在這個過程中首先需要明白三個概念: 1、全局作用域:也就是全局變數聲明在函數之外的變數預設作用整個工程; 2、局部作用域:聲明在函數體中的變數,並且只能在當前函數體內訪問,如:function(){var a ...
  • FIS3常用配置: ...
  • 一、作用域概念、預解析規則、表達式 1、作用域概念 什麼是作用域:簡單說就是作用的範圍,指的是函數在哪些範圍內可以用,而在其他部分就不可以使用,如果需要使用就需要重新定義。 作用域的作用是什麼:用來執行讀或者寫的操作。 2、預解析規則 script:自上而下進行解析, 函數:由里到外進行解析。 但是 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...