web-dev-qa-db-fra.com

comment détecter une fonction a été appelée avec javascript

J'ai une fonction javascript.

Comment vérifier:

  • si la fonction a été appelée (dans la section <head></head> ont cette fonction), alors ne pas appeler la fonction

  • si la fonction n'a pas été appelée (dans la section <head></head> n'ont pas cette fonction), alors appelez la fonction

comme require_once ou include_once avecPHP

12
Chameron

Deux options:

Variables statiques Voici comment créer des variables statiques (comme en C) à l’aide de fonctions d’appel automatique pour stocker vos variables statiques dans une fermeture.

var myFun = (function() {
  var called = false;
  return function() {
    if (!called) {
      console.log("I've been called");
      called = true;
    }
  }
})()

Remplacement de la fonction vide Définit la fonction sur une fonction vide après son exécution.

function callonce() {
  console.log("I've been called");
  arguments.callee = function() {};
}

Résumé de l'idée Voici une fonction qui renvoie une fonction qui n'est appelée qu'une seule fois. Ainsi, vous n'aurez pas à vous soucier d'ajouter du code de plaque de chaudière à chaque fonction.

function makeSingleCallFun(fun) {
  var called = false;
  return function() {
    if (!called) {
       called = true;
       return fun.apply(this, arguments);
    }
  }
}

// Alternate implementation   
function makeSingleCallFun(fun) {
    return function() {
      return fun.apply(this, arguments);
      arguments.callee = function() {};
    }
}

var myFun = makeSingleCallFun(function() {
  console.log("I've been called");
});
myFun(); // logs I've been called
myFun(); // Does nothing
26
Juan Mendes

Utilisez un motif de décorateur.

// your function definition
function yourFunction() {}

// decorator
function callItOnce(fn) {
    var called = false;
    return function() {
        if (!called) {
            called = true;
            return fn();
        }
        return;
    }
}

yourFunction(); // it runs
yourFunction(); // it runs    
yourFunction = callItOnce(yourFunction);
yourFunction(); // it runs
yourFunction(); // null

Cette solution fournit un moyen sans effets secondaires pour atteindre votre objectif. Vous n'êtes pas obligé de modifier votre fonction d'origine. Cela fonctionne bien même avec des fonctions de bibliothèque. Vous pouvez attribuer un nouveau nom à la fonction décorée pour conserver la fonction d'origine.

var myLibraryFunction = callItOnce(libraryFunction);
myLibraryFunction(); // it runs
myLibraryFunction(); // null
libraryFunction(); // it runs
10
Török Gábor
var called = false;
function blah() {
   called = true;
}

if ( !called ) {
   blah();
}
3
meder omuraliev

Vous pouvez utiliser une variable globale dans un espace de noms personnalisé pour stocker si la fonction a été appelée.

if(!window.mynamespace){
    window.mynamespace={};
}

mynamespace.callMeOnlyOnce=function(){

    if(mynamespace.alreadyCalled)return;

    alert('calling for the first time');
    mynamespace.alreadyCalled=true;
};

// alert box comes
mynamespace.callMeOnlyOnce();


// no alert box
mynamespace.callMeOnlyOnce();
3
Sean Patrick Floyd
If (!your_func.called) {
    your_func.called = true;
    your_func();
}
0
Thevs