0

setTimeoutに問題があります。setIntervalも試しました。JSが一時停止またはスリープ状態になったらいいのにと思います。

理論的には、このコードは配列から最初のリンクを書き込み、3秒間待機し、次のリンクを書き込む必要があります。ただし、関数は呼び出されません。

<html>
<head></head>
<body>

<a href="http://www.google.com">Google</a>
<a href="http://www.thinkgeek.com">ThinkGeek</a>
<a href="http://www.themetapicture.com">The Meta Picture</a>

<iframe src="http://www.google.com" id="myid" name="main" width="1024" height="768">
</iframe>

<script>

function getLinksArray(){
for(var i=0; i < document.links.length; i++){
    var linx = document.links[i].href;
    setTimeout("openLinks(linx)"),3000);
}
}

function openLinks(link){
document.write(link + "<br />");
}

window.onload = getLinksArray();
</script>
</body>
</html>

私の質問の2番目の部分は、iframeのsrcをリンクに変更することです(リンクを書き込む代わりに)。document.write遅延を機能させるためのテスト目的でのみ使用しています。

試しましたがdocument.getElementById("myid").src = link;、何もしません。まるでiframeが存在しないかのように。

私はプロではないので、プロの助けを借りたいと思っています。;) 前もって感謝します。

4

3 に答える 3

0

まず、文字列をに渡さないでsetTimeoutください。

// old and busted
setTimeout("openLinks(linx)"),3000);

// new hotness
setTimeout(function() {
  openLinks(linx)
}, 3000);

次に、関数を生成するループには追加のヘルプが必要です。クロージャでループの値をキャプチャする必要があります。そうしないと、ループを使用する関数が実行される前に値が変更されます。

function getLinksArray() {
    for (var i = 0; i < document.links.length; i++) {
        var linx = document.links[i].href;

        // create a closure for each loop iteration
        (function(linx) {
          setTimeout(function() {
            openLinks(linx);
          }, 3000);
        }(linx));

    }
}

function openLinks(link) {
    // document.write(link + "<br />");

    // document.write is also bad for a number of reasons
    someElement.innerHTML += link + "<br />"
}

window.onload = getLinksArray();

そのクロージャマジックが行うことは、ループの各反復で作成された関数とのみ共有される新しいローカル変数を作成することです。それがないと、実際には次のようなものになります。

var linx; // var linx in the loop actually get hoisted to outside the loop!
for(var i=0; i < document.links.length; i++){
    linx = document.links[i].href;
    setTimeout(function() {
      openLinks(linx)
    },3000);
  }
}

これを見ると、ループの実行が完了し、そのループの最後の値が設定され、すべてのタイムアウトが共有するlinx値を使用して最初のタイムアウトが発生することがわかります。linx

関数を作成して実行し、その値を渡すと、その巻き上げと共有が防止されます。

于 2013-02-05T19:45:57.320 に答える
0

みんなの助けのおかげで、私は最終的に機能する製品を手に入れました:

<html>
<head></head>
<body>

<a href="http://www.google.com">Google</a><br />
<a href="http://www.thinkgeek.com">ThinkGeek</a><br />
<a href="http://www.themetapicture.com">The Meta Picture</a>

<iframe src="http://www.google.com" id="myid" name="main" width="1024" height="768">
</iframe>

<script>
function getLinksArray() {
for (var i = 0; i < document.links.length; i++) {
  var linx = document.links;
 (function loadLink(i) {          
   setTimeout(function () {   
    document.getElementById("myid").src = linx[i].href;
    if(linx[++i])
    {
        loadLink(i);
    }
}, 20000)
})(0);

}
}

window.onload = getLinksArray();
</script>
</body>
</html>
于 2013-02-05T22:51:53.253 に答える
0

そのように呼び出すことができないため、ほとんどの問題が発生していますsetTimeout

バインドされた変数を渡す必要がある関数を渡す必要があります。

for (var i=0; i < document.links.length; i++) {
    var linx = document.links[i].href;
    setTimeout(function(linx) {
        return function() {
            openlinks(linx);
        }
    }(linx),3000);
}

内部のものは、ループ変数をコールバックに渡す「標準的な」Javascript の方法の 1 つです。それが意味をなさない場合は、さらに多くの助けが必要になります...

于 2013-02-05T19:44:14.263 に答える