为啥在我将不相关的 div 添加到 DOM 后,JQuery UI Datepicker 停止工作?

Posted

技术标签:

【中文标题】为啥在我将不相关的 div 添加到 DOM 后,JQuery UI Datepicker 停止工作?【英文标题】:Why does JQuery UI Datepicker stop working after I add an unrelated div to the DOM?为什么在我将不相关的 div 添加到 DOM 后,JQuery UI Datepicker 停止工作? 【发布时间】:2015-01-18 14:23:00 【问题描述】:

我有一个带有两个日期选择器文本框(开始日期和结束日期)和一个提交按钮(type="button")的表单。 html 看起来像这样:

 <div class="subForm">
  <h3>
    Input start/end dates and station ID or lat/lon location to get point surge
    in the desired time frame:
  </h3>

  <br>
  <br>

  <form>
    <span>
      Start Date:
      <br>
      <input id="sdate" type="text">
    </span>

    <span>
      End Date:
      <br>
      <input id="edate" type="text">
    </span>

    <span>
      Station ID:
      <br>
      <select id="stns"></select>
    </span>

    <span>
      <br>
      <input id="submit" type="button" value="Get Surge"/>
    </span>
  </form>
</div>

我使用以下 jQuery 分别为文本框和按钮分配日期选择器和单击事件:

window.onload = $(function() 
  $('#submit').click(function() 
    getArchive();
  );

  // Start/end datepickers
  window.sDateStr = '';
  window.eDateStr = '';
  $('#sdate').datepicker(changeMonth:true,
                          changeYear:true,
                          yearRange:"2002:2020",
                        );
  $('#edate').datepicker(changeMonth:true,
                          changeYear:true,
                          yearRange:"2002:2020",
                        );

  $('.ui-datepicker').css('z-index',9000);
);

“subForm”div 位于主体中的“wrapper”div 内部。当用户单击“Get Surge”时,表单使用 javascript 获取相关信息,然后将 div 附加到包装器(在提交表单下),如下所示:

function display(data) 
  $('#wrapper').html($('#wrapper').html() + '<pre id="pointdata">'+data['ss']+'</pre>');
  $('#pointdata').css('margin-top':'-6%',
                       'width':'90%',
                       'height':'600px',
                       'margin-left':'5%',
                       'overflow':'scroll',
                       'word-wrap':'break-word',
                       'z-index':'0');

此时,包含所有数据的表格加载得很好,但是文本框中的日期消失了,当我尝试重新输入新日期时,没有弹出日历。

我省略了抓取和解析数据的 Javascript,因为这不会导致问题。只有当我调用“显示(数据)”函数时,日期选择器才会中断。如果我省略该功能,程序 console.log 的数据正常,并且 datepicker 仍然可用。

但是,当我尝试将 div 附加到“#wrapper”时,日期选择器会中断。文本框仍然有类“.hasdatepicker”。我已经尝试过 datepicker('destroy') 并在重新分配之前删除了 '.hasdatepicker' 类,但这些都不能解决我的问题。我还确保正确设置 z-indexes,以便日期选择器具有更高的 z-indexes。我将 div 移到一边只是为了确保没有一些奇怪的 z-index-not-working 问题,但日历实际上没有显示。有什么建议吗?

【问题讨论】:

使用$('#wrapper').append(... 而不是$('#wrapper').html($('#wrapper').html() + ... 是的……那行得通。不知道为什么我没有这样做。想回答问题并获得积分吗? 【参考方案1】:

根据我的评论:

发生的情况是,您使用 .datepicker 将日期选择器附加到 dom 元素,该 .datepicker 将事件侦听器附加到输入字段(以触发点击事件)。

使用线路时

$('#wrapper').html($('#wrapper').html() + '<pre id="pointdata">'+data['ss']+'</pre>');

您实际上是在删除#wrapper 的内容并将其替换为自身,这样做将删除所有侦听器,这也是在 jquery 中使用事件委托的常见原因(尽管我认为您的 datepicker 库不支持它)

简单的解决方案是将新内容附加到#wrapper,与.html() 的功能相同,但它保留了侦听器:

$('#wrapper').append('<pre id="pointdata">'+data['ss']+'</pre>');

【讨论】:

以上是关于为啥在我将不相关的 div 添加到 DOM 后,JQuery UI Datepicker 停止工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在我将文件添加到项目时,Visual Studio 会检出 .vspscc 文件?

添加 UITapGestureRecognizer 后 UIButtons 将不起作用

为啥将外键字段添加到模型后 URL 不起作用?

识别 AJAX 请求后添加到 DOM 的新元素

为啥即使在我将约束设置为 0 后 UITableView 上仍有余量

为啥我无法使用 jquery animate 将 Div 滑动到屏幕上?