2010-11-10 56 views
2

我写了很多,我现在用的是同样的选择,但它们的片段例如JQuery的变量选择没有字符串连接

$('#menu > div.container a') 

$('#menu span.highlight') 

代码有什么方法在变量中有'#menu'并用它来代替?我对字符串连接的问题是,它需要对其使用极其严格,因为即使是一个单一的缺失空间也会造成混乱。我宁愿做的是类似下面的东西:

var menuSelector = '#menu'; 
$('{menuSelector} > div.container a') 
$('{menuSelector} span.highlight') 

我检查了documenation和这样的功能并不存在。实现这种功能的问题是jQuery需要在调用者的上下文中进行评估。这是可能的JavaScript内?其次,我可以自己去实现这个功能吗?

回答

1

不确定:

var menuSelector = '#menu'; 
$(menuSelector + ' > div.container a') 
$(menuSelector + ' span.highlight') 

注意,变量的值与使用+运营商之外刺痛。

你应该在的情况下,每行你要运行如下脚本更快性能的末尾添加;,这是一般好的做法

var menuSelector = '#menu'; 
$(menuSelector + ' > div.container a'); 
$(menuSelector + ' span.highlight'); 

更多信息:

4

这应该工作

var menuSelector = '#menu'; 
$(menuSelector + ' > div.container a') 
$(menuSelector + ' span.highlight') 
4

如果你想避免字符串连接,你做到这一点使用,

var menuSelectorObj = $('#menu'); 
$('div.container a',menuSelectorObj); 
$('span.highlight',menuSelectorObj); 
+0

第二条语句返回所有的div。任何嵌套级别的容器。他想要直接的孩子。 – 2010-11-10 12:19:02

+0

然后他可以尝试与eq或firstchild也。 $('div.container:eq(1)a',menuSelectorObj); OR $('div.container:first-child a',menuSelectorObj); – 2010-11-10 12:23:01

6

使用节点缓存,以便您评估节点更快(你开始从缓存上下文搜索)

$menu = $('#menu'); 

$menu.children('div.container a') 
$menu.find('span.highlight'); 
0

如果你想Concat的字符串 - 确保您可以:

var prefix = '#menu'; 

$(prefix + ' span').... 

但是,如果你想查询中'#menu'节点的儿童DOM元素 - 更好的缓存这个节点,并以此为出发点:

var $menu = $('#menu') //very fast - uses native getElementById() 
$menu.find('.highlight') //you do not need to specify <span>. 
         //only if you _really_ need to find <span class="highlight"> 

$('.highlight', $menu) //same as above - its shortcut for $elem.find() 

$menu.children('.container').find('a') //not tested but maybe little faster than 
             //child selector you use - '#menu > div.container a' 

HTH