2017-05-10 3 views
3

Ich schrieb eine Funktion namens search, die ich genannt zu werden, zu erwarten, wenn der Link angeklickt wurde, wie der Code-Schnipsel zeigt:Warum sagt dieser Anker "Suche ist keine Funktion"?

<body> 
    <script type="text/javascript">  
     function search() { 
      console.log('Searching'); 
     } 
    </script> 
    <a href="#" onclick="search();">Click here</a> 
</body> 

Allerdings ist der Code nicht funktioniert, wie ich erwartet hatte, was Uncaught TypeError: search is not a function Fehler verursacht (in Chrome), wenn auf den Link geklickt wird.

habe ich versucht, die Protokollierung search zu sehen, warum der Fehler ausgelöst wurde:

<a href="#" onclick="console.log(search)">Click here</a> 

Diese Zeit, die Konsole eine leere Zeichenfolge jedes Mal, wenn der Link angeklickt wird protokolliert. Was mich verwirrt ist, dass search tatsächlich woanders als eine leere Zeichenfolge definiert ist, was meine Funktionsdefinition nutzlos macht.

Also ich möchte wissen, was passiert, wenn ein Klick-Ereignis ausgelöst wird, und wann ist search hier definiert?

+0

_ „Was mir ein Rätsel ist, dass‚Suche‘tatsächlich woanders als eine leere Zeichenfolge definiert wird“ _ Ändern entweder Funktion Der Name oder die Variable, die auf einen anderen Bezeichner verweisen, sollten das Problem lösen, ja? – guest271314

+0

Inline-Funktion überholt. Also 'onclick' bezog sich auf die _irgendwo_ leere Zeichenfolge' search', die in der Konsolenausgabe resultierte. Die 'search'-Variable muss nach der' function search() 'definiert worden sein, daher wird sie als Methode aufgerufen, die zu einem Fehler führt. – Searching

+0

* "Was mich verwirrt ist, dass" Suche "eigentlich woanders als leere Zeichenfolge definiert ist" * - Willst du sagen, dass du irgendwo anderen Code hast, der 'such' explizit als leere Zeichenfolge definiert oder das Programm sich verhält? Wenn es irgendwo anders definiert ist, obwohl es nicht in Ihrem Code ist und Sie sich fragen, wo diese andere Definition sein könnte? – nnnnnn

Antwort

2

Es stellt sich heraus search tatsächlich bezieht sich auf die Eigenschaft des searcha Element, das eine Eigenschaft ist, die Suchparameter steuert, die eine leere Zeichenfolge in diesem Fall passiert sein. Dies liegt daran, dass es mit HTMLAnchorElement eine Besonderheit ist, da es zum Erstellen von Hyperlinks und zum Navigieren zu anderen Adressen verwendet wird. Daher wird die search-Eigenschaft zum Steuern von Suchparametern über Hyperlinks (ähnlich dem Objekt Location) verwendet. Durch Setzen der Eigenschaft search eines Ankerelements wird dann wiederum der globale -Instanz window.location.search festgelegt. Dies erzeugt einen Namenskonflikt, und da eine leere Zeichenfolge keine Funktion ist, wird der Fehler ausgelöst.

Verwenden Sie einen anderen Namen für die Funktion, um diesen Konflikt zu entfernen. Beachten Sie, wenn Sie nicht über eine a verwenden, können Sie es gut funktionieren sehen werden:

<script> 
    function search() { 
    alert("foo"); 
    } 
</script> 
<div onclick="search();">Click me!</div> 
+0

'search' könnte auch auf ein Element verweisen, bei dem' id' auf '" search "gesetzt ist' – guest271314

+0

Großartig! Ich denke, das ist die richtige Antwort. –

+0

@Shiying Ich habe es aktualisiert. Es war ein bisschen falsch – Li357

0

Ändern Sie den Namen der Funktion. Ich habe deinen Code ausprobiert und es hat funktioniert, nachdem ich den Namen der Funktion geändert habe.

<body> 
<script type="text/javascript">  
    function test() { 
     console.log('Searching'); 
    } 
</script> 
<a href="#" onclick="test()">Click here</a> 

Verwandte Themen