在对同一元素使用.addClass()后修改.haverage()
Modifying .hover() after using .addClass() on the same element
所以我尝试使用.haverage()方法,该方法只在悬停的元素没有特定类的情况下执行某些操作。如果我将类添加到HTML中有问题的元素中,效果会很好。但是假设我有一个click事件,它使用.addClass()来使用jQuery添加类。然后,hover()方法将忽略已添加的类。散漫够了。这是代码。
$('.foo:not(.bar)').hover(function() {
someCrap(); //when hovering a over .foo that doesn't also have the class .bar, do someCrap
}
$('.foo').click(function(){
$(this).addClass('bar'); //after the element .foo gets another class .bar, the hover event written earlier continues to work, WTF
})
你们知道吗?
.hover()
仅向已创建的元素添加事件。您还需要使用.on()
为未来元素创建事件。这意味着您还需要设置父级。最好父级应尽可能靠近应具有鼠标事件的子级$('#parent').on({
mouseenter : function() {
"use strict";
// Do something
},
mouseleave: function() {
"use strict";
// Do something
}
}, ".foo:not(.bar)");
运行$(selector).hover(fn);
时,任何与选择器匹配的元素都将绑定事件。如果您要添加/更改/删除选择器的某些内容,这些内容稍后会使该元素不再匹配,则事件不会在意,因为它已经绑定。
有几种方法可以处理这一问题,这实际上取决于应用程序中JavaScript的数量和用例的具体情况。
1) 您可以使用事件委派,它利用JavaScript事件气泡的方式,允许您将事件绑定到页面特定部分的父元素,并在事件发生时执行逻辑操作-这非常有用,原因有几个。首先,假设你有一个包含100条记录的表,以及一个包含edit
类的链接,当有人点击它时,它应该会激发一个特定的JavaScript函数。如果你这样做,$('a.edit').click(fn);
jQuery最终会将100个不同的事件绑定到各个元素。这可能会使您的应用程序在较旧的机器/浏览器中举步维艰。其次,它使得当事情发生动态变化时(或者你向表中添加了一个新行,或者从链接中删除了编辑类,因为你不再想允许特定的行是可编辑的),你的事件足够聪明,可以知道发生了什么,并且仍然有效。在jQuery中,您可以使用.on()
函数来完成此操作。阅读文档。如果您有早期版本的jQuery,您可能必须使用.delegate()
,并且如果您正在运行一些非常旧的jQuery函数,您正在寻找.live()
。
2) 如果您的应用程序相对较小,一种更简单的方法是简单地将事件绑定到所有.foo
元素,并在事件本身中检查该元素当前是否具有bar
类,如果没有则继续。
我认为它更像:
$( '.foo' ).hover(
function() { if ( $( this ).has( '.bar' ) ) {} else { // do something } },
function() { if ( $( this ).has( '.bar' ) ) {} else { // do something } }
);
- 在Safari执行javascript之前对其进行修改
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 用Javascript修改内部标记的CSS规则
- 绑定Range输入以修改样式
- 可以从Chrome扩展修改窗口对象吗
- jQuery滚动器插件修改
- 将函数从onclick修改为onload
- jQuery UI自动完成-修改问题
- Javascript日期修改
- 如何通过JQuery修改样式属性
- 使用treewalker修改表
- Angularjs:修改js中的作用域,稍后在页面中使用
- 在编译阶段后创建新的DOM树,或者继续使用原始修改的DOM
- 修改控制器AngularJS的全局值
- 修改数据后,setState不会触发重新渲染
- 通过sdk/system/events在修改请求观测器上测试http
- GWT:有没有一种方法可以修改GWT在编译中使用的Cast.java文件
- 在多个元素上使用jquery插件,只需稍作修改
- 为什么我从浏览器修改html/js时会多次发送ajax请求
- 在对同一元素使用.addClass()后修改.haverage()