2012-07-09 66 views
0

如果我使用jQuery的.on()功能是这样的(还有更多,但这个是提取的主要问题区域):获取元素使用jQuery。对()

$(document).on("click", 
      $("#contcont a, #leftnav li a, #leftnav li ul a, #mainarea-home a").not(".secitem-mid a"), 
    function clicker(event, sData) { 

    var $this = $(this); 

    sHREF = $this.attr("href"); 

    alert(sHREF); 

}); 

我越来越不确定等什么将是实际获得被点击元素的最佳方式?我需要.on(),以便它总是发生,显然,而不是每次加载新数据时都必须将其附加到所有元素(这是通过Yahoo!商店,因此这是必要的)。谢谢。

+1

使用'event' obj,你在'on()' – gorelative 2012-07-09 15:12:31

+0

发布html代码。你也有点击标签中的href属性吗? – kiranvj 2012-07-09 15:15:20

+2

@freakish代码不好。选择器参数无效,因此被忽略。这导致直接绑定到文档的点击事件处理程序 - 因此未定义的'href'属性 - 而不是委托给锚点。 “代码运行”并不代表“代码是正确的”。 – 2012-07-09 15:24:00

回答

5

的第二个参数on选择,而不是一个jQuery对象;它用于事件委托。

如果你的意思是直接挂钩这些了,那么:

$("#contcont a, #leftnav li a, #leftnav li ul a, #mainarea-home a").not(".secitem-mid a").on("click", function clicker(event, sData) { 

    var $this = $(this); 

    sHREF = $this.attr("href"); 

    alert(sHREF); 

}); 

如果你真的想使用事件委托,该.not部分使得它有点棘手,因为(取决于你的标记),您可能需要在主系列中的每个选择器上重复它。由于这是丑陋的,你可能会更好的处理函数后处理这种特殊情况:

$(document).on("click", "#contcont a, #leftnav li a, #leftnav li ul a, #mainarea-home a", function clicker(event, sData) { 

    var $this = $(this); 

    // Handle the "not" part 
    if (!$this.is(".secitem-mid a")) { 
     sHREF = $this.attr("href"); 

     alert(sHREF); 
    } 
}); 

另外,虽然:它通常是最好铲除你的代表团最近要处理的元素的容器。如果您#contcont#leftnav,并#mainarea-home元素动态的,我可能会看生根代表团在他​​们,而不是document,例如:

$("#contcont" ).on("click", "a:not(.secitem-mid a)", clicker); 
$("#leftnav"  ).on("click", "li a:not(.secitem-mid a)", clicker); 
$("#mainarea-home").on("click", "a:not(.secitem-mid a)", clicker); 
function clicker(event, sData) { ... } 

注意我只需要三个,不是四个;您的#leftnav li ul a选择器已被#leftnav li a覆盖。


而且只是有点离题:意识到你正在使用命名的函数表达式,它可以是tricky on IE8 and earlier。我上面的最后一个例子消除了这一点,使其成为函数而不是声明

+0

如果OP能够澄清'.secitem-mid a'如何落入结构中,也许你可以做一些类似'#leftnav li:not(.secitem-mid)a'。它可以摆脱你的if语句,但它会使选择器更加丑陋。 – lbstr 2012-07-09 15:26:04

+0

@lbstr:是的,正如我所说在哪里以及是否需要重复取决于标记。 – 2012-07-09 15:27:28

+0

第二部分(用条件测试元素)正是我最终做的,除了我测试了父类,但我认为你写它的方式实际上更有效。谢谢! – 2012-07-09 16:26:24

0

ON方法也可以在没有委托的情况下使用。如果页面加载后不加内容下面的代码可以用来选择元素:

var elements = $('#contcont a, #leftnav li a, #leftnav li ul a, #mainarea-home a').not('.secitem-mid a'); 

而下面做一些事件处理:

$(elements).on('click', function() { 
    //do something 
});