【问题标题】:jQuery Mobile delegate vs live vs bindjQuery Mobile 委托 vs 实时 vs 绑定
【发布时间】:2012-05-09 16:15:26
【问题描述】:

我似乎无法理解 jQuery Mobile 中以下内容之间的差异:

$( document ).live('pageshow', function(event) {
});

$( document ).bind('pageshow', function(event) {
});

$( document ).delegate("#page", "pageshow", function() {
});

如何在我的文档头部执行某些页面中不同的脚本?我使用哪些方法来调用这些脚本?

更新: jQuery 版本:1.7.1 jQuery Mobile 版本:1.1.0

【问题讨论】:

    标签: jquery jquery-mobile


    【解决方案1】:

    您将绑定到 jQuery Mobile 公开的“页面事件”,例如 pageinit

    $(document).delegate('#my-page', 'pageinit', function () {
        //this is like document.ready for this pseudo-page
    });
    

    由于您使用的是 jQuery Core 1.7.1,因此您可以使用 .on(),它的语法略有不同:

    $(document).on('pageinit', '#my-page', function () {
        //this is like document.ready for this pseudo-page
    });
    

    您的所有三种方法都做类似的事情。 .live() 与使用 .delegate()document 作为根选择相同,但它已被贬值,因此最好停止使用它(来源:http://api.jquery.com/on)。直接在document 元素上使用.bind() 与使用.delegate() 相同,但是当您使用.bind() 时,您必须确定哪个伪页面在事件处理程序而不是函数调用中触发了事件.

    例如:

    $(document).bind('pageshow', function () {
        var id = $.mobile.activePage[0].id;
        //you can use $.mobile.activePage to do work on the current page
    });
    

    通常,当我们不知道元素何时会存在于 DOM 中时,会使用事件委托。它依赖于冒泡 DOM 的事件,直到它们到达根选择(在您的情况下,它始终是 document 元素)。

    .delegate() 的文档:http://api.jquery.com/delegate

    有关这些功能之间差异的更多一般信息,请参阅这篇文章(我已阅读它以检查其准确性并且它是正确的):http://www.elijahmanor.com/2012/02/differences-between-jquery-bind-vs-live.html

    【讨论】:

    • 感谢您的资源。这很棒。我还有另一个有点相关的问题。假设我的主页有幻灯片。我应该在“pageinit”或“pageshow”函数中调用幻灯片代码吗?
    • pageshow 将在用户每次看到该页面时触发。例如,当您第一次查看主页时它会触发,但是当您离开然后返回主页时它也会触发。我将在pageinit 事件处理程序中设置幻灯片,然后在pagehide 事件处理程序中停止它并在pageshow 事件处理程序中启动它。这适用于初始加载,因为pageshow 事件在pageinit 事件之后触发。
    • 如果我在pageinitpageshow 事件处理程序中都设置了幻灯片(即运行一个函数来初始化幻灯片),它不会调用该函数两次吗?
    • 我的意思是在pageinit 中初始化幻灯片(而不是启动它),然后在pageshow 中启动它并在pagehide 中停止它,所以它无缘无故地不使用CPU .我不知道您使用的是什么插件,但通常您可以在不自动启动的情况下初始化幻灯片。
    • 啊,我明白了。我现在正在使用Flexslider。您能推荐任何专门针对移动设备(即带有触摸事件)的精彩幻灯片吗?
    【解决方案2】:

    这是一个很好的描述:http://jquerybyexample.blogspot.com/2010/08/bind-vs-live-vs-delegate-function.html

    但简短的回答是,如果您使用的是 jquery 1.7,您可能应该开始使用新的 API on() 而不是以下任何一种:http://api.jquery.com/on/

    【讨论】:

    • 那篇文章实际上令人困惑。例如,.live() 不会(永远)绑定到您要定位的元素,它会(始终)绑定到 document 元素并检查目标元素的冒泡事件以查看它是否与您传递的选择匹配.live()。此外,.live() 可以用于链接,但作者使用了一个愚蠢的例子来说明相反的情况。请不要将本文作为您了解这些功能的依据。
    • 试试这篇文章,效果会好很多:elijahmanor.com/2012/02/…
    【解决方案3】:

    前几天我也有同样的问题,发现这篇文章对每个问题都有明确的细分。

    http://jquerybyexample.blogspot.com/2010/08/bind-vs-live-vs-delegate-function.html

    【讨论】:

    • 这篇文章充满了无效的陈述,请参阅我对朱莉谢菲尔德回答的评论。
    • 试试这篇文章,确实不错:elijahmanor.com/2012/02/…
    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 2013-06-10
    • 2011-07-02
    • 2011-12-13
    • 1970-01-01
    • 2011-02-08
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多