这是在JavaScript中使用两个循环的正确方法吗?

时间:2015-09-05 20:54:52

标签: javascript jquery for-loop

我试图在这里检查两件事,有两个不同的for loops。如果一个元素有attribute,那就有效!第二个循环应检查alt标记是否实际为空。我想将第一个iterator值传递给第二个将调度第二个循环。但这不起作用!有人可以帮我解决这个问题吗?

function altChecker() {
    var doc = document,

        getStartedBtn = doc.getElementById('getStartedBtn');

        EventUtility.addHandler(getStartedBtn, 'click', function() {

        var all = doc.getElementsByTagName("IMG");

        console.log('success!');

        for (var i = 0, max = all.length; i < max; i++) {
            if (all[i].hasAttribute('alt')) {
                console.log('Yes, this has a ' + all[i].nodeName + ' tag!');
            } else {
                console.log('Sorry ' + all[i].nodeName + ' tag, doesn\'t have an alt tag!');
            }

        }
        for (var j = i, max2 = all; j < max2; j++) {
            if(! $(all[j]).attr('alt')){
                console.log('This is empty');
            } else {
                console.log('This aint');
            }
        };

    });
}

4 个答案:

答案 0 :(得分:1)

你可以在一个循环中完成。检查属性是否存在后检查alt的值。

请注意,altimg标记的标准属性,但不是div。在示例中,我使用.getAttribute作为非标准属性。如果我使用img标记,则.getAttribute可以替换为.alt,因为这是标记的标准属性。见评论。

function altChecker() {
  var out = [];
  var doc = document;
  var all = doc.getElementsByTagName("div");

  for (var i = 0, max = all.length; i < max; i++) {
    var id = all[i].id;
    if (all[i].hasAttribute('alt')) {
      out.push(id + ' has alt');
      var value = all[i].getAttribute('alt');
      if (value != "") {
        out.push(id + ' alt="' + value + '"');
      } else {
        out.push(id + ' alt is empty');
      }
    } else {
      out.push(id + ' does not have alt');
    }
  }
  doc.getElementById('output').innerHTML = out.join("\n");
}

altChecker();
<div id='a' alt='foo'>-</div>
<div id='b' alt='bar'>-</div>
<div id='c' alt=''>-</div>
<div id='d'>-</div>

<pre id='output'></pre>

答案 1 :(得分:1)

我认为不需要2个循环

function altChecker() {
    var doc = document,

    getStartedBtn = doc.getElementById('getStartedBtn');

    EventUtility.addHandler(getStartedBtn, 'click', function() {

        var all = doc.getElementsByTagName("IMG");

        console.log('success!');

        for (var i = 0; i < all.length; i++) {
            if (all[i].hasAttribute('alt')) {
              if (all[i].alt === '') {
                  console.log('this has a ' + all[i].nodeName + ' tag BUT it is empty!');
              } else {
                  console.log('Yes, this has a ' + all[i].nodeName + ' tag and it is NOT empty!');
              }
            } else {
                console.log('Sorry ' + all[i].nodeName + ' tag, doesn\'t have an alt tag!');
            }

        }
    });
}

答案 2 :(得分:0)

你错过了第二个if中的.length属性:

max2 = all

应为max2 = all.length

答案 3 :(得分:0)

如果你打算循环遍历所有集合两次,你在第二个循环中错过了所有的长度属性,你需要从0开始j变量。

for (var j = i, max2 = all; j < max2; j++) {

应该是:

for (var j = 0, max2 = all.length; j < max2; j++) {

这两个循环是完全独立的,只是遍历所有集合;你用完全相同的方式写它们。

这样的错误是我通常使用功能习语进行循环的原因:

$.each(all, function(idx, each){...});