如何向HTML Javascript函数添加延迟

时间:2016-11-30 17:23:11

标签: javascript

我有以下脚本在列表中打开网址:

function openWindow(){
    var x = document.getElementById('a').value.split('\n');
    for (var i = 0; i < x.length; i++)
        if (x[i].indexOf('.') > 0)
            if (x[i].indexOf('://') < 0)
                window.open('http://'+x[i]);
            else
                window.open(x[i]);
}

但是,我想在打开每个网址之间添加延迟(让我们说大约5秒钟)。我怎样才能做到这一点?

我不熟悉功能。 Linux等通常要好得多。非常感谢您的见解。

4 个答案:

答案 0 :(得分:1)

您可以这样做,以避免由setTimeout导致的非阻塞问题。

您需要的是等待在开始下一次迭代之前执行setTimeout。

var i = 0;
function openWindow(){
    var x = document.getElementById('a').value.split('\n');
    doLoop(x);
}


function doLoop(x)
    setTimeout(function () {
        if (x[i].indexOf('.') > 0){
            if (x[i].indexOf('://') < 0){
                window.open('http://'+x[i]);
            }else{
                window.open(x[i]);
            }
        }
        i+=1;
        if(i<x.length){
            doLoop(x);
        }
    }, 5000)
}

使用自执行功能,它是这样的:

function openWindow() {
    var i = 0;
    var x = document.getElementById('a').value.split('\n');
    (function fn() {
        if(x[i].indexOf('.') > 0) {
            if(x[i].indexOf('://') < 0) {
                window.open('http://' + x[i++]);
            } else {
                window.open(x[i++]);
            }
        }
        i++;
        if( i < x.length ){
            setTimeout( fn, 3000 );
        }
    })();
}

答案 1 :(得分:1)

更好的方法是使用setTimeout()self-executing anonymous function

function openWindow() {
    var i = 0;
    var x = document.getElementById('a').value.split('\n');
    (function() {
        if(typeof x[i] !== 'undefined') {
            if(x[i].indexOf('.') > 0) {
                if(x[i].indexOf('://') < 0) {
                    window.open('http://' + x[i++]);
                } else {
                    window.open(x[i++]);
                }
            }
            setTimeout(arguments.callee, 1000);
        }
        return false;
    })();
}

这将保证在您的代码执行之前不会进行下一次调用。我在此示例中使用arguments.callee作为函数引用。一旦数组中的索引不再存在,通过检查它是否未定义,它只返回false而不是设置另一个timout。

答案 2 :(得分:0)

使用所有网址

创建数组x
var x = [url1, url2, url3, ...];

创建一个for循环

for(var i = 0; i<x.length; i++) {
   setTimeout(function() {
    window.open('http://'+x[i])}, 1000); // 1000 for 1 second 
 }
}

答案 3 :(得分:-1)

 setInterval(function(){window.open('http://'+x[i]);},5000);