为了添加事件,我们可以使用这个简单的第一解决方案:
或者使用这个第二种解决方案(添加内联事件):
function AddEvent(html_element, event_name, event_function)
{
if(html_element.attachEvent) //Internet Explorer
html_element.attachEvent("on" + event_name, function() {event_function.call(html_element);});
else if(html_element.addEventListener) //Firefox & company
html_element.addEventListener(event_name, event_function, false); //don't need the 'call' trick because in FF everything already works in the right way
}
或者使用这个第二种解决方案(添加内联事件):
function AddEvent(html_element, event_name, event_function)
{
var old_event = html_element['on' + event_name];
if(typeof old_event !== 'function')
html_element['on' + event_name] = function() { event_function.call(html_element); };
else
html_element['on' + event_name] = function() { old_event(); event_function.call(html_element); };
}
这两种方法都是跨浏览器的,可以按以下方式使用:
AddEvent(document.getElementById('some_div_id'), 'click', function()
{
alert(this.tagName); //shows 'DIV'
});
我有一种感觉,attachEvent/addEventListener
在事件处理实现中使用更多,所以我想知道:
使用第二种方法有什么缺点/劣势,我最好知道吗?
我能看到两个,但我对更多的感兴趣(如果有的话):
- 第二个解决方案通过添加内联事件来破坏元素的innerHTML
- 使用第二个解决方案,我可以轻松地删除与特定事件类型相关联的所有函数(
html_element['on' + event_name] = null
),但我无法使用detachEvent/removeEventListener
来精确删除特定的函数。
任何像"使用jQuery"或其他框架的回答都是无意义的!
event
参数。 - Bergievent_function.call(…)
表达式中,处理程序被调用时没有传入event
! - Bergievent_function
并不是必须的。我同意您的观点,如果事件处理程序想要对事件进行操作,则需要使用事件参数。 - Marco Demaio