Javascript问题解决了,不明白是什么问题

时间:2009-08-26 15:34:32

标签: javascript html file upload input

在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>

现在它确实有效......我不知道如何省去那个函数调用,即使它所指的函数不存在,也会让事情变得如此神圣。

4 个答案:

答案 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,所以你想要发生的事情总是如此。