在动态创建的元素上返回false

时间:2014-01-03 08:01:34

标签: javascript jquery dynamic delegates live

我正在尝试阻止动态创建的元素上的事件 我尝试了几种方法但没有效果。

嘲讽,单击包含该类的div会打开一个菜单,我想禁用它 这是我的代码(请注意我使用的是jQuery 1.6.4,所以我无法使用“on”方法)。

    $(function() {
    $( document ).delegate( "span.highlight_mkt", "click", function() {
        return false;
    }); 
}); 

我也尝试使用“实时”方法,但没有任何成功。

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

也许此链接可以帮助您 - > preventDefault

$(document).delegate("span.highlight_mkt", "click", function (e) {
    e.preventDefault();
    /* your code here */
});

修改

你试过这个吗?

$('span.highlight_mkt').live("click", function (e) {
    e.preventDefault();
    /* your code here */
});

答案 1 :(得分:0)

这个应该停止事件传播:

   $(function() {
    $( document ).delegate( "span.highlight_mkt", "click", function(e) {
        e.preventDefault();
        e.stopPropagation();
        return false;
    }); 
}); 

答案 2 :(得分:0)

我从您的问题中了解到,您在html表单中使用highlight_mkt类,并使用选择器或文档附加了单击事件。您正在使用Ajax加载或使用相同的类名动态创建其他span。

因此,为了防止动态创建的元素上的事件,您可以使用带有容器名称的.die()函数来附加动态创建的元素,如下所示:

$('container_selector span.highligh_mkt').die('click');

在此方法中,click事件将仅触发未动态附加的元素。 如果我理解错误,请澄清您的问题。

您所做的是使用.live()jquery函数将事件处理程序附加到document元素或全局容器。所以这不是一件好事。我稍后会解释。

$('body').live('click','span.hihligh_mkt', function(e){
//Your code here. Which is doing some cool staff i believe :)
});

但是,如果您只想阻止动态创建的元素,请执行以下操作:

$('body').live('click', 'span.some_class', function(e){

    // This part is needed in order to check weather it is attached dynamically
    // or it is predefined html objects
    if($(e.target).closest('#some_container').length==0)
    {
      //Your code here. Which is doing some cool staff i believe :) 
    }
});

所以在上面你将只检查,事件整流元素是动态附加到容器元素还是部分原始html。当然,如果你将使用事件,这个方法将被单独附加到元素,如DOM准备好后,就可以避免使用这种方法。

$('span.hihligh_mkt').live('click', funtion(e){});

在这种情况下,只有在DOM中存在的元素才会获得处理程序。其他动态附加的元素将不具有事件处理程序。除非你没有深入克隆span元素。

当你将事件处理程序附加到body或其他根元素时,另一件事就是这样,它会降低性能。你可以阅读它here

  

由于所有.live()事件都附加在文档元素,事件   在处理它们之前采取最长和最慢的路径。

<强> You can see some example here.