1

独自のウィンドウで URL のリストを開く JavaScript があります。それぞれに window.open を使用できますが、問題は、特に多数の URL がある場合に、ブラウザが開くように要求した順序で常にウィンドウを開くとは限らないことです。URL が私のドメインにないため、子からの onLoad イベントを待つことができません。次のウィンドウを開く前に、子ウィンドウが開いているかどうかを判断する方法はありますか? 最後の手段として、各オープンの間に待機時間を作成できると思いますが、それはハックであり、すべてが遅くなり、おそらく正しい順序になる可能性が高くなりますが、それを保証するものではありません. 例えば:

<script type='text/javascript'>
var urls = new Array();
urls[0] = 'http://www.yahoo.com';
urls[1] = 'http://www.google.com';
urls[2] = 'http://www.facebook.com';

$(document).ready(function() {
    for (i=0; i<urls.length; i++) {
        window.open(urls[i]);
    }
});
</script>
4

2 に答える 2

1

わかりました。リモート URL の子ウィンドウが開いていることを確認する方法はありません。それは本当だ。ただし、自分のドメインでファイルを開いた場合、そのファイルが開かれていることを親に警告し、リモート URL にリダイレクトするだけです。このようなもの:

<script type="text/javascript" src="js/jquery.min.js"></script>
<script type='text/javascript'>
var urls = new Array();
urls[0] = 'http://www.yahoo.com';
urls[1] = 'http://www.google.com';
urls[2] = 'http://www.facebook.com';
urls[3] = 'http://www.linkedin.com';
urls[4] = 'http://www.twitter.com';
$(document).ready(function() {
    var interval = null;
    function doNext(i) {
        if (i < urls.length) {
            // console.log("Doing: " + i);
            childWin = window.open('tst2.jsp?i=' + i + '&url=' + urls[i]);
            interval = setInterval(function() {waitForIt(i);}, 1000);
            waitForIt(i);
        }
    }

    function waitForIt(i) {
        if (document.getElementById("urls" + i).checked == false) {
            // console.log('wait for: ' + i);
        } else {
            clearInterval(interval);
            if (i < urls.length) {
                doNext(i+1);
            }
        }
    }

    doNext(0);
});
</script>
<input type="checkbox" id="urls0">http://www.yahoo.com<br>
<input type="checkbox" id="urls1">http://www.google.com<br>
<input type="checkbox" id="urls2">http://www.facebook.com<br>
<input type="checkbox" id="urls3">http://www.linkedin.com<br>
<input type="checkbox" id="urls4">http://www.twitter.com<br>

次に、tst2.jsp で次のように記述します。

<script>
opener.document.getElementById("urls" + <%=request.getParameter("i")%>).checked = true;
// console.log("Set variable");
window.location = '<%= request.getParameter("url") %>';
</script>

また、開くことができるウィンドウの数はブラウザによって異なります。Firefox は何にでも設定できます。Chrome は 20 に制限されているようです。IE についてはわかりません。

于 2013-01-24T15:06:48.733 に答える
0

開くことができるウィンドウの数が制限されている可能性があります。多くの呼び出しの後に再利用されている可能性があります。

open()はブロッキング呼び出しであると想定されているため、ブラウザーが少なくとも新しいウィンドウを開くまで常に待機してから、次のウィンドウに移動します。

デフォルト名が割り当てられている場合にブラウザがウィンドウを再利用しないようにするために、open の 2 番目のパラメータとしてランダム パラメータを追加してみてください。

// No guarantee that the name generated is unique, but if that's your only problem
// you should be OK
window.open(urls[i], "name" + new Date() + Math.random() );
于 2013-01-23T00:04:11.430 に答える