【问题标题】:jQuery datepicker runs only at first executionjQuery datepicker 仅在第一次执行时运行
【发布时间】:2018-08-03 12:19:54
【问题描述】:

我的页面以这种方式加载 daily.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>

这是 daily.js 包含的内容(非常简化的版本):

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

这正确地从start-dateend-date 中生成了datepicker,如下所示:

<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>

在我的弹出窗口内,它不在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-dateended-date 将无法正常工作,因为人们可能期望datepicker 可以正常工作,也就是说,当我在其中单击时,什么也没有发生。没有错误消息,什么都没有,尽管hasDatePicker class 已正确添加到它们中,正如人们所期望的那样。如果我避免将我的第一个日期选择器初始化为日期选择器,例如

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

并打开弹出窗口,然后其中的项目被正确初始化为日期选择器并且它们运行良好。如果我关闭弹出窗口并重新打开它,即使里面的所有内容都被破坏并重新创建,我的项目将作为日期选择器正常工作。

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

编辑:

在努力解决这个问题后我没能做到,所以我创建了这个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>';
}

所有四个输入都应该作为日期选择器工作,但第三和第四个不像日期选择器那样工作。

【问题讨论】:

  • 能不能在JSfiddle里做demo,方便理解
  • @spankajd 我需要很多时间来为此目的编写 JSFiddle。我宁愿把时间花在研究和实验上。我可能很快就会想出一个答案。因此,我宁愿解释我的问题中未阐明的任何内容,而不是使用 JSFiddle。
  • 你没有说弹出窗口是如何呈现/加载的。应该有一个可以挂钩的事件,例如对于引导程序,它将是 $("#mymodal").on("shown.bs.modal", function()...
  • @spankajd 我添加了一个 JSFiddle
  • @freedomn-m 这是一个非常简单的点击事件,它发送一个 AJAX 请求并将响应放入 DOM。让我们不可知地考虑文档中的任何 HTML 更改。

标签: javascript jquery datepicker jquery-ui-datepicker


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-02-19
    • 2014-02-08
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多