代码之家  ›  专栏  ›  技术社区  ›  Lajos Arpad

jQuery datepicker只在第一次执行时运行

  •  0
  • Lajos Arpad  · 技术社区  · 6 年前

    我的页面加载 每日.js 这种方式:

    <script type="text/javascript" src="/js/lib/jquery-2.1.4.min.js"></script>
    <script type="text/javascript" src="/js/lib/jquery-ui.js"></script>
    <link rel="stylesheet" href="/css/jquery-ui.css">
    <script type="text/javascript">
        window.loadedJQuery = true;
        window.loadedJQueryUI = true;
    </script>
    <script type="text/javascript" src="/js/pages/admin/daily.js"></script>
    

    这就是 每日.js 包含(极其简化的版本):

    document.onreadystatechange = function() {
        $("#start-date, #end-date").datepicker({dateFormat: "yy-mm-dd"});
    };
    

    这正确地使 datepicker 由于 start-date end-date ,如下所示:

    <label>
        Munkálatok időintervalluma: <input id="start-date" type="text"> - <input id="end-date" type="text">
    </label>
    

    到现在为止,一直都还不错。但在某个事件上,会出现一个弹出窗口。为了确保与之相关的Javascript正确执行,我添加了一个不可见的 iframe 这样地:

    <iframe style="display: none;" onload="function loadJQuery() {window.loadedjQuery = document.createElement(&quot;script&quot;);window.loadedjQuery.src=&quot;/js/lib/jquery-2.1.4.min.js&quot;;window.loadedjQuery.onload = loadJQueryUI;document.head.appendChild(window.loadedjQuery);}function loadJQueryUI() {window.loadedJQueryUI = document.createElement(&quot;script&quot;);window.loadedJQueryUI.src=&quot;/js/lib/jquery-ui.js&quot;;window.loadedJQueryUI.onload = loadAddEditJob;document.head.appendChild(window.loadedJQueryUI);var link = document.createElement(&quot;link&quot;);link.rel = &quot;stylesheet&quot;;link.href = &quot;/css/jquery-ui.css&quot;;document.head.appendChild(link);}function loadAddEditJob() {window.loadedAddEditJob = document.createElement(&quot;script&quot;);window.loadedAddEditJob.src=&quot;/js/templates/AddEditJob.js&quot;;document.head.appendChild(window.loadedAddEditJob);}if (!window.loadedjQuery) {loadJQuery();} else if (!window.loadedJQueryUI) {loadJQueryUI();} else if (!loadedAddEditJob) {loadAddEditJob();}" "=""></iframe>
    

    在我的弹出窗口中,它不在 框架 我有这个:

    <input class="form-data" name="StartedDate" type="text" id="started-date" value="2018-07-29">
    

    而这个:

    <input class="form-data" name="EndedDate" type="text" id="ended-date" value="2018-07-29">
    

    AddEditJob.js 已加载,如下所示(非常简化的版本):

    $(function() {
        var d = new Date();
        $("#started-date, #ended-date").each(function() {
            if ((this.id === "started-date") && (!$(this).val())) {
                $(this).val(d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate());
            }
            $(this).datepicker({ dateFormat: 'yy-mm-dd' });
        });
    });
    

    我的问题是 started-date ended-date 不会像人们期望的那样工作 日期选择器 要工作,也就是说,当我点击它们内部时,什么都不会发生。没有错误消息,没有,尽管 hasDatePicker class 如人们所料,正确地添加到它们中。如果我避免将第一个日期选择器初始化为

    document.onreadystatechange = function() {
        //$("#start-date, #end-date").datepicker({dateFormat: "yy-mm-dd"});
    };
    

    然后打开弹出窗口,其中的项被正确地初始化为日期选择器,它们工作正常。如果我关闭弹出窗口并重新打开它,即使里面的所有东西都被销毁并重新创建,我的项目将作为日期选择器正常工作。

    我的问题是:我如何确保 日期选择器 加载时执行,弹出窗口显示时执行的将正确初始化所有日期选择器?

    编辑:

    在集中精力解决这个问题之后,我没能做到,所以我创建了这个 Fiddle .

    HTML格式:

    <label>
        Munkálatok időintervalluma: <input id="start-date" type="text"> - <input id="end-date" type="text">
    </label>
    <input class="form-data" name="StartedDate" type="text" id="started-date" value="2018-07-29">
    <input class="form-data" name="EndedDate" type="text" id="ended-date" value="2018-07-29">
    <button onclick="window.createIFrame();">
        Create Iframe
    </button>
    

    JS公司:

        $("#start-date, #end-date").datepicker({dateFormat: "yy-mm-dd"});
    window.test = function() {
        var d = new Date();
        $("#started-date, #ended-date").each(function() {
            if ((this.id === "started-date") && (!$(this).val())) {
                $(this).val(d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate());
            }
            $(this).datepicker({ dateFormat: 'yy-mm-dd' });
        });
    };
    window.createIFrame = function() {
        document.body.innerHTML += '<iframe style="display: none;" onload="console.log(window.test);window.test();"></iframe>';
    }
    

    所有四个输入都应作为日期选择器工作,但第三个和第四个输入的工作方式不同于日期选择器。

    1 回复  |  直到 6 年前
        1
  •  1
  •   spankajd    6 年前

    正如我在上面的代码和JSFeddle中看到的。更新DOM的方式 document.body.innerHTML += '<iframe style="display: none;" onload="console.log(window.test);window.test();"></iframe>'; } 代码。

    您需要将datepicker事件重新分配给这些输入字段。

    或者在dom更新后简单地添加下面的代码。

    $('.ui-datepicker').remove();
    $("#start-date, #end-date").removeClass('hasDatepicker').datepicker();
    

    这是更新的JSFeddle链接。 http://jsfiddle.net/g1zk8mc7/53/ 谢谢