Bu kurulumda yanlış bir şey yok (veya var mı?), Ama biraz düzeltebilir miyim?
Bunun yerine olay yetkilendirmeyi kullanmaya bakın. Orası , gitmeyen bir kapta olayı izlediğiniz yer ve ardından olayın gerçekte nerede meydana geldiğini bulmak ve doğru şekilde ele almak için event.target
(veya event.srcElement
IE'de) kullanın.
Bu şekilde, işleyicileri yalnızca bir kez eklersiniz ve içerik değiştirdiğinizde bile çalışmaya devam ederler.
Herhangi bir yardımcı kitap kullanmadan olay yetkilendirmesine bir örnek:
(function() {
var handlers = {};
if (document.body.addEventListener) {
document.body.addEventListener('click', handleBodyClick, false);
}
else if (document.body.attachEvent) {
document.body.attachEvent('onclick', handleBodyClick);
}
else {
document.body.onclick = handleBodyClick;
}
handlers.button1 = function() {
display("Button One clicked");
return false;
};
handlers.button2 = function() {
display("Button Two clicked");
return false;
};
handlers.outerDiv = function() {
display("Outer div clicked");
return false;
};
handlers.innerDiv1 = function() {
display("Inner div 1 clicked, not cancelling event");
};
handlers.innerDiv2 = function() {
display("Inner div 2 clicked, cancelling event");
return false;
};
function handleBodyClick(event) {
var target, handler;
event = event || window.event;
target = event.target || event.srcElement;
while (target && target !== this) {
if (target.id) {
handler = handlers[target.id];
if (handler) {
if (handler.call(this, event) === false) {
if (event.preventDefault) {
event.preventDefault();
}
return false;
}
}
}
else if (target.tagName === "P") {
display("You clicked the message '" + target.innerHTML + "'");
}
target = target.parentNode;
}
}
function display(msg) {
var p = document.createElement('p');
p.innerHTML = msg;
document.body.appendChild(p);
}
})();
Canlı örnek
Sayfaya dinamik olarak eklenen mesajları tıklarsanız, eklenen yeni paragraflarda olayları kancalamak için bir kod olmasa bile tıklamanızın nasıl kaydedileceğini ve işleneceğini unutmayın. Ayrıca işleyicilerinizin bir haritadaki girişler olduğunu ve tüm dağıtımı yapan bir işleyicinizin document.body
olduğunu da unutmayın. Şimdi, muhtemelen bunu daha hedefli bir şeye dayandırıyorsunuz document.body
, ama fikri anladınız. Ayrıca, yukarıda temelde gönderiyoruz id
, ancak istediğiniz kadar karmaşık veya basit eşleştirme yapabilirsiniz.
JQuery , Prototype , YUI , Closure veya diğer birkaç gibi modern JavaScript kitaplıkları , tarayıcı farklılıklarını düzeltmek ve uç durumları temiz bir şekilde ele almak için olay yetkilendirme özellikleri sunmalıdır. jQuery kesinlikle hem ile, yapar live
ve delegate
size (ve daha sonra) CSS3 seçicileri bir dizi kullanarak yakalayabilmek izin işlevleri.
Örneğin, jQuery kullanan eşdeğer kod burada (ancak jQuery'nin yukarıda belirtilen ham sürümün uç durumları ele aldığından eminim):
(function($) {
$("#button1").live('click', function() {
display("Button One clicked");
return false;
});
$("#button2").live('click', function() {
display("Button Two clicked");
return false;
});
$("#outerDiv").live('click', function() {
display("Outer div clicked");
return false;
});
$("#innerDiv1").live('click', function() {
display("Inner div 1 clicked, not cancelling event");
});
$("#innerDiv2").live('click', function() {
display("Inner div 2 clicked, cancelling event");
return false;
});
$("p").live('click', function() {
display("You clicked the message '" + this.innerHTML + "'");
});
function display(msg) {
$("<p>").html(msg).appendTo(document.body);
}
})(jQuery);
Canlı kopya