【问题标题】:JQuery Mobile: inline data-role="page" javascript being retain when page is released from DOM?JQuery Mobile:当页面从 DOM 释放时,内联 data-role="page" javascript 被保留?
【发布时间】:2012-01-19 17:37:28
【问题描述】:

使用此调用<a href="deleteDialog.html" data-rel="dialog" data-transition="pop" data-role="button" id='deleteDialog'>Delete</a> 获取以下对话框页面:

<div data-role="page" id="deleteCompanyDialog">
<script type="text/javascript">

$("#deleteButton").live("click", function() {
        alert("this alert increments");

});

</script>

    <div data-role="header" data-theme="d">
        <h1>Dialog</h1>

    </div>

    <div data-role="content" data-theme="c">
        <h1>Delete Company</h1>
        <p id="message"></p>
        <a data-role="button" data-theme="b" id="deleteButton" >Sounds good</a>       
        <a href="company.jsp" data-role="button" data-rel="back" data-theme="c">Cancel</a>    
    </div>
</div>

似乎保留了以前对该对话框的任何调用的live("click".. 绑定,然后再次绑定live 调用。因此,如果我分别调用页面 4 次,在第四个对话框页面调用中,它将弹出 4 个警报屏幕。有没有办法让 javascript 仍然在 data-role="page" 内,所以它可以使用 ajax 加载但不会增加“实时”绑定。我尝试了$("#deleteCompanyDialog").live("pagecreate"...pageload(远射),它们也不起作用。

我们将不胜感激。

【问题讨论】:

  • data-role="Dialog" 与 data-role="page" 处于相同的位置,所以如果你试图把它放在一个页面中,它是行不通的。

标签: javascript jquery-mobile


【解决方案1】:

不要使用 .live(),而是使用 .bind() 并将您的 JavaScript 放在委托的事件处理程序中:

<div data-role="page" id="deleteCompanyDialog">

    <div data-role="header" data-theme="d">
        <h1>Dialog</h1>

    </div>

    <div data-role="content" data-theme="c">
        <h1>Delete Company</h1>
        <p id="message"></p>
        <a data-role="button" data-theme="b" id="deleteButton" >Sounds good</a>       
        <a href="company.jsp" data-role="button" data-rel="back" data-theme="c">Cancel</a>    
    </div>
<script type="text/javascript">

$(document).delegate("#deleteCompanyDialog", "pageinit", function() {
    $("#deleteButton").bind('click', function () {
        alert("this alert DOES NOT increment");
    });
});

</script>
</div>

这就像使用 $(function () {}); 一样,但用于 jQuery Mobile。 pageinit 事件将在页面初始化时触发(每个伪页面发生一次),.bind() 函数调用只会绑定到 DOM 中存在的元素。当您使用.live() 时,它不会绑定到实际元素,而是绑定到document 元素,当您离开对话框时,该元素不会被删除(因此每次显示对话框时,您都会添加另一个委托事件处理程序)。

【讨论】:

  • 使用绑定而不是实时工作。谢谢你的详细解答
  • 真的很精彩的答案贾斯珀;你应该为这个伟大的回应更多的影响力!作为后续,我注意到当使用浏览器后退按钮进行导航然后重新进入页。在这种情况下,是否有一种认可的方式只让 javascript 只被触发一次?就好像我们需要一个知道它已经包含在页面中的函数,后续请求可以忽略它。感谢您的想法!
  • 更新:我按照'off before on'原则解决了我的试验!感谢您的想法和贡献:stackoverflow.com/questions/9067259/…
  • @veeTrain 默认情况下,jQuery Mobile 从 DOM 中删除通过 AJAX 引入 DOM 的页面。这样做是为了节省内存。所以如果你点击后退按钮并且 jQuery Mobile 删除了前一个页面,它必须重新收集页面并初始化它,这将触发 pageinit 函数。您可以通过将 data-cache="true" 属性添加到通过 AJAX 引入 DOM 的任何 data-role="page" 元素来阻止这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 1970-01-01
相关资源
最近更新 更多