javascript - JS:ssä kutsuttu funktio -tapahtuma?


Onko mahdollista sitoa funktio toiseen funktioon kutsuttaessa? Esimerkiksi se menisi suunnilleen näin:

function a(){...}
function b(){...}
b.bind("onInvoke","a");

Joten kun b kutsutaan, myös a kutsutaan automaattisesti.

MUOKKAA: OK OK, selkeyden vuoksi, tämä ei ole kysymys ketjutuksesta. Ajatuksena on löytää tyylikäs tapa sitoa tapahtumia. Tarkastellaan normaalia "epätyylikästä" tapaa normaalilla funktiokutsulla:

function handler(){...}
function caller1(){handler(); ...}
function caller2(){handler(); ...}
function caller2(){handler(); ...}
// More callers all over your website everywhere else

Se toimii, eikö niin? Mutta entä jos minulla on soittaja kaikkialla? On vaikea järjestää tai muuttaa asioita.

Nyt tarkkaile ylivoimaista ratkaisua! (Jos sellainen on olemassa)

function handler(){...}
// Caller make no reference to handler on creation
function caller1(){...}
function caller2(){...}
function caller3(){...}
// Caller function are still all over the place, all over your website
// Event handler registered later in one location here, doesn't matter where they are phsically
caller1.bind("onInvoke",handler);
caller2.bind("onInvoke",handler);
caller3.bind("onInvoke",handler);

Todella hyvin samanlainen kuin tavallinen HTML - JQuery-tapahtumien rekisteröinti. Et kirjoita onClick jokaiseen kuvaan, johon käyttäjä saattaa klikata (jotka ovat kaikkialla), se olisi liian hankalaa järjestää! Kirjoitat vain yhden yksinkertaisen

 $("img").bind("onClick",click_handler);

koko sivustollesi. Tämä on se ydinasia, mitä etsin, lukuun ottamatta JS-funktioita.

Toivon, että se selventää asioita.

MUOKKAUS 2: Tarvitsee toimia IE7:n kanssa!!! JavaScript 1.8.5 on hieno ja kaikki, mutta mikään ei tue sitä juuri nyt.

Vastaus #1

Voit tehdä sen aspektisuuntautuneella lähestymistavalla. Tässä on yksinkertainen esimerkki:

Liitä a()-funktion kutsu b()-funktioon:

var _b = b;
b = function(){
   _b();
   a();
}

Kutsu nyt b():

b();

Katso sitä toiminnassa täällä: http://jsfiddle.net/eZ9wJ/

Vastaus #2

On olemassa erilaisia ratkaisuja sen mukaan, kuinka paljon haluat arkkitehtuuria. Yksinkertainen ja joustava lähestymistapa on luoda ketjutusapufunktio:

function chain() {
   var args = arguments;
   return function() {
      // loop through arguments and invoke all functions
      for(var i = 0; i < args.length; i++) {
         if(typeof args[i] == "function")
            args[i]();
      }
   }
}

Tämä palauttaa uuden funktion, joka kutsuu annetut funktiot peräkkäin. Käytä sitä näin:

var myChain = chain(b, a);
myChain();