2011-10-07 17 views
0
var selector = "ul.lower-menu li a[innerText=\"" + PanelSettings[tab_name_key] + "\"]"; 

我想获得水平菜单选项卡的innerText属性设置为以前存储的值。jQuery属性选择器 - 我做错了什么?

的配置值存储这样的:

PanelSettings[tab_name_key] = $("ul.lower-menu li:first > a").prop("innerText"); 

它实际上是有它总是具有正确的价值。

我从jQuery没有得到任何东西 - 我在做什么明显错误吗?

编辑:我使用jQuery 1.6.4

+0

的“的innerText”属性不能在这样的选择中使用,据我所知, 。该选择器语法用于**属性**,而不是属性。 – Pointy

回答

4

是的,你做错了什么。属性选择器选择具有某个属性集的元素。 innerText属性,而不是一个属性 - 事实上,您可以通过使用prop来设置它。

您有两种选择。一种是使用:contains选择:

"ul.lower-menu li a:contains(" + PanelSettings[tab_name_key] + ")" 

然而,这会选择foobar如果你问foo。更好的选择是做过滤自己,用filter

var selector = "ul.lower-menu li a"; 
var els = $(selector).filter(function() { 
    return $.text([this]) === PanelSettings[tab_name_key]; 
}); 

此只选择其文本内容相同,若设置的元素。

也请注意,正如Diodeus所说,您应该使用text()而不是prop('innerText')

+0

'$ .text([this])'?你肯定是指'$(this).text()' – Einacio

+0

谢谢!我不知道属性和属性之间的区别。我需要读一些关于它的东西。 – kubal5003

+0

@Einacio'$ .text([this])'是一个没有记录但快速执行'$(this).text()'的方法,因为它不涉及不必要的jQuery选择。 – lonesomeday

1

相反的:

.prop("innerText"); 

使用:

.text() 
+0

很高兴知道这一点,但这并不能解决问题。 – kubal5003

+0

这是更好的实践评论,关于选择器问题的答案 – Einacio

+0

然后问题可能是选择器。看看你是否得到任何结果:alert($(“ul.lower-menu li:first> a”)。length) –

0

很好,这是一个属性选择,而不是一个属性选择器。你不能使用这样的选择器。使用.filter()与功能()变体相反

2

你可能想尝试filter而不是属性选择,恕我直言,这对滥用边界在这种情况下:

var selector = "ul.lower-menu li a"; 
var $links = $(selector).filter(function() { 
       return $(this).text() == PanelSettings[tab_name_key]; 
      }); 
+0

感谢您的回答。 +1,但是寂静的回答更彻底。 – kubal5003