1

我正在为我正在处理的一些 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

4 回答 4

6

如果在字符串(或其他原语)上调用函数,this则成为装箱对象。
typeof this会因此回归"object",不会"string"
这打破了 jQuery。(没有双关语)

您可以通过将其强制回字符串原语来解决此问题:

$(String(this)).hide()

您可以通过编写为任意原语修复此问题

var self = this.constructor(this);

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

于 2012-09-19T15:25:36.730 回答
6

添加到SLaks答案中,您可以使用传递给.each. 见下文,

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()

演示:http: //jsfiddle.net/HypYT/2/

于 2012-09-19T15:27:08.863 回答
1

你只需要这样做:

$('#a, #b').hide();
于 2012-09-19T15:27:25.780 回答
1

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

$.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 将始终将 this 值包装为 Object,即使它是简单的字符串或数字值。”

于 2012-09-19T15:31:27.617 回答