拦截所有当前和未来的链接

Kas*_*ade 3 jquery

只是想知道是否有一种方法可以让jquery在点击时拦截一个链接.问题是,首次加载页面时,我的页面上的某些链接未加载.我有一个模糊的回忆,听说jquery有办法拦截所有当前和未来的链接.这是我的代码.它适用于开始时所有链接,但稍后加载到页面上的链接不会被此函数拦截

$('a').trackClick({
        areaClick: function(element) { return getAreaClicked(element); },
        href: function(element) { return getHrefFromElement(element); },
        text: function(element) { return getTextFromElement(element); },
        exceptions: function(element) { return isException(element); }
    });
Run Code Online (Sandbox Code Playgroud)

Gre*_*tit 7

[编辑:我偶尔会对这个答案进行投票,所以我想用更新的(截至2015年5月)实践更新它:

根据我的原始答案,委派听众是一种更好的做法.jQuery目前的"最佳实践"语法是.on().它只在顺序上有所不同,对我而言在语义上更直观:

$('#parent').on('click', 'a', function(event) {
  event.preventDefault();
  // do the rest of your stuff
}
Run Code Online (Sandbox Code Playgroud)

我的原始答案的其余部分仍然适用.


如果您不想要默认的单击行为,则还需要停止事件冒泡.我更喜欢委托代表,所以这是我的建议:

$('#parent').delegate('a', 'click', function(event) {
  event.preventDefault();
  // do the rest of your stuff
});
Run Code Online (Sandbox Code Playgroud)

"#parent"只是一个样本.您将使用任何适当的选择器,它将成为锚标签的永久祖先.甚至可以上升到"身体",但通常一些描述的包装ID也可以.

[编辑:我最近看到了一个upvote,这意味着有人会看到这个答案.应该注意的.live()是,现在已弃用,虽然.delegate()支持,但官方建议的语法.on()用作委托者:

$('#parent').on('click', 'a', function(event) {
  event.preventDefault();
  // do the rest of your stuff
});
Run Code Online (Sandbox Code Playgroud)


Ash*_*Ash 5

你需要jquery Live看到这里:http://api.jquery.com/live/

    $('a').live('click', function(e){

var element  = $(this);
var data = {areaClick: function(element) { return getAreaClicked(element); },
            href: function(element) { return getHrefFromElement(element); },
            text: function(element) { return getTextFromElement(element); },
            exceptions: function(element) { return isException(element); }
}
    trackClick(data);

    });
Run Code Online (Sandbox Code Playgroud)

  • 未来的读者认为这是正确的答案应该知道.live()已经是一个沮丧的选择,首选`.delegate()`; 但更重要的是,现在两者都使用委托语法取代了`.on()`.http://api.jquery.com/on/ (7认同)