2013-01-23 12 views
7

Ich möchte nur, dass mein JavaScript einmal ausgeführt wird, aber Ich kann nicht steuern, wie oft die Javascript-Datei ausgeführt wird. Im Grunde schreibe ich ein winziges JS-Snippet in ein CMS und das CMS ruft es tatsächlich 5-10 mal an. So Lösungen wie folgt aus:Javascript laufenden Code einmal

function never_called_again(args) { 
    // do some stuff 
    never_called_again = function (new_args) { 
    // do nothing 
    } 
} 
never_called_again(); 

nicht arbeiten Sie scheinen, denn sobald mein Schnipsel wieder von oben ausgeführt wird, wird die Funktion erneut erklärt, und ‚ein paar Sachen tun‘ ist neu bewertet. Vielleicht mache ich es einfach nicht richtig, ich bin nicht großartig mit JS. Ich erwäge mit so etwas wie Try-Catch auf eine globale Variable, so etwas wie

if (code_happened == undefined) { 
    \\ run code 
    code_happened = true; 
} 

EDIT: Es gibt einen konsistenten Zustand z.B. Wenn ich eine Variable setze, kann ich sehen, wenn mein Snippet erneut ausgeführt wird. Aber ich muss es deklarieren, bevor ich darauf zugreife. Ich weiß nicht, wie ich sagen soll: "Existiert diese Variable noch?"

+1

"Ich weiß nicht, wie zu sagen, 'ist diese Variable noch existieren?'" - in der Regel Dies geschieht mit 'var foo = window.foo || {} ' – zzzzBov

Antwort

17

Try this:

var doneTheStuff; 
function whatever() { 
    if (!doneTheStuff) { 
    doneTheStuff = true; 
    // do the stuff 
    } 
} 

Redundante Variablendeklarationen haben keinen Einfluss auf den Wert der Variablen. Sobald eine der Funktionen die Variable auf true gesetzt hat, werden die anderen nichts tun.

+0

Funktioniert! Followup-Frage - es scheint die letzte erklärte Funktion auszuführen, z.B. make 'mach das Zeug' mache' alert (1) 'und' alert (2) 'und du wirst nur sehen 2. Ist für mich egal (sie sind alle gleich), aber trotzdem faszinierend – Hamy

+0

@Hamy - Meine Lösung würde umgekehrt funktionieren. Nur die erste deklarierte Funktion wird ausgeführt. –

+0

@Hamy, wenn der Code in denselben '

2

Verwenden Sie einen Verschluss und setzen Sie eine Flagge. Wenn das Flag true ist, gerade zurück:

if (! window.never_called_again ) { 
    window.never_called_again = (function() { 
     var ran = false; 
     return function (args) { 
      if (ran) return; 
      ran = true; 
      // Do stuff 
     }; 
    }()); 
} 

Hier ist die Geige: http://jsfiddle.net/U2NCs/

+1

Aber wenn das in zwei getrennten Bits von JavaScript auftaucht, wird es das gleiche Problem haben. – Pointy

+2

Die gesamte Datei wird mehrmals ausgeführt, einschließlich der Definition der Funktion, wenn ich die Beschreibung des OP verstehe. Dies ist eine wahrere Darstellung, und es wird mehrmals aufgerufen: http://jsfiddle.net/Qn52E/. – mellamokb

+0

Wie andere darauf hingewiesen haben, bin ich dem Kommentar von mellamokb ähnlicher, also scheint das nicht zu funktionieren ;-) – Hamy

3
if (typeof code_happened === 'undefined') { 
    window.code_happened = true; 
    // Your code here. 
} 

Die typeof überprüfen Sie um die Tatsache, dass die globale nicht deklariert wurde. Sie könnten auch einfach if (!window.code_happened) tun, da der Zugriff auf Eigenschaften für nicht definierte Eigenschaften nicht gesperrt ist.

Verwandte Themen