2012-10-22 83 views
3

我有以下代码:jQuery attr似乎不返回字符串?

JS:

var test2 = ['RMrpi5Z8doc','JIPbUaqyYx0','MbjXYg0YRmw']; 

    $('tr').live('click', function(event){ 
     $($(this).attr('class').split(' ')).each(function() { 
     if (!((this == 'even') || (this == 'odd'))) { 
      alert(jQuery.inArray(this, test2)); 
      if (this == 'RMrpi5Z8doc') { 
       alert(this); 
      } 
     } 
     }); 
    }); 

HTML:

<table> 
    <tr class="odd RMrpi5Z8doc"> 
    <td>Kite</td> 
    <td>Just Like Vinyl</td> 
    <td>Audiotree</td> 
    </tr> 
    </table> 

inArray不匹配,并返回-1。与文字字符串匹配的if语句匹配。如果我用inArray中的文字替换,那也匹配。

我见过一篇文章说jQuery attr不会再返回字符串,但是查看jQuery网站上attr的文档似乎是这样说的。

也许我应该以完全不同的方式来谈论这个?

+1

你想达到什么目的? –

+2

*“也许我应该采取完全不同的方式?”*我建议不要使用class来存储这个值。你可以使用'data-id',或者如果它们是唯一的,'id'应该可以工作。 –

+2

虽然您正在考虑重新编写代码,但请注意'.live()'已被弃用一段时间了。如果你使用最新的jQuery,你应该使用'.on()'API。 – Pointy

回答

5

您使用的是错误的each。你的意思jQuery.each,通用迭代器:

$.each($(this).attr('class').split(' '), function ...); 

each,jQuery的实例的实例功能

$($(this).attr('class').split(' ')).each(function ...); // Wrong 

特别是发生了什么事是上面的这部分:

$($(this).attr('class').split(' ')) 

...调用$()与数组,它不会做你想做的事情。 :-)

+2

...或者只是'$ .each(this.className.split(''),function ...)' – raina77ow

+3

@ raina77ow:的确,我只做了很小的改动,但我绝对主张在属性可靠时使用直接反射属性('this.className'而不是'$(this).attr('class')'') (和'className'是)。 –

+0

另外'.attr(“class”)'在旧版本的IE中不起作用,我不这么认为。 – Pointy

0

这确实是一种类型不匹配。如果您切换到if (this === 'RMrpi5Z8doc') {,则第二次警报将不再触发。使用this.toString()将解决这个问题,将以下内容:

$.each($(this).attr('class').split(' '), function() { 
    //...etc. 

这是,顺便说一下,这样做的一个不寻常的方式。通常情况下,你会测试一类与hasClass方法:

$('tr').on('click', function() { 
    if ($(this).hasClass('odd')) { 
     //... 

而且,raina77ow笔记,还有:even:odd伪类:

$('tr').on('click', function() { 
    if ($(this).is(':odd')) { 
     //... 

通过这种方式,你可以用你的odd免除和even类完全。

1

我重构这个使用:

$(document).on('click', 'tr', function(){ 
    alert(jQuery.inArray($(this).attr('id'), test2)); 
} 

这似乎工作。我将类名移到了id字段,因为我没有将这些标识符用于任何样式表,它们确实是id。