为什么我不能在$ .each函数中使用`this`作为jQuery函数的字符串arg

时间:2012-09-19 15:24:03

标签: jquery each

我正在努力处理一些我正在研究的jQuery代码,并且我已经将问题缩小到这个简单的例子,这个例子不像我期望的那样:

的jsfiddle: http://jsfiddle.net/HypYT/


HTML

<div id="a">a: <span>A</span></div>
<div id="b">b: <span>B</span></div>​

的jQuery

jQuery.each( ["#a", "#b"], function(){
    alert(this);    // alerts "#a" and "#b"
    $(this).hide(); //not working
    $('#b').hide(); //working
});​

任何人都知道这里发生了什么?

4 个答案:

答案 0 :(得分:6)

如果在字符串(或其他基元)上调用函数,this将成为盒装对象 因此,typeof this将返回"object",而非"string" 这打破了jQuery。 (没有双关语)

你可以通过强制它回到字符串原语来解决这个问题:

$(String(this)).hide()

您可以通过编写

来解决任意基元的问题
var self = this.constructor(this);

但是,使用传递给.each()的第二个参数会更快,因为它会首先避免装箱。

答案 1 :(得分:6)

添加到SLaks回答,您可以使用传递给.each的arg。见下文,

jQuery.each( ["#a", "#b"], function(idx, el){
    alert(this);    // alerts "#a" and "#b"
    $(el).hide(); 
    //$('#b').hide(); 
});​

或者你可以做

var elToHide = $(["#a", "#b"].join()).hide();
$(elToHide.join()).hide()

DEMO http://jsfiddle.net/HypYT/2/

答案 2 :(得分:1)

你只需要这样做:

$('#a, #b').hide();

答案 3 :(得分:1)

每个函数都以这种方式工作(http://api.jquery.com/jQuery.each/)<< p>

$.each([52, 97], function(index, value) { 
  alert(index + ': ' + value); 
});

所以在你的情况下

jQuery.each( ["#a", "#b"], function(index, value){
    alert(value);    // alerts "#a" and "#b"
    $(value).hide(); //not working
});

解释是(取自链接) “也可以通过this关键字访问该值,但Javascript将始终将此值包装为Object,即使它是一个简单的字符串或数字值。”