jQuery对象的意外行为

时间:2011-09-01 23:09:10

标签: jquery

我的代码位于下方,此处:http://jsfiddle.net/fRpCy/

var input = [];
input.push($('input'));

$(input).live('keydown', function (event) {
    console.log('You have pressed a key!');
});

我希望这段代码能够响应控制台中的按键。出于某种原因,它没有。这段代码有什么问题? (注意:我知道如何解决它,我只是不知道它有什么问题!)

3 个答案:

答案 0 :(得分:2)

您的代码期望$()函数将jQuery对象数组作为参数。你基本上有这个:

$([$('input')])

this jQuery documentation,我认为它不支持。 jQuery函数将采用:

  • 选择字符串
  • 元素
  • 元素数组
  • 一个jQuery对象
  • 一些HTML
  • 一个功能

需要注意的是,它不会占用jQuery对象数组。元素数组与jQuery对象数组不同,但如果您真的想要使用makeArray()方法从jQuery对象获取元素数组。

有几种方法可行:

最简单的是不保存任何中间值:

$('input').live('keydown', function (event) {
    console.log('You have pressed a key!');
});

这个实际的DOM元素到输入数组中,所以输入数组是jQuery函数支持的一种数组(尽管我认为没有理由实际使用这个代码):

var input = [];
input.push($('input').get(0));

$(input).live('keydown', function (event) {
    console.log('You have pressed a key!');
});

或者,如果有多个输入值,只需保存jQuery对象以供将来使用:

var inputs = $('input');

inputs.live('keydown', function (event) {
    console.log('You have pressed a key!');
});

或者,如果你想要一个元素数组,你可以这样:

var input = $('input').makeArray();

$(input).live('keydown', function (event) {
    console.log('You have pressed a key!');
});

或者,如果您真正拥有的是一组jQuery对象,并且您希望将它们组合到一个新的单个jQuery对象中,这是一种方法:

// var input is an array of jQuery objects you already have

var allElements = [];   // new empty array of DOM elements
// iterate over array of jQuery objects getting array of DOM elements from each
for (var i = 0; i < input.length; i++) {
    allElements = allElements.concat($.makeArray(input[i]));
}
$(allElements).live(...)

或者,更简单的方法:

var items = $.map(input, function(item, index) {return($.makeArray(item));});
$(items).live(...)

或者,现在我在jQuery对象上找到了.add()方法:

var $items = input[0];                      // grab first jQuery object in array
for (var i = 1; i < input.length; i++) {
    $items.add(input[i]);                   // add other ones onto it
}
$items.keydown(function() {...});

顺便说一句,我发现DOM元素数组不能与.live('keydown')一起使用。我不知道为什么。它适用于:

$(items).keydown(...)

并且,由于您已经存在一个DOM元素数组,因此无论如何都没有理由使用.live()。您可以使用.keydown()

jsFiddle在这里工作:http://jsfiddle.net/jfriend00/qen2m/

答案 1 :(得分:0)

非常确定你需要添加.each来遍历对象数组

jQuery.each(arr, function() {
  $(this).live('keydown', function (event) {
    console.log('You have pressed a key!');
    });

});

答案 2 :(得分:0)

看起来你正在创建一个包含单个元素的数组(var input)。元素0包含一个数组 - 由$('input')返回 - 因为你的页面几乎肯定有多个输入。

你能试试吗

$('input').live('keydown', function (event) {
    console.log('You have pressed a key!');
});

(未测试的)