所以我在表单中有一类文本输入。附在他们身上的是一个.live点击事件:
$('.post-deal-inputs').live('click', function(e) {
$(this).val('');
$(this).unbind(e);
});
这是为了清除单击时的文本,但只清除一次,以便不删除新输入的用户数据。但是,由于某些原因,这不起作用,它会在后续点击中不断清除文本。我也试过
.one('focus', function(e))......
但这甚至没有发射。 有没有办法,没有switch语句检查默认文本等,以确保文本只清除一次?
答案 0 :(得分:2)
附带live的事件处理程序不会被解除绑定;它们已被die
所以试试:
$('.post-deal-inputs').die();
或者,如果你已经附加了其他事件,那么
$('.post-deal-inputs').die("click");
请注意,这会终止与此选择器匹配的所有事件。如果您只想从特定项目中删除它,那么我会切换到bind
unbind
模型。 请注意,这不适用于动态添加的内容
请注意,如果您使用的是jQuery 1.7,处理事件的首选方式是使用on(以及off)
由于.live()
正在document
级别执行事件委派,如果您使用.die()
,它当然不再适用于与选择器匹配的任何元素。
如果您只想停止与原始选择器匹配的一个元素的功能,只需更改该元素的类,使其不再匹配。
$('.post-deal-inputs').live('click', function(e) {
$(this).val('');
$(this).removeClass('post-deal-inputs')
.addClass('post-deal-inputs-clicked');
});
答案 1 :(得分:0)
难道你不能做这样的事情,尽管删除绑定函数会更好:
//needs to be run when elements exists in DOM
$('.post-deal-inputs').each(function() {
$(this).data('value', $(this).val()); //get the text before clicked
});
$('.post-deal-inputs').live('click', function() {
if {$(this).val() == $(this).data('value')) { //compare it to current text
$(this)val('');
}
});
答案 2 :(得分:0)
.live()
和.die()
可能不是您想要的。 live
将一个事件附加到document
节点,当来自与给定选择器匹配的元素的事件冒泡时,该事件将触发(请参阅http://api.jquery.com/live/了解它是如何工作的)。真的只有一个事件,所以如果你确实删除它(或者只让它一次点火)它就会停止所有的表单元素。
如果您在页面上有所有文本输入,则可以执行
$('.post-deal-inputs').click(function() {
$(this).val('').unbind('click');
});
如果你真的想要使用事件委托(因为当你想绑定事件时你的所有表单元素都不在页面上)那么我认为你不得不求助于使用.data()
或其他方式或标记已经清空的元素,如下所示:
$('.post-deal-inputs').live(function() {
if (!$(this).data('emptied'))
$(this).val('').data('emptied', true);
});
如果您愿意,也可以使用.data()
和.hasClass()
,而不是使用.addClass()
。真正需要的是将输入标记为已清空并检查以确保其未被清空两次的某种方式。
同样正如Adam Rackis所说,如果你能够使用jQuery 1.7,你应该使用.on()
代替.live()