2012-04-06 64 views
1

我的代码:Dojo查询后裔?

var parent = document.createElement('div'); 
var pen = document.createElement('div'); 
var dog = document.createElement('div'); 
dog.className = "dog"; 
pen.appendChild(dog); 
parent.appendChild(pen); 
dojo.query("> *", parent).forEach(function(node){ 
    if(node.className == "dog")alert('bark'); 
}); 
dojo.query("> .dog", parent).forEach(function(node){ 
    alert('bark'); 
}); 

我没有得到警报 “汪汪” S。我究竟做错了什么?

+0

你可以发布HTML吗?此外,我会使用'dojo.hasClass'而不是'className' – fncomp 2012-04-06 02:56:59

+0

我通常使用domClass.contains,但在这种情况下没有区别。也没有HTML。 – Derek 2012-04-06 03:00:07

+0

我会把生成的dom算作HTML,但我想你是对的。至于'domClass',我想我假设如果页面顶部没有'require/define',那么这个人使用的是旧版本的Dojo。我的错。 – fncomp 2012-04-06 03:25:45

回答

0

你的问题是,生成的HTML不匹配选择:

<div title="parent"> 
    <div title="pen"> 
     <div class="dog"> 
     </div> 
    </div> 
</div> 

因为> *将只匹配pen> .dog将不匹配。你可以改变这些到:

var parent = document.createElement('div'); 
var pen = document.createElement('div'); 
var dog = document.createElement('div'); 
dog.className = "dog"; 
pen.appendChild(dog); 
parent.appendChild(pen); 
dojo.query("> * > *", parent).forEach(function (node) { 
    if (node.className == "dog") { 
     alert('bark'); 
    } 
}); 
dojo.query("> * > .dog", parent).forEach(function (node) { 
    alert('bark'); 
}); 

这里有一个小提琴:http://jsfiddle.net/pTqmL/

编辑

或者,如果它只是需要的parent内:基于

dojo.query("*", parent).forEach(function (node) { 
    if (node.className == "dog") { 
     alert('bark'); 
    } 
}); 
dojo.query(".dog", parent).forEach(function (node) { 
    alert('bark'); 
}); 

您评论,我认为你可能忽略/不知道的核心内容是该查询的范围在父项的范围内。

+0

查询函数没有字符串,它尽可能深地获取所有的后代?或者我们是否必须手动为每一层子孙手动“>”? – Derek 2012-04-06 03:45:08

+0

您也可以排除>。查询只会查看父项。 – fncomp 2012-04-06 03:53:39

+0

我看,thx 4char – Derek 2012-04-06 03:57:58