2011-04-24 68 views
0

我想附加一个onChange回调到div #dim下的所有输入元素。它选择了所有3个输入元素,但返回异常:jQuery设置回拨子元素

Uncaught TypeError: Object 0 has no method 'change' 

这可能是因为x可能不是一个jQuery对象。我将如何完成这项工作?

function registercb() { 
    var sel = $("div.dim > input"); 
    for (x in sel) { 
     x.change(function() { 
      dosomething(); 
     }); 
    } 
} 

回答

1

你可以简单地做:

function registercb() { 
    $("div.dim > input").change(dosomething);    
} 

几个看点:

  • 内部的迭代(不使用这个,看到下一个点)x是DOM元素,而不是具有.change()方法的jQuery对象,您需要将它包装在像$(x)这样的jQuery对象中,但是这不是公司的直接解决方案在这里。
  • 不要使用for(...in...)循环来迭代一个对象(一个jQuery对象是阵列状),即类型的循环是用于枚举
  • 大多数jQuery函数(差不多都是)运行在多个元素上,所以只需在集合上运行它即可影响所有元素,.change()就是其中之一。
  • 在情况下,你需要循环,检查.each(),因为它会让你的生活变得更轻松,不使用此这里,这只是它会是什么样子的例子:

例子:

function registercb() { 
    $("div.dim > input").each(function() { 
     $(this).change(dosomething);    
    }); 
} 
+0

哇!很好的答案..谢谢你的额外知识.. – bsr 2011-04-24 13:30:47

0

假设你'dim'div有一个ID,而不是一类的dim,你可以简单地这样做:

$("#dim > input").change(function() { dosomething(); }); 

Working example

在你你指的.dim代码是指#dim,而文本 - #选择通过ID和.选择按类别,所以如果你的DIV的格式为<div id="dim">那么你不会找到任何匹配的元素与div.dim作为您的选择。

1

您不必遍历元素。您可以将jQuery对象看作持有集合。当你这样做:

var sel = $("div.dim > input"); 

这意味着sel有它的所有投入要素,这样的话,当你运行像变化的方法(),它会影响到所有集合中的元素。因此,你可以做这样的事情:

function registercb() { 
    $("div.dim > input").change(function(){ 
    dosomething(); 
    }); 
} 

奖励知识:现在你的问题是,当你在做for(x in sel)你是jQuery对象本身,你不希望在得到很多东西。如果您在Chrome中运行下面的代码,你会看到它输出了很多意想不到的东西:

for(x in sel){ 
    console.log(x); 
} 

相反的jQuery有each,让你遍历所有的事情,你想:

sel.each(function(index, item){ 
    console.log(item); 
}); 

你可以甚至在其他事情上使用它,这真的很方便!

$([1,2,3]).each(function(index item){ 
    console.log(item); // 1,2,3 
})