2010-11-11 47 views
0

我有两个函数:一个在单击按钮时创建一个新的<textarea>,另一个函数在单击时(或模糊,改变等)第二个函数根据类名选择元素。看起来第二个函数只适用于加载页面时存在的那些匹配元素,但它不会在任何新创建的元素上激活。任何人都可以找出为什么以及如何解决这个问题?您会在下面找到代码。谢谢。 --JakejQuery问题:函数将不会在新创建的HTML元素上工作

$('#add').click(function() { 
    $(this).before("<textarea class='test'></textarea>") 
}) 

$('.test').blur(function() { 
    alert('just a test') 
}) 
+3

YALQ - 又一个生活()问题。 – Hogan 2010-11-11 19:50:24

回答

5

您创建的textarea不在当时jQuery将操作分配给标记为.test类的元素。你需要live()函数来根据需要进行工作。

$('.test').live('blur', function() { 
    alert('just a test') 
}); 

现在标记。测试任元会自动无论在创建时绑定的模糊指定的函数。

+0

你输入你的答案比我快:P – MLefrancois 2010-11-11 19:48:44

+0

其他解决方案是使用委托()或绑定事件处理程序到新创建的元素(这可能是好的,如果只添加一个'textarea') – 2010-11-11 19:49:40

+0

@MLefrancois:怀疑它,我不要打字太快。我*偶尔会在别人面前发现问题,弥补我的打字难题。 :) – 2010-11-11 19:51:33

1

您可以直接将其绑定:

$('#add').click(function() { 
    $(this).before("<textarea class='test'></textarea>").prev().blur(function() { 
     alert('just a test'); 
    }); 
}); 

或场所使用jQuery's .delegate() method放置处理器上的#add父。

$('#add').click(function() { 
    $(this).before("<textarea class='test'></textarea>") 
}).parent().delegate('.test','blur',function() { 
    alert('just a test'); 
}); 

这是比使用.live()更高效的方法。