Event handler πρόβλημα

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
cherouvim
Script Master
Δημοσιεύσεις: 3137
Εγγραφή: 13 Ιούλ 2005 22:56
Τοποθεσία: Athens, Greece
Επικοινωνία:

Event handler πρόβλημα

Δημοσίευση από cherouvim » 02 Αύγ 2006 17:59

Παίζω με τον εξαίσιο event handling μηχανισμό που έγραψε κάποιος guru.

Κώδικας: Επιλογή όλων

/* event handler
   http://www.thewatchmakerproject.com/journal/168/javascript-the-dom-addeventlistener-and-attachevent
*/
var Event = {
    add: function(obj,type,fn) {
        if (obj.attachEvent) {
            obj['e'+type+fn] = fn;
            obj[type+fn] = function() { obj['e'+type+fn](window.event); }
            obj.attachEvent('on'+type,obj[type+fn]);
        }
        else {
            obj.addEventListener(type,fn,false);
        }
    },
    remove: function(obj,type,fn) {
        if (obj.detachEvent) {
            obj.detachEvent('on'+type,obj[type+fn]);
            obj[type+fn] = null;
        }
        else {
            obj.removeEventListener(type,fn,false);
        }
    }
}

var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();
Έχω ένα anchor που του λέω:

Κώδικας: Επιλογή όλων

                Event.add(anchor, 'click', function() {
                    return confirm("are you sure?");
                });
Το return δεν δουλεύει, με αποτέλεσμα το anchor να γίνεται click είτε ο χρήστης επέλεξε OK, είτε CANCEL.
Δοκίμασα να κάνω Event.remove(anchor, 'click', anchor.onclick) για να αφαιρέσω την default λειτουργεία του click, αλλά δεν έιχα τύχη.

Έτσι δουλεύει...

Κώδικας: Επιλογή όλων

                        anchor.onclick=function() {
                            return confirm("are you sure?");
                        }
...αλλά φυσικά δεν θέλω να μπλέξω direct onclicks, με τον event handling μηχανισμό.

Καμία ιδέα;

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Event handler πρόβλημα

Δημοσίευση από skeftomilos » 03 Αύγ 2006 04:01

Ενδιαφέρον πρόβλημα. Αντί για...

Κώδικας: Επιλογή όλων

obj[type+fn] = function() { obj['e'+type+fn](window.event); }
...μπορεί να δοκιμαστεί το:

Κώδικας: Επιλογή όλων

obj[type+fn] = function() { return obj['e'+type+fn](window.event); }
...αλλά λύνει το πρόβλημα μόνο στον IE. Μια άλλη ιδέα είναι...

Κώδικας: Επιλογή όλων

Event.add(anchor, 'click', function(e) {
  var res = confirm("are you sure?");
  e.returnValue = res; // IE & Opera
  (!res && e.preventDefault) && e.preventDefault(); // Firefox
  return res // Γενικά να υπάρχει
});
...αλλά είναι τόσο χάλια που κάνει το onclick εντελώς προτιμότερο.

Btw το να χρησιμοποιείται ολόκληρο το body μίας συνάρτησης ως λεκτικό ιδιότητας ενός object είναι τουλάχιστον ανατριχιαστικό κατά τη γνώμη μου:

Κώδικας: Επιλογή όλων

obj['e'+type+fn] = fn;
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες