我正在尝试在Javascript中创建一个小型自动化脚本,我想使用Opera的用户脚本功能运行一个站点,以定义要运行的外部脚本。我之前使用过这个功能来运行我用外部网站编写的脚本,效果很好。
我需要等到页面加载才能运行脚本,但我似乎无法让它工作。目前的代码是:
if (addEventListener in document) { // use W3C standard method
document.addEventListener('load', meerfirst(), false);
} else { // fall back to traditional method
document.onload = meerfirst();
}
function meerfirst(){
nameForm = document.forms['aspnetForm'];
nameForm.elements('ctl00$CPH1$NewQuoteView$TitlesView$DropDownListTitles').value = 'MR:TRUE:MR';
nameForm.elements('ctl00$CPH1$NewQuoteView$TextBoxFirstName').value = 'James';
}
这是我自己的函数,添加了通过另一个问题找到的if语句。我也试过window.onload,但它仍然无法正常工作。
奇怪的是Opera根本就没有真正执行脚本,好像我在if语句上设置了一个断点,它从来没有实际打破它。该网站是否内置了反用户脚本功能?或者有可能我做错了什么来阻止这个执行?
答案 0 :(得分:5)
将函数本身作为回调传递
addEventListener('load', meerfirst, false);
// no parens! ^^
通过放置括号,您可以立即调用函数(在加载之前)并将其(无用的,非函数)返回值传递给addEventListener。
答案 1 :(得分:3)
此代码有几个问题:
if (addEventListener in document) { // use W3C standard method
document.addEventListener('load', meerfirst(), false);
} else { // fall back to traditional method
document.onload = meerfirst();
}
您需要在if语句中添加addEventListener周围的引号。您在document
中搜索属性名称,因此名称必须为字符串:if( 'addEventListener' in document )
您希望在addEventListener语句中按名称引用该函数,而不是立即调用它。您应该删除括号 - 仅使用meerfirst
而不是meerfirst()
。
分配给document.onload无效。请参阅我对window.onload vs document.onload的回答,然后使用window.onload。
将作业更改为窗口 .onload后,您还需要删除括号。同样,您只是按名称引用该函数,并且不希望此时实际调用它。
最后,我建议您监听DOMContentLoaded
而不是load
- 除非您要运行一些需要等到所有图片都加载的代码。
答案 2 :(得分:2)
尝试:
window.onload = function()
{
meerfirst();
};
答案 3 :(得分:2)
你的答案很好地嵌入了O' Reilly" Javascript:the Definitive Guide"
// Register the function f to run when the document finishes loading.
// If the document has already loaded, run it asynchronously ASAP.
function onLoad(f) {
if (onLoad.loaded) // If document is already loaded
window.setTimeout(f, 0); // Queue f to be run as soon as possible
else if (window.addEventListener) // Standard event registration method
window.addEventListener("load", f, false);
else if (window.attachEvent) // IE8 and earlier use this instead
window.attachEvent("onload", f);
}
// Start by setting a flag that indicates that the document is not loaded yet.
onLoad.loaded = false;
// And register a function to set the flag when the document does load.
onLoad(function() { onLoad.loaded = true; });
这不仅会在浏览器完成加载时运行,而且还会处理跨浏览器的差异。享受:)