关于焦点事件委托的Jquery

关于焦点事件委托的Jquery,jquery,Jquery,出于某种奇怪的原因,这个简单的函数似乎不起作用: $("body").on("focus", this, function(){ alert('d'); }) 此是输入或文本区域元素 如果我这样做: $(this).on("focus", function(){ alert('d'); }) 它可以在当前存在的元素上工作,但我不会在新创建的元素上触发事件,我做错了什么?您想要这样的东西: $(document).ready(function() { $("body")

出于某种奇怪的原因,这个简单的函数似乎不起作用:

$("body").on("focus", this, function(){
    alert('d');
})
是输入或文本区域元素

如果我这样做:

$(this).on("focus", function(){
    alert('d');
})

它可以在当前存在的元素上工作,但我不会在新创建的元素上触发事件,我做错了什么?

您想要这样的东西:

$(document).ready(function() {
    $("body").on("focus", 'textarea, input', function(){
       console.log('d');
    })​
});

如API所述,第二个参数是“一个选择器字符串,用于过滤触发事件的选定元素的后代。”

在您的例子中,我假设这是一个DOM元素。尝试将其更改为选择器以匹配输入或文本区域。这将导致每当
焦点
事件从与选择器匹配的元素冒泡到
正文
时调用函数。这应该适合您:

$("body").on("focus", "input, textarea", function() {
    alert('d');
});

有关
on()
的更多信息,请参见:

正如@grantman16所述,第二个参数必须是选择器

但是如果它是一个新创建的元素,为什么不使用它呢


显示更多的代码,这样我们就可以看到
这是什么
我真的需要看更多的代码,这没什么好做的。如果
这个
是一个输入字段,它会让我认为周围的函数本身就是一个事件处理程序?第二个参数必须是一个
选择器
,而不是
元素
。好的,这是可行的,但它针对的是我整个网站中的所有文本区域和输入,而我只需要针对一些特定的元素,而
这是一个DOM元素,我通过运行带有
每个
函数的小型jquery插件来获得它。您可以更改选择器,使其更加具体。例如,如果要侦听的元素都具有类
foo
,则可以使用
$(“body”).on(“focus”、“input.foo、textarea.foo”、函数{…})
,或者如果它们都在id为bar的元素中,
“#bar input,#bar textarea”
应该可以实现这一功能。如果还没有这样的方法来选择它们,你可以在创建输入和文本区域时添加一个类,并在选择器中使用它们。我真的很惊讶,我必须使用选择器而不是元素本身,这使得同时处理数百个类时事情变得更加困难。。。但是它似乎在工作,所以我想我现在必须坚持使用它
,但正如您在问题中所指出的,这将仅适用于
。您只需将处理程序绑定到每个新创建的元素。
​va​r input = $("<input>");
input.focus(function() {
  alert('d');
});
$("body").append(input);​
​
var input = $("<input>").addClass("lastInput");
$("body").on("focus", "input.lastInput", function() {
  alert('d');
});
$("body").append(input);
​