Javascript WIll window.addEventListener(“加载”,function(),false);是否等待浏览器自动填充字段?

Javascript WIll window.addEventListener(“加载”,function(),false);是否等待浏览器自动填充字段?,javascript,greasemonkey,addeventlistener,Javascript,Greasemonkey,Addeventlistener,我正在创建一个GreaseMonkey脚本,只要用户在浏览器中保存了用户名和密码,它就会自动登录到页面。这很简单,只需检查用户名字段和密码字段是否为空,然后自动单击登录按钮 我时不时地遇到一个问题,它没有登录。页面加载后就放在那里了。我认为这仅仅是因为在检查用户名和密码字段时页面没有完全加载 因此,我将其添加到脚本中 window.addEventListener("load", Login(), false); 我的问题是。。。这实际上是等待浏览器在尝试登录之前自动填充这些字段,还是页面加载

我正在创建一个GreaseMonkey脚本,只要用户在浏览器中保存了用户名和密码,它就会自动登录到页面。这很简单,只需检查用户名字段和密码字段是否为空,然后自动单击登录按钮

我时不时地遇到一个问题,它没有登录。页面加载后就放在那里了。我认为这仅仅是因为在检查用户名和密码字段时页面没有完全加载

因此,我将其添加到脚本中

window.addEventListener("load", Login(), false);

我的问题是。。。这实际上是等待浏览器在尝试登录之前自动填充这些字段,还是页面加载和浏览器填充这些字段是两种不同的操作?

您的意思是引用
登录而不是立即执行它

window.addEventListener("load", Login, false);

您的方式在加载窗口之前执行登录

因为自动保存表单的工作方式没有标准,所以我会在
setTimeout()上设置一个计时器。

呃。。我很傻。如果用户试图输入其用户信息,则当前代码会产生不良影响

未经测试的快速编写代码:

function logMeIn() {
  var el = document.getElementById("username");
  if (el && el.value !== "") {
    // Finish the login
  } else {
    window.setTimeout(logMeIn, 200);
  }
}

logMeIn();
尝试2:

// This is a User Script -- runs in its own encloser, won't pollute names back to the main document.
var loginTimer;

function logMeIn() {
  var el = document.getElementById("username");
  if (el && el.value !== "") {
    // Finish the login
  } else {
    loginTimer = window.setTimeout(logMeIn, 200);
  }
}

logMeIn();

// can't use ".onfocus" -- its a userscript.
// Cancel the timer if the username field gets focus -- if the user tries to enter things.
document.getElementById("username").addEventListner("focus") = function(e) {
  if (loginTimer) {
    window.clearTimeout(loginTimer);
  }
}

这一点很好——但仍然为事件顺序处理留下了回旋余地。看起来浏览器自动填充表单的时间已经足够长了。。我认为window.addEventListener(“load”,Login(),false);将等待页面加载,然后运行指定的函数。@RandomPrecision--
Login()
将运行该函数,然后返回一个值<代码>登录
是稍后将调用的函数引用。啊,我明白你的意思了。因此,通过放置()它会立即运行函数,但只留下函数名,它在完成时调用函数?@RandomPrecision-完全正确。函数引用是Javascript思维的关键部分。这会让人困惑,因为这段代码也可以工作:
window.addEventListener(“load”,“Login()”,false)
通过发送一个字符串而不是函数引用,Javascript引擎实际上通过
eval
运行所有这些,并通过Javascript编译器运行它们,以使其正常工作。很多粗制滥造的例子都使用这样的代码,这让初学者感到非常困惑。我曾经讨论过这样做,但是如果由于某种原因,用户忘记在浏览器中保存用户名和密码呢。这不会创建一个无限循环来锁定浏览器吗?@RandomPrecision——由于setTimeout,它不会锁定浏览器。它可能会在页面上运行几个周期,但假设你不是永远都在页面上运行,那也不算太糟糕。如果您担心耗尽移动设备的资源,您可以在计数器中只检查X次。您还可以在文档失去焦点时禁用代码。为了简单起见,我省略了这些内容。谢谢您的解释和代码。这会奏效的。谢谢。如果不行,请告诉我。用户脚本是我的专长之一。