2015-11-14 78 views
0

我试图为我的同事创建一个html文档来完成在线测试(我有正确的答案)。当文档加载时,它会请求您的用户和密码并尝试登录,然后填写答案并提交。Javascript:使用while循环等待文档加载不起作用

但是我无法通过用户名和密码值,在页面中的元素,这是错误:

Cannot set property 'value' of null

页面没有完全加载时,我的脚本试图获得其元素,我怎么能做这个工作?

<html> 
<head> 
    <title>BCG test</title> 
    <script type="text/javascript"> 
     function bcg(){ 
      var user = prompt("Enter username: "); 
      var pass = prompt("Enter password: "); 
      var site = "http://app.huawei.com/bcg"; 

      location = site; 

      while(true){ 
       if (document.readyState == "complete"){ 
        break; 
       } 
      } 

      var user_box = document.getElementById("uid"); 
      var pass_box = document.getElementById("password"); 
      var submit_button = document.getElementsByName("Submit")[0]; 

      user_box.value = user; 
      pass_box.value = pass; 
      submit_button.click(); 
     } 

    </script> 
</head> 
<body onload = "bcg()"> 
    <h1>BCG TEST</h1> 
</body> 
</html> 
+0

您无法与其他网页上的内容进行互动,就像您正在尝试的那样。当您更改“位置”并开始导航时,在下一页加载之前,当前页面的内容(包括其中的所有JavaScript)被删除。如果您想模仿用户,请查看[无头浏览器](https://en.wikipedia.org/wiki/Headless_browser)。 –

回答

1

你不应该使用while(true)循环,因为无限循环快,永远。这会导致浏览器冻结。如果您需要继续检查某些内容,请使用setInterval设置一个计时器。

但是,为此,您似乎希望等待页面加载。把你的代码在此块代为执行:

document.addEventListener("DOMContentLoaded", function() { 
     var user_box = document.getElementById("uid"); 
     var pass_box = document.getElementById("password"); 
     var submit_button = document.getElementsByName("Submit")[0]; 

     user_box.value = user; 
     pass_box.value = pass; 
     submit_button.click(); 
}); 
0

你不能这样做,在javascript:

while(true){if(document.readyState == "complete"){ break; }} 

它永远不会退出这一事件框架。

使用window.onload = function(){}$(document).ready(function(){})

所有这些功能将被调用时加载文档。