Fragen zu rekursiven Javascript-Funktionen wenden Sie sich bitte an einen Master.
漂亮男人
漂亮男人 2017-06-28 09:24:22
0
2
710

Guten Abend, Meister, helfen Sie mir bitte herauszufinden, warum meine Funktion nicht ausgeführt werden kann?
Erklärung der Situation: Da die Tabelle in p über Ajax geladen wird, besteht der Zweck der Funktion darin, festzustellen, ob eine solche Tabelle vorhanden ist. Wenn nicht, führen Sie die folgende Funktion nach 1 Sekunde aus. Aber jetzt, wenn die Tabelle geladen und angezeigt wurde, führt die Funktion find() nicht dazu, dass die Tabelle rot wird (Fehlerbericht: Uncaught RangeError: Maximale Aufrufstapelgröße überschritten)
Vielen Dank im Voraus, Meister!

漂亮男人
漂亮男人

Antworte allen(2)
我想大声告诉你

因为你用p.getElementsByTagName('table')[0]这个取到的是一个DOM对象,由于DOM对象没有.length属性,所以target.length其实是未定义的。而undefined > 0的值一直是false,所以你会无限次地调用else分支,所以也就会添加无数次的find(p)绑定。所以浏览器提示find调用次数超出最大限制。

正确的做法是让targetp.getElementsByTagName("table"),这才是一个数组,才有.length的值。

Update

代码:
方案1:(判断取到所有table的数组长度,并取第一个操作)

function find(p) {
    var target = p.getElementsByTagName("table");
    if (target.length > 0) {
        target[0].style.background = 'red';
    } else {
        setTimeout(function() {
            find(p);
        }, 1000)
    }
};

方案2:(直接判断table,并直接操作取到的table)

function find(p) {
    var target = p.getElementsByTagName("table")[0];
    if (target) {
        target.style.background = 'red';
    } else {
        setTimeout(function() {
            find(p);
        }, 1000)
    }
};
世界只因有你

target.length target 是 table, table.length 是什么?

参考一下

function find(p) {
  var interval = setInterval(function () {
    var target = p.getElementsByTagName("table")[0]
    if (target) {
      clearInterval(interval)
      target.style.background = 'red'
    }
  }, 1000)
}
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage