【问题标题】:Error "Function expected" in IE : '<input onclick="start();" ... 'IE 中的错误“预期功能”:'<input onclick="start();" ...'
【发布时间】:2013-06-17 22:34:33
【问题描述】:

有一段HTML:

<input onclick="start();" type="button" value="Start!"/>

在 Firefox 和 Chrome 中,它在点击时调用 start。但是在 IE9 中它会产生错误消息:SCRIPT5002: Function expected。然后我尝试了几种不同的情况:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
    <script>
        function start(){
            alert("Let's start");
        }
        function stop(){
            alert("Let's stop");
        }
    </script>
    <input onclick="start();" type="button" value="Start!"/><br/> <!-- Failed : the main issue -->
    <span onclick="start();">Start!</span><br/> <!-- Work -->
    <input onclick="stop();" type="button" value="Stop!"/><br/> <!-- Work -->
    <input onclick="start();" type="text" value="Start!"/><br/> <!-- Failed -->
    <input onmouseover="start();" type="button" value="Start!"/><br/> <!-- Failed -->
</body>
</html>
  1. 原案:失败(这就是我在这里的原因。)
  2. 使用span 代替input:成功
  3. 使用另一个函数名:Success
  4. 使用其他类型:失败
  5. 使用onmouseover 代替onclick:失败

我使用了调试器,它说startfunction start(){alert("Let's start");}。然后我用了alert(start),上面写着fileopen

作为测试 3 的结果,我可以通过更改名称轻松解决问题,但我想知道为什么会发生此错误在某些情况下,但在其他情况下不会发生。 编辑: 或者下一个最好的方法,其他解决方法而不更改名称

【问题讨论】:

  • 首先,从您的 html 中删除所有 javascript!将您的 javascript 保存在 js 文件中。 :)
  • @Johan 实际上我做了,但我得到了错误,然后我把 JavaScript 放在 HTML 中发布在这里。
  • 可能您已经用函数以外的其他类型重新定义了另一个 start 变量。它也可以是隐藏原始全局变量的 HTML 元素的 id
  • @Teemu 在我给出的代码中没有这样的东西,在我正在开发的代码中也没有。
  • 将代码复制到小提琴中并检查 IE 10 似乎可以重现问题,但只需将 start 函数的名称更改为其他名称即可解决此问题。另外,最好在 JS 中绑定事件处理程序,而不是内联它们。

标签: javascript html internet-explorer


【解决方案1】:

start 是 IE 中input 元素的属性。 (根据 Microsoft 的说法,它表示“when a video clip file should begin playing”。我不知道这意味着什么,但这并不重要。)在您的控制台中,您可以通过运行来查看:

> document.createElement("input").start
"fileopen"

在元素的内联事件处理程序中,该元素的所有属性都可用作顶级变量。就好像内联代码在 with(thisParticularElement) 块内运行(其中 thisParticularElement 显然是带有侦听器的元素)。因此,在内联事件代码的上下文中,变量start指的是元素的start属性,是字符串,不是函数。

只需更改函数名称,或显式使用window.start

【讨论】:

    【解决方案2】:

    这很有趣。我自己做了很少的测试,似乎 这个错误发生,因为 start 已经是 输入元素的属性。所以它会尝试调用属性,而不是函数。

    我认为这是一个错误。

    试试下面的代码:

    <script>
            function autocomplete(){
                alert("");
            }
            function vspace(){
                alert("");
            }
            function hspace(){
                alert("");
            }
    
    
        </script>
    
    <input id="error" onclick="autocomplete();" type="button" value="Start!"/>
    <input id="error2" onclick="vspace();" type="button" value="Start!"/>
    <input id="error3" onclick="hspace();" type="button" value="Start!"/>
    

    然后尝试在控制台中调试。也可以尝试var x = document.getElementById("error");,然后调试x属性。

    我在 IE8、IE9 和 IE10 中对此进行了测试。这些功能在我的 IE9 和 IE10 (Win 7 32bit) 中不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-27
      • 2016-07-03
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多