2

编辑:请参阅下面的 John S. 回答,了解这个明显问题背后的真正问题!

我正在使用 sharepointplus 构建动态表达式。它应该返回一个逻辑值,它就是这样做的。我已经把它移到一个变量中,因为我经常使用它(引用它作为 if 的条件)。问题是,显然加号正在停止其余代码的处理。这是两个错误的片段(控制台中没有错误):

for (var i=0; i < data.length; i++){
var category_equal_test = ((data[i].getAttribute("category")) == (data[i+1].getAttribute("category")));

或者

for (var i=0; i < data.length; i++){
var j=i+1;
var category_equal_test = ((data[i].getAttribute("category")) == (data[j].getAttribute("category")));

他们之间真的没有区别,但有一刻我以为我会逃脱惩罚。这是一段不会中断处理的代码片段(但当然这段代码毫无意义):

for (var i=0; i < data.length; i++){
var category_equal_test = ((data[i].getAttribute("category")) == (data[i].getAttribute("category")));

在这两种损坏代码的情况下,console.log(category_equal_test) 输出我正在寻找的一组逻辑值。

我认为这是我的某种无能,所以请赐教!谢谢。

4

2 回答 2

1

发生这种情况是因为在循环的最后,data[i + 1]变成undefined并且你不能做undefinedgetAttribute,所以它抛出一个TypeError

var x; x.getAttribute('foo');
// TypeError: Cannot call method 'getAttribute' of undefined

为了解决这个问题,让你的循环提前结束一次迭代;

for (var i = 0; i < data.length - 1; i++) {
    // ...
}

至于为什么您在控制台中没有收到错误,代码必须包含在try..catch某个地方。

于 2013-08-17T22:24:11.100 回答
0

这是我最终使用的。我希望这对某人有用!

function osDrawPageMenuLeft() {
var spquery = "";
$SP().list("menu","/content").get({fields:"name, link, Level, Order, category"},function(data) {
    spquery += "<ul>";
    var j=0;
        for (var i=0; i < data.length; i++){
            if( i < data.length-1){
                j=i+1;
                var category_equal_test = ((data[i].getAttribute("category")) == (data[j].getAttribute("category")));
            }
            else{
                category_equal_test=false;
            }
            var link_empty_test = (data[i].getAttribute("link") == null);
            var header = data[i].getAttribute("name");
            var header_link = "<a href='" + data[i].getAttribute("link") + "'>" + header + "</a>";
            var row = "<li><a href='"+data[i].getAttribute("link")+"'>"+data[i].getAttribute("name")+"</a></li>";
            if(data[i].getAttribute('Level') == 'Header'){
                if (((category_equal_test)&&(!link_empty_test))){
                    spquery += "<li>" + header_link + "<ul>";
                }
                else if(((!category_equal_test)&&(!link_empty_test))){
                    spquery += "<li>" + header_link + "</li>";
                }
                else if(((category_equal_test)&&(link_empty_test))){
                    spquery += "<li>" + header + "<ul>";
                }
                else if(((!category_equal_test)&&(link_empty_test))){
                    spquery += "<li>" + header + "</li>";
                }
            }
            else{
                if((!category_equal_test)){
                spquery += row + "</ul></li>";
                }
                else{
                spquery += row;
                }
            }
        };
    spquery += "</ul>";
    $('#newleftNav').append(spquery);
});
}
于 2013-08-18T20:46:10.680 回答