在HTML主管部分:
<script type="text/javascript" src="Scripts/editScripts.js"></script>
位于</body>
标记上方(结束标记,html页面底部)。另外:这是旧代码,这是它不工作时的情况:
<script type="text/javascript">if(document.getElementById)initialize();loadEvents();</script>
</body>
</html>
在editScripts.js文件中:
/*global document,addFileInput*/
function loadEvents() {
var a = document.getElementById('addField');
a.onclick = addFileInput;
}
var upload_number = 2;
function addFileInput() {
var d = document.createElement("div");
var file = document.createElement("input");
file.setAttribute("type", "file");
file.setAttribute("name", "addFile[]");
file.setAttribute("size", "35");
file.setAttribute("class", "file");
file.setAttribute("id", "addFile"+upload_number);
d.appendChild(file);
document.getElementById("moreUploads").appendChild(d);
upload_number++;
}
这不起作用。我用这个替换了页脚中的javascript。
这是新代码,它可以按照我的预期运行。:
<script type="text/javascript">if (document.getElementById)loadEvents();</script>
现在它确实有效......我不知道如何省去那个函数调用,即使它所指的函数不存在,也会让事情变得如此神圣。
答案 0 :(得分:4)
在未加括号的if
语句中,只有第一个语句是有条件的。无论缩进如何,其后面的每个陈述都是无条件。
因此,在第一个例子中,loadevents()
无条件执行。
答案 1 :(得分:1)
可能是因为你没有在文档加载事件上调用脚本。因此,当您在dom完全加载之前>>标题之前调用脚本时,它们都没有工作,但现在当你在dom加载后调用它时,它可以工作。
所有这一切的正确修复应该是在文档完全加载后调用脚本,或者至少从body onload事件调用:
<body onload="initScripts()">
然后在initScripts函数中添加要在页面加载时运行的所有脚本。
另外,有更好的方法可以做到这一点,例如使用jquery和/或阅读:http://onlinetools.org/articles/unobtrusivejavascript/chapter4.html
答案 2 :(得分:1)
由于没有这样的功能,浏览器在尝试调用“初始化”函数时会报告错误。因此,您调用“loadEvents”的下一行将无法运行。见这个例子:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>JS Error Test</title>
</head>
<body>
<script type="text/javascript">
if(document.getElementById) {
initialize();
alert("You shouldn't see me!");
}
</script>
</body>
</html>
在该示例中,警告框不应出现,因为我没有声明“初始化”功能,浏览器将报告JS错误。但是,删除“初始化”功能将导致出现警告框。
这就是通过消除Javascript错误原因解决问题的方法。
答案 3 :(得分:0)
你说:“我不知道如何省去那个函数调用,即使它所指的函数不存在,也会让事情变得非常糟糕。”这与你的问题的其余部分不一致,这意味着添加调用搞砸了。但我认为我引用的文字是正确的描述。
这是真正的答案。旧代码:
if(document.getElementById)loadEvents();
如果未定义getElementsById,不会调用loadEvents。它并未在所有浏览器中定义。
相反,新代码不仅省略了函数调用:语义也发生了变化。
if(document.getElementById)initialize();loadEvents();
总是调用loadEvents,所以你想要发生的事情总是如此。