什么';这部分代码的目的是在这个JS addEvent函数中实现;Pro-JavaScript技术;?

什么';这部分代码的目的是在这个JS addEvent函数中实现;Pro-JavaScript技术;?,javascript,event-listener,Javascript,Event Listener,在“Pro JavaScript技术”一书中,有一个带有以下代码的addEvent函数: function addEvent(element, type, handler) { // assign each event handler a unique ID if (!handler.$$guid) handler.$$guid = addEvent.guid++; // create a hash table of event types for the elemen

在“Pro JavaScript技术”一书中,有一个带有以下代码的
addEvent
函数:

function addEvent(element, type, handler) {
    // assign each event handler a unique ID
    if (!handler.$$guid) handler.$$guid = addEvent.guid++;

    // create a hash table of event types for the element
    if (!element.events) element.events = {};

    // create a hash table of event handlers for each element/event pair
    var handlers = element.events[type];
    if (!handlers) {
        handlers = element.events[type] = {};

        // What's the purpose of this if???
        // store the existing event handler (if there is one)
        if (element["on" + type]) {
            handlers[0] = element["on" + type];
        }
    }

    // store the event handler in the hash table
    handlers[handler.$$guid] = handler;

    // assign a global event handler to do all the work
    element["on" + type] = handleEvent;
}
现在我了解了其中的大部分内容,并且了解到为每个元素/事件对创建事件处理程序的
哈希表只为每个元素/事件创建一个
。只有在第一次将事件处理程序添加到没有该事件的前一个事件处理程序的元素时,才会创建该事件处理程序。但是我不理解
存储现有事件处理程序(如果有)
部分。在这本书中没有提到它,注释
存储现有的事件处理程序(如果有)
(什么事件处理程序?)也没有向我解释清楚。它的目的是什么


谢谢你的关注。

致,嗯。。。以存储现有的处理程序


添加事件时,如果该事件已经有一个处理程序,并且您正在将同一类型的第二个事件绑定到同一元素,那么它将保存现有的处理程序,并基本上将新的处理程序附加到该处理程序。否则,您将覆盖旧事件,此“addEvent”功能旨在防止旧事件。

如果打开????已分配处理程序,然后将其存储。。。例如element.onclick、element.onchange、element.onblur等,但我没有通过on???分配处理程序,因此我编写了这样一个
addEvent
函数,因为我不想使用
onclick
而是
addEvent(element,“click”,fn)。它是否指可能通过
on???
属性添加事件的外部库代码?@tonix您可能不是唯一一个向页面中的元素添加侦听器的人。如果是的话,您当然不需要所有这些粗糙的东西(如果您坚持使用标准DOM事件并使用addEventListener,您可能永远都不需要它)。
但是我没有在上分配处理程序???
很好,但是如果您这样做了,它会保存它。此代码是通用的,并没有考虑到您的确切需求。如果你想改变它,那就改变它,保持现状没有坏处,改变它有潜在的坏处。。。你的选择,艾伯塔,真的不用担心。这是为了在一个元素上添加许多内联事件,但您不应该这样做。使用addEventListener()而不是内联事件。这本书要么是真的过时了,要么写得很糟糕。好吧,它的目的是保存一个处理程序,例如,一个库可能通过元素的“onxxxx”属性添加了这个处理程序?