在动态创建的元素上返回false
我正在尝试阻止动态创建的元素上的事件。
我尝试了几种方法但没有效果。
聋人,点击包含该类的div打开一个菜单,我想禁用它。
这是我的代码(请注意我使用的是jQuery 1.6.4,因此我无法使用“on”方法)。
$(function() { $( document ).delegate( "span.highlight_mkt", "click", function() { return false; }); });
我也尝试使用“实时”方法,但没有任何成功。
任何帮助将非常感激。
也许这个链接可以帮助你 – > 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 */ });
这个应该停止事件传播:
$(function() { $( document ).delegate( "span.highlight_mkt", "click", function(e) { e.preventDefault(); e.stopPropagation(); return false; }); });
我从你的问题中理解的是你在html表单中使用highlight_mkt类,并使用选择器或文档附加了click事件。 您正在使用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或其他根元素时,它会降低性能。 你可以在这里阅读它。
由于所有.live()事件都附加在document元素上,因此事件在处理之前会占用最长和最慢的路径。
你可以在这里看到一些例子。