为什么jQuery每次输出相同的rel?

时间:2012-07-17 14:11:25

标签: javascript jquery html

所以基本上这是我的剧本:

http://jsfiddle.net/JJFap/42/

代码 -

jQuery(document).ready(function() {
    var rel = new Array();
    var count = 0;
    jQuery(".setting").each(function() {
        rel[count] = [];
        if(jQuery("span").attr("rel")) {
            rel[count].push(jQuery("span").attr("rel"));
        }  
        console.log(count);
        count++;
    });               
    jQuery("body").text(rel);
    console.log(rel);
});​

<div class="setting">
    <span rel="Variable">Variable</span>
    <span rel="Item">Item</span>
    <span rel="Something">Something</span>
</div>
<div>
    <span rel="Smth">Smth</span>
    <span>Sec</span>
</div>
<div class="setting">
    <span>Second</span>
    <span rel="first">First</span>
    <span rel="Third">Third</span>
</div>

我的问题是,为什么它显示变量,变量?

我希望它能显示变量,首先,但我无法做到。

基本上我想要实现的是创建新数组,其中插入每个div.setting span元素和rel属性数组。

所以基本上在这个例子中它应该输出 -

Array (

   Array[0] => "Variable","Item","Something";

   Array[1] => "first","Third";

)

希望你明白我的意思:)。

修改

在我的另一个例子中,我尝试添加jQuery(“span”)。每个(function()...首先在每个函数内部,但它输出两个完整的所有span元素的数组与rel。我不能有不同每个div元素的类/ ids,因为它们都具有相同的类。

4 个答案:

答案 0 :(得分:5)

jQuery('span')将在您的网页中找到所有范围,然后提取第一个rel属性。由于您没有为该跨度搜索提供上下文,因此您将始终在文档中获得相同的#1范围。

答案 1 :(得分:4)

你应该使用这个:

    jQuery('span',this).each(function() {
        rel[count] = [];
        if (jQuery(this).attr("rel")) {
            rel[count].push(jQuery(this).attr("rel"));
        }
        console.log(count);
        count++;
    })

而不是:

    rel[count] = [];
    if(jQuery("span").attr("rel")) {
        rel[count].push(jQuery("span").attr("rel"));
    }  
    console.log(count);
    count++;

http://jsfiddle.net/mblase75/JJFap/52/

诀窍是使用第二个.each循环遍历每个span内的所有<div class="setting">标记 - 您的原始代码正在使用jQuery("span"),这只会抓住每次都是文档中的第一个span标记。

答案 2 :(得分:1)

.each()方法中,您有几次此代码:jQuery("span").attr("rel")。该代码只是在页面上查找所有 span标记。当你将它粘贴到.push()方法中时,它只是推送集合中第一个jQuery对象的rel属性的值。相反,你想做$(this).find('span')之类的事情。这将导致它查找作为span方法迭代的当前.setting元素的后代的任何.each()标记。

答案 3 :(得分:1)

除了已经说过的内容之外,您还可以在使用count时摆脱push()jQuery.fn.map()以及摆脱if时的情况将[rel]添加到选择器:

jQuery(document).ready(function() {
    var rel = [];
    jQuery(".setting").each(function() {
        rel.push(jQuery(this).find('span[rel]').map(function() {
            return this.getAttribute('rel');
        }).get());
    });               
    jQuery("body").text(rel);
    console.log(rel);
});