document.getElementById不返回null,但也没有做我想要的。在javascript控制台中没有错误

时间:2013-04-11 18:30:07

标签: javascript google-chrome-extension

在这个例子中,我加载了一个paypal页面,其中提示我登录。一旦我登录,页面就会改变,通过在paypal结束时使用其他javascripts。地址在此转换时不会改变,源代码也不会以任何实质方式改变。我试图找到一种方法让我的脚本在第一次单击后等待足够长时间才能获得加载后的元素。我想我可以使用以下方法做到这一点:

document.getElementById("submitLogin").click();

window.onload = function() {
    document.getElementById("continue").click();
}; 

执行脚本时,单击第一个按钮,页面转换,但不会单击加载的第二个按钮。我的javascript控制台没有报告任何错误,表明它能够“获取”该元素。不知道为什么它不会点击它。

1 个答案:

答案 0 :(得分:2)

如果没有别的,你总是可以在某个时间间隔内轮询“continue”元素的存在:

function clickContinue() {
    var button = document.getElementById("continue");
    return button ? button.click() : setTimeout(clickContinue, 100);
}

document.getElementById("submitLogin").click();
clickContinue();

如果你走这条路,你可能想要包含一个故障安全,所以它不会运行太长时间,以防万一发生意外。这样的事情应该有效:

clickContinue.interval = 100; // Look for "continue" button every 0.1 second
clickContinue.ttl = 10000; // Approximate time to live: 10 seconds ~ 10,000 ms
clickContinue.tries = clickContinue.ttl / clickContinue.interval | 0;

function clickContinue() {
    var button = document.getElementById("continue"),
        interval = clickContinue.interval;
    return button ? button.click() : 
        clickContinue.tries-- && setTimeout(clickContinue, interval);
}
// ...

看看PayPal的API文档,看看它们是否提供了一种设置回调来处理这个问题的方法。这种轮询技术应该只能作为最后的手段使用。