2013-06-17 8 views
10

c'è un pezzo di HTML:Errore "Funzione prevista" in IE: '<input onclick = "start();" ... '

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

In Firefox e Chrome invoca start al clic. Tuttavia in IE9 viene visualizzato il messaggio di errore: SCRIPT5002: Function expected. Poi ho provato diversi casi differenti:

<!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. caso originale: Impossibile (È per questo che sono qui.)
  2. Utilizzare un span invece di input: Successo
  3. Utilizzare un altro nome della funzione: Successione
  4. Utilizzare un tipo diverso: Non riuscito
  5. Utilizzare onmouseover invece di onclick: Impossibile

Ho usato il debugger e ha detto che start è function start(){alert("Let's start");}. Quindi ho usato alert(start) e ho detto fileopen.

Come il risultato di test di 3, posso facilmente lavorare intorno cambiando il nome, ma voglio sapere perché questo errore sarebbe successo in alcuni casi, ma non è successo negli altri. Modifica: Oppure la cosa migliore successiva, altre soluzioni senza cambiare i nomi.

+2

Per prima cosa, rimuovi tutto javascript dal tuo html! mantieni il tuo javascript in un file js. :) – Johan

+2

@Johan In realtà l'ho fatto e ho ricevuto l'errore, quindi ho inserito JavaScript in HTML per postare qui. – johnchen902

+0

Probabilmente hai ridefinito un'altra variabile 'start' con un altro tipo di funzione. Può anche essere un 'id' di un elemento HTML che ombreggia la variabile globale originale. – Teemu

risposta

12

start è una proprietà di input elementi in IE. (. Secondo Microsoft, indica, "when a video clip file should begin playing" Non ho idea di cosa significhi, ma non è importante) Nella tua console, è possibile vedere questo eseguendo:

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

Nel gestore di eventi in linea di un elemento , tutte le proprietà di quell'elemento sono disponibili come variabili di primo livello. È come se il codice inline fosse eseguito all'interno di un blocco with(thisParticularElement) (dove thisParticularElement è l'elemento con il listener, ovviamente). Pertanto, nel contesto del codice evento inline, la variabile start si riferisce alla proprietà start dell'elemento, che è una stringa, non una funzione.

Basta cambiare il nome della funzione o utilizzare window.start esplicitamente.

1

questo è interessante. Ho fatto alcuni test da solo e sembra che questo errore si verifichi perché start è già proprietà dell'elemento di input. Quindi proverà a chiamare la proprietà, non la funzione.

Lo considero un bug.

Prova seguente codice:

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

quindi provare a eseguire il debug in consolle. Prova anche a var x = document.getElementById("error"); e poi esegui il debug di x proprietà.

Ho provato questo in IE8, IE9 e IE10. Queste funzioni non funzionano nel mio IE9 e IE10 (Win 7 32 bit).

+0

apsillers era più veloce: P –

Problemi correlati