如何从evaluate方法返回值数组

时间:2013-02-19 20:45:05

标签: jquery casperjs

我正在使用casper.evaluate()从页面中获取数据数组。但是它似乎无法返回一个数组(而返回的字符串完美无缺)。可能是什么问题?

澄清:评估中的代码是:

function(){ 
    return $('#id a').map(function(i, e) { 
        return $(e).attr('href'); 
    }).get(); 
}

调用结束时的.get()意味着获取数组而不是jQuery对象。顺便说一下,我确信页面上有jQuery。

3 个答案:

答案 0 :(得分:3)

你不需要jQuery:

casper.evaluate(function() {
    return [].map.call(__utils__.findAll('#id a'), function(node) {
        return node.getAttribute('href');
    });
});

答案 1 :(得分:0)

我相信.get()是不必要的。

没有.get()的返回确实形成了一个非常好的数组,看看这个jsfiddle示例 http://jsfiddle.net/YFsRw/

r = function(){ 
    return $('#id a').map(function(i, e) { 
        return $(e).attr('href'); 
    }); 
}

var p = r();

// p servers as a nice array :)
for (i = 0; i < p.length; i++) {
    document.write(p[i] + "<br/>");
}

答案 2 :(得分:0)

.toArray()是您正在寻找的。
  

.toArray() [返回:数组]

     

描述:以数组的形式检索jQuery集中包含的所有元素。

function(){ 
    return $('#id a').map(function(i, e) { 
        return $(e).attr('href'); 
    }).toArray(); 
}

另外,还有$.makeArray(),它在更广泛的层面上工作,不仅仅是 jQuery元素集,并以静态方式调用

function(){ 
    return $.makeArray(
        $('#id a').map(function(i, e) { 
            return $(e).attr('href'); 
        })
    ); 
}

(但 .toArray() 在这种情况下似乎更合适更清晰。)


有关两者的比较,请参阅this S.O. answer