【问题标题】:die() on single elementsdie() 在单个元素上
【发布时间】:2011-04-29 06:24:12
【问题描述】:

我已经附加了一些 live() 侦听器,以便自动对 url 中带有 ajax 的每个链接进行 ajax 调用:

$("document").ready(function() {
    $('a[href^="/ajax"]').live('click', call);
});

function call(e, context, link) {
    e && e.preventDefault();
    link = link || this;
    if(typeof link == "string" || !$(link).hasClass("disabled")) {
        newObj(SPZ.AjaxCall, link, context);
    }
};

但有时我想重写它(这样我就可以指定一个上下文来查找回调函数),所以我写了一个 jQuery 方法来做到这一点

$.fn.customAjax = function(context) {
    return this.die().click(function(e){
        call.call(this, e, context);
    });
};

$(".save").customAjax(myObj);

我遇到的问题是,如果将实时处理程序添加到元素集合中,我不能只在其中一个元素上使用 die(); die() 似乎只有在你将它应用于所有使用 live() 的元素时才有效。

任何人都可以提出一个可以抑制 live() 事件的解决方法吗?顺便说一句,人们对于建议 jQuery 团队改变 die() 的行为以便它可以用于删除单个元素上的 live() 处理程序的意见是什么?有什么理由说明这是个坏主意吗?

【问题讨论】:

  • die()live() 一样,不需要在选择器之后直接调用吗?例如$('a[href^="/ajax"]').die() 是正确的,但this.die() 不是?
  • 这可能是 die() 限制的一个方面,但如果我将其替换为找到我瞄准的链接的选择器,它仍然会失败。问题是试图只为添加实时处理程序的元素的子集而死

标签: javascript jquery events live die


【解决方案1】:

call 来自哪里?我没有看到它在这个代码部分的某个地方定义。

除此之外,我认为您的 this 不是指 jQuery 对象,而是指 DOM 节点。尝试包装它:

$.fn.customAjax = function(context) {
    return $(this).die().click(function(e){
        call.call(this, e, context);
    });
};

$(".save").customAjax(myObj);

【讨论】:

  • 函数挂在$.fn 就像在OP 的代码中自动获取指向当前jQuery 对象实例的this。无需包装。
  • oops - 将调用的定义添加到上面的代码中。 “this”是一个 jQuery 对象:点击处理程序确实在我指定的上下文中运行。问题在于,实时处理程序也会立即运行
【解决方案2】:

再玩一会儿,我发现在我的 jQuery 方法的末尾添加一个简单的 return false 就可以了。如果我想为同一次点击附加其他侦听器,这会导致问题,但现在可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-21
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多