有一段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>
span
代替input
:成功onmouseover
代替onclick
:失败我使用了调试器,它说start
是function start(){alert("Let's start");}
。然后我使用alert(start)
并说fileopen
。
作为测试3的结果,我可以通过更改名称轻松解决问题,但我想知道为什么会发生此错误在某些情况下,但在其他情况下不会发生。 编辑:或下一个最好的事情,其他解决方法而不更改名称。
答案 0 :(得分:12)
start
是IE中input
个元素的属性。 (根据微软的说法,它表示“when a video clip file should begin playing。”我不知道这意味着什么,但这并不重要。)在你的控制台中,你可以通过运行来看到这一点:
> document.createElement("input").start
"fileopen"
在元素的内联事件处理程序中,该元素的所有属性都可用作顶级变量。就像内联代码在with(thisParticularElement)
块内运行一样(显然,thisParticularElement
是监听器的元素)。因此,在内联事件代码的上下文中,变量start
引用元素的start
属性,它是一个字符串,而不是函数。
只需更改功能名称,或明确使用window.start
。
答案 1 :(得分:1)
这很有意思。我自己做了很少的测试,似乎发生了这个错误,因为 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)中无效。