Javascript事件检测

问题描述:

我找不到任何有关这个令人惊讶的好文档,所以我在这里发布它。Javascript事件检测

什么是原始的JavaScript equivilent这样:

$(elem).click(function(){ 
    alert(this.text()); 
}); 

所有我能找到的是这<elem onlick="func()" />这是不是我想要的,我希望能够的范围内只是用JavaScript来做到这一点不元件。

假设elem是元素节点(如果没有,你需要将自己的选择工作,投入使用的getElementById或其他):

elem.onclick= function() { 
    var text= 'textContent' in elem? elem.textContent : elem.innerText; 
    alert(text); 
}; 

textContent是从元素获取文本的标准兼容方式; innerText是IE的方式。 (有一些差异,但希望没有什么会影响你的。)如果你需要支持旧的/模糊的浏览器,你既不必做枯燥乏味的树形漫步来拾取所有文本(这是jQuery的text()所做的。)

(我假设这是你从this.text()想要什么那倒不用实际工作 - 想必你的意思$(this).text()

+0

以秒击败我:) – 2010-04-30 09:48:30

+2

我喜欢简单的JS问题打字的比赛! – bobince 2010-04-30 09:51:44

+0

@Tim:他们确实说过伟大的思想家一样的想法;-) – 2010-04-30 09:52:26

你可以做object.onclick = handler

var el = document.getElementById('elem'); 
elem.onclick = function(){ alert("Clicked!") }; 

这应该工作 - 我对JavaScript的有点举步维艰的今天!

也许你需要类似的东西:

document.getElementById('element_id').setAttribute("onclick","alert('hello world')"); 
+4

不要在HTML文档上使用'setAttribute'。 IE中存在一些bug,这会阻止许多工作属性,包括'onclick'和所有其他事件处理程序。使用像'elem.onclick = function(){...};'这样的DOM Level 1 HTML属性代替它们:它们更可靠,更易于阅读。 – bobince 2010-04-30 09:47:50

有几种方法可以附加一个单击处理程序不使用库。首先是分配功能元素的on[eventname]属性:

element.onclick = function (eventObj) { 
    alert("textContent" in this ? this.textContent : this.innerText) 
} 

您也可以将一串代码进行评估,但它不是漂亮,通常避免。另一种方法是使用W3C标准addEventListener

element.addEventListener("click", function (eventObj) { 
    alert("textContent" in this ? this.textContent : this.innerText) 
}, false); 

这不是由IE浏览器的最新版本需要attachEvent,而不是支持:

element.attachEvent("onclick", function() { 
    alert(event.srcElement.innerText); 
}); 

IE浏览器应用的功能,引发该元素的问题事件,因此this将不会正确指向该元素与attachEvent

第一种方法element.onclick对x浏览器的兼容性和快速编码很有用,但是您只能将一个函数分配给属性。使用attachEventaddEventListener您可以添加尽可能多的功能,只要您喜欢,它们都会正确触发。您可以创建一个跨浏览器的半等价物,在您的代码中执行简单的功能检查:

if ("addEventListener" in element) 
    element.addEventListener("click", function (eventObj) { 
     alert("textContent" in this ? this.textContent : this.innerText) 
    }, false); 
else 
    element.attachEvent("onclick", function() { 
     alert(event.srcElement.innerText); 
    }); 
+1

功能检测的好方法! – 2010-04-30 09:57:21

+2

+1对传统事件处理程序与听众的利弊有很好的解释。 (更详细的比我可以打扰键入:-))我肯定会首先检查是否存在标准的'addEventListener',以便首选使用该方法(Opera,IE9)。 – bobince 2010-04-30 10:11:26