通过数组和FOR循环添加事件监听器
Add Event Listeners via an Array and FOR Loop
前几天遇到了点小问题。我试图精简我的代码尽可能多,我现在已经到了我试图通过JavaScript添加事件监听器的阶段,所以我的HTML看起来更整洁。
html片段——
<input type="button" id="googleSearchButton" />
<input type="button" id="youtubeSearchButton" />
<input type="button" id="wikiSearchButton" />
<input type="button" id="facebookSearchButton" />
<input type="button" id="twitterSearchButton" />
<input type="button" id="tumblrSearchButton" />
<input type="button" id="dropboxSearchButton" />
JavaScript片段
var contIDArray = ["google", "youtube", "wiki", "facebook", "twitter", "tumblr", "dropbox"];
window.load = initAll();
function initAll(){
applyProperties();
}
function applyProperties(){
for (var i = 0; i < contIDArray.length; i++){
addEventListeners(contIDArray[i] + "SearchButton");
}
}
function addEventListeners(id){
document.getElementById(id).addEventListener("click", testAlert(id), false);
}
function testAlert(id){
alert(id + " clicked")
}
,我希望,你可以看到,FOR循环将循环,直到它用完容器数组中的值。每次它都会输出数组中的位置,后面跟着"SearchButton"。例如,第一次循环时它将输出"googleSearchButton",第二次循环时输出"youtubeSearchButton",以此类推。
现在,我知道FOR循环适用于应用属性,因为我用它来应用按钮值和文本框占位符文本在我的项目的其他部分。
我让它添加了一个简单的测试函数("testAlert()"),并设置它传递调用它的元素的id。我已经设置好了,所以一旦事件监听器被添加,我就可以简单地点击每个按钮,它会提醒它的id,并告诉我它已经被点击了。
现在,理论上,我认为这是可行的。但是,FOR循环似乎触发了"addEventListeners"函数,该函数反过来又添加了事件侦听器,以便在单击时触发"testAlert"。但是它只会在添加事件监听器后立即触发"testAlert"函数,而不会在单击时触发。
我很抱歉,如果这看起来有点太长了,我的解释总是太长了。希望你能从我的代码中看到我想要完成的东西,而不是我的解释。帮助将是非常感激的。:)
你离目标很近了,但还是有一些地方不对。
首先,你不能只做id.addEventListener
。你需要做document.getElementById(id).addEventListener
。id
只是一个字符串,你需要一个DOMElement。
第二,当您执行testAlert(id)
时,您正在运行该函数,然后将其返回值(undefined
)分配为事件侦听器。你需要传递一个函数。像这样:
id.addEventListener("click", function(){
testAlert(this.id); // this is the DOMElement you clicked on
}, false);
尽管我建议给你所有的按钮添加一个类,然后像这样添加事件。
<input type="button" id="googleSearchButton" class="searchButton" />
<input type="button" id="youtubeSearchButton" class="searchButton" />
<input type="button" id="wikiSearchButton" class="searchButton" />
<input type="button" id="facebookSearchButton" class="searchButton" />
<input type="button" id="twitterSearchButton" class="searchButton" />
<input type="button" id="tumblrSearchButton" class="searchButton" />
<input type="button" id="dropboxSearchButton" class="searchButton" />
然后:
var buttons = document.getElementsByClassName('searchButton');
for(b in buttons){
if(buttons.hasOwnProperty(b)){
buttons[b].addEventListener("click", function(){
testAlert(this.id); // this is the DOMElement you clicked on
}, false);
}
}
注意:addEventListener
和getElementsByClassName
可能无法在所有浏览器中使用(我的意思是它们可能无法在IE中工作)。这就是为什么很多网站使用JavaScript库,比如jQuery。jQuery为您处理所有跨浏览器的东西。如果你想使用jQuery,你可以这样做:
$('.searchButton').click(function(){
testAlert(this.id);
});
注2:在JavaScript中,函数是变量,可以作为参数传递。
document.getElementById(id).addEventListener('click', testAlert, false);
注意testAlert
之后没有()
,我们传递的是函数本身,当你传递testAlert()
时,你传递的是它的返回值。如果你这样做,testAlert
将需要修改一点:
function testAlert(){
alert(this.id + " clicked")
}
变化:
function addEventListeners(id){
id.addEventListener("click", testAlert(id), false);
}
为:
function addEventListeners(id){
document.getElementById(id).addEventListener("click", testAlert(id), false);
}
否则,您将对字符串应用addEventListener
。在任何情况下,将addEventListener
替换为对事件的赋值,如onClick
。
id看起来像一个字符串。所以不如这样做:
function addEventListeners(id){
var obj = document.getElementById(id);
obj.addEventListener("click", testAlert(id), false);
}
同样,下面是工作代码:
http://jsfiddle.net/ZRZY9/2/obj.addEventListener("click", function() { testAlert(id); }, true);
正如Rocket上面提到的"你正在调用它并将事件设置为返回值undefined"。
坏消息是Internet Explorer 7目前不支持addEventListener()
我浏览了你的代码。我遇到的最初问题是,您试图在创建文档中的元素之前找到它们。窗口。onLoad在页面完成之前触发。我使用body标签的onload属性测试了这一点,它是这样工作的。
因此,这是前面提到的试图通过使用"id"字符串查找元素的问题和在页面完全加载之前触发的函数的组合。
不管怎样,很高兴你把它修好了!
这是我在结尾的javascript:
<script>
var contIDArray = ["google", "youtube", "wiki", "facebook", "twitter", "tumblr", "dropbox"];
function initAll(){
applyProperties();
}
function applyProperties(){
for (var i = 0; i < contIDArray.length; i++){
var newString = contIDArray[i] + "SearchButton"
addEventListeners(newString);
}
}
function addEventListeners(id){
document.getElementById(id).addEventListener("click", testAlert, false);
}
function testAlert(){
alert(this.id + " clicked")
}
</script>
- 如何在for循环中添加事件侦听器
- 如果选中了多个复选框,如何添加事件
- 正在ng重复元素上添加事件
- 在动态创建的标记上添加事件
- 如何在HTML列表中添加事件's子弹
- 将事件侦听器添加到文档,而不是签入元素存在,然后添加事件侦听器
- jQuery完整日历添加事件,仅包含月份和日期
- 是否可以在数字输入框中的小按钮中添加事件侦听器
- 在Google Chrome扩展中添加事件侦听器
- AngularJS:在.post()之后添加事件侦听器
- 对象 Javascript 中的标签无效 - 想要添加事件列表器
- 添加事件侦听器不起作用
- 如何为angular js条形图添加事件
- 在 http 请求中添加事件侦听器 ( request.on ) 是什么意思?而笏就是它的用途
- Iron:路由器在更改路由器上添加事件
- 如何为表行结果的每个按钮添加事件侦听器
- 在 javascript 中添加事件处理程序的位置
- YouTube API-动态添加事件侦听器
- 在聚合物的子菜单标题中添加事件
- 检查是否可以添加事件侦听器而不添加