2013-06-17 6 views
10

Es ist ein Stück HTML:Fehler "Funktion erwartet" in IE: '<input onclick = "start();" ... '

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

In Firefox und Chrome ruft sie start auf Klick. In IE9 wird jedoch die Fehlermeldung: SCRIPT5002: Function expected. Dann habe ich versucht, mehrere verschiedene Fälle:

<!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. Originalbeitrag: Fehler (Deshalb bin ich hier.)
  2. Verwenden Sie einen span statt input: Erfolg
  3. Verwenden Sie eine andere Funktionsname: Erfolg
  4. Verwenden Sie einen anderen Typ: Fehler
  5. Verwenden onmouseover statt onclick: Fehler

Ich habe Debugger verwendet und es hieß start ist function start(){alert("Let's start");}. Dann habe ich alert(start) und es sagte fileopen.

Als Ergebnis von Test 3 kann ich problemlos umgehen, indem ich den Namen ändere, aber ich möchte wissen, warum dieser Fehler in einigen Fällen passiert, aber nicht in den anderen passiert ist. Bearbeiten: Oder die nächstbeste Sache, andere Work-Arounds ohne die Namen ändern.

+2

erste Dinge zuerst, entfernen Sie alle Javascript aus Ihrem HTML! halten Sie Ihr Javascript in einer js-Datei. :) – Johan

+2

@Johan Eigentlich habe ich, und ich habe den Fehler, dann habe ich JavaScript in HTML, um hier zu posten. – johnchen902

+0

Wahrscheinlich haben Sie eine andere 'start'-Variable mit einem anderen Typ als der Funktion neu definiert. Es kann auch eine ID eines HTML-Elements sein, das die ursprüngliche globale Variable überschattet. – Teemu

Antwort

12

start ist eine Eigenschaft von input Elemente in IE. (. Laut Microsoft es gibt „when a video clip file should begin playing“ Ich habe keine Ahnung, was das bedeutet, aber es ist nicht wichtig) In der Konsole können Sie das sehen, indem Sie:

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

in einem Inline-Event-Handler des Elements , sind alle Eigenschaften dieses Elements als Variablen der obersten Ebene verfügbar. Es ist, als ob der Inline-Code in einem with(thisParticularElement)-Block ausgeführt wird (wobei thisParticularElement offensichtlich das Element mit dem Listener ist). Daher bezieht sich die Variable start im Kontext des Inline-Ereigniscodes auf die start -Eigenschaft des Elements, bei der es sich um eine Zeichenfolge und keine Funktion handelt.

Ändern Sie einfach den Funktionsnamen, oder verwenden Sie explizit window.start.

1

das ist interessant. Ich habe einige Tests auf eigene Faust und es scheint, dass dieser Fehler passieren, weil Start ist bereits Eigenschaft des Eingabeelements. So wird es versuchen, Eigentum zu nennen, nicht die Funktion.

Ich betrachte es als ein Fehler.

Versuchen folgenden Code:

<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!"/> 

Dann versuchen Sie in der Konsole zu debuggen. Versuchen Sie auch, var x = document.getElementById("error"); und Debug x-Eigenschaften dann.

Ich habe dies in IE8, IE9 und IE10 getestet. Diese Funktionen funktionieren nicht in meinem IE9 und IE10 (Win 7 32bit).

+0

Apsillers war schneller: P –