Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    Richiamare un evento con attachEvent e addEventListener

    Voglio far avvenire un evento anche dopo che è realmente accaduto. Faccio un esempio pratico:
    codice:
    window.onload=function() {
    alert("ciao");
    document.getElementById("ccc").onclick=window.onload;
    }
    Cliccando sul bottone con id "ccc" l'evento onload si verifica di nuovo e quindi compare la scritta ciao una seconda volta, tutto come previsto.

    Il problema sorge quando l'evento è settato con addEventListener o attachEvent

    X Firefox
    codice:
    window.addEventListener("load", function() {
    alert("ciao");
    document.getElementById("ccc").onclick=window.onload;
    }, 0);

    X IE
    codice:
    window.attachEvent("onload", function() {
    alert("ciao");
    document.getElementById("ccc").onclick=window.onload;
    });
    Infatti non va come sperato: cliccando sul link l'evento onload non si verifica di nuovo.
    Si può risolvere ciò? Mi interessa soprattuto per IE, anche se con metodi proprietari.

  2. #2

  3. #3
    Le sto provando tutte, anche con apply e call

  4. #4
    Usa

    codice:
    bFired = object.fireEvent(sEvent [, oEventObject])
    per richiamare l'evento.

  5. #5
    Un pò in ritardo
    Non mi serviva più cmq grazie lo stesso

  6. #6
    Meglio rispondere, anche solo x lasciare traccia per chi avrà lo stesso problema no!?

    Tu come hai risolto poi?

  7. #7
    In effetti hai perfettamente ragione.
    Mi sono creato una funzione che oltre a permettere di aggiungere listener in modo crossbrowser ( risolvendo in IE il problema del this e dei listeners eseguiti in ordine arbitrario ) tiene traccia di tutti i listener aggiunti. In questo modo al posto di FireEvent o dispatchEvent uso una funzione che cicla tutti i listener e li esegue.
    Ne avevo creata una versione standalone tempo fa:
    codice:
    function $addListener(obj, ev, lis) {
    	if(!obj.events) obj.events = {}
    	if(!obj.events[ev]) obj.events[ev] = [];
    	obj.events[ev].push(lis);
    	if(obj.addEventListener)
    		obj.addEventListener(ev, lis, 0);
    	else if(obj.attachEvent && !obj.events.iefix) {
    		obj.events.iefix = true;
    		obj.attachEvent("on" + ev, function() {
    			$callListeners(obj, ev);
    		});
    	}
    }
    
    function $callListeners(obj, ev) {
    	for(var i = 0, l = obj.events[ev].length; i!=l; i++) {
    		obj.events[ev][i].call(obj);
    	}
    }
    
    
    window.onload = function() {
      var el =document.getElementsByTagName("body")[0];
      $addListener(el, "click", function() { alert(this.nodeType + this.events.click); });
      $addListener(el, "click", function() { alert(this.tagName); });
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.