Javascript 事件处理程序 - 为什么这样做有效?
Javascript Event handler - why did this work?
我是 javascript 的新手,您可以从下面的代码中看出这一点。我想为页面上的 6 个按钮创建一个事件处理程序。单击按钮时,按钮下方代码块的显示属性从 "none" 更改为 "block"。为此,我需要将每个按钮与 html 的一个部分相关联(在本例中为具有唯一 ID 的标签 - pt1、pt2 等)。
我为此苦苦挣扎了一段时间,并让下面的代码开始工作。这就是问题所在!事实证明我完全错了。但是,作为一个新手,当它起作用时,我认为我正在做某事。因为我在这上面花了几个小时,所以我需要知道为什么下面的代码有效(这样我会觉得我学到了一些东西)。我将突出显示代码中我无法终生验证其工作原理的部分。
var buttons = document.getElementsByClassName("CSS");
for (var i = 0; i < buttons.length; i++) {
// Generate strings associated with the button ids and the event handlers for each button
var buttonID = "button" + i;
var clickHandlerID = "clickHandler" + i;
var buttonEH = document.getElementById(buttonID);
// Identify the button elements by id
// As clickHandlerID is a string, to get the browser to recognise it as a function name
var clickHandler = window[clickHandlerID];
buttonEH.addEventListener("click", clickHandler, false);
}
/*****************************************************************************/
// Why does this work?
// clickHandler1, clickHandler2, etc are not referenced in my event handler.
// My botched attempt to create them in the event handler (var clickHandler = window[clickHandlerID];)
// resulted in "undefined" values (from console.log(clickHandler)).
// Yet it worked?!?! (I did eventually find the correct approach, a simple 10 line solution,
// but I am troubled that I don't understand what is going on here. Any help would be greatly appreciated!!)
/*****************************************************************************/
function clickHandler1 () {
if (pt1.style.display === "block") {
pt1.style.display = "none";
} else {
pt1.style.display = "block";
}
}
function clickHandler2 () {
if (pt2.style.display === "block") {
pt2.style.display = "none";
} else {
pt2.style.display = "block";
}
}
var buttons = document.getElementsByClassName("CSS");
for (var i = 0; i < buttons.length; i++) {
// Generate strings associated with the button ids and the event handlers for each button
var buttonID = "button" + i;
var clickHandlerID = "clickHandler" + i;
var buttonEH = document.getElementById(buttonID);
// Identify the button elements by id
// As clickHandlerID is a string, to get the browser to recognise it as a function name
var clickHandler = window[clickHandlerID];
console.log(clickHandler);
buttonEH.addEventListener("click", clickHandler, false);
}
/*****************************************************************************/
// Why does this work?
// clickHandler1, clickHandler2, etc are not referenced in my event handler.
// My botched attempt to create them in the event handler (var clickHandler = window[clickHandlerID];)
// resulted in "undefined" values (from console.log(clickHandler)).
// Yet it worked?!?! (I did eventually find the correct approach, a simple 10 line solution,
// but I am troubled that I don't understand what is going on here. Any help would be greatly appreciated!!)
/*****************************************************************************/
function clickHandler0 () {
if (pt0.style.display === "block") {
pt0.style.display = "none";
} else {
pt0.style.display = "block";
}
}
function clickHandler1 () {
if (pt1.style.display === "block") {
pt1.style.display = "none";
} else {
pt1.style.display = "block";
}
}
function clickHandler2 () {
if (pt2.style.display === "block") {
pt2.style.display = "none";
} else {
pt2.style.display = "block";
}
}
#pt0, #pt1, #pt2, #pt3 {
display: none;
}
<button id="button0" class="CSS">button 1</button>
<button id="button1" class="CSS">button 2</button>
<button id="button2" class="CSS">button 3</button>
<div id="pt0">PT1</div>
<div id="pt1">PT2</div>
<div id="pt2">PT3</div>
在顶级范围内定义的所有函数和变量都成为 window
对象的属性。所以 window['clickHandler1']
等价于 clickHandler1
。您的代码:
var clickhandler = window[clickHandlerID];
当 clickHandlerID
设置为 "clickHandler1"
、"clickHandler2"
等字符串时
我是 javascript 的新手,您可以从下面的代码中看出这一点。我想为页面上的 6 个按钮创建一个事件处理程序。单击按钮时,按钮下方代码块的显示属性从 "none" 更改为 "block"。为此,我需要将每个按钮与 html 的一个部分相关联(在本例中为具有唯一 ID 的标签 - pt1、pt2 等)。
我为此苦苦挣扎了一段时间,并让下面的代码开始工作。这就是问题所在!事实证明我完全错了。但是,作为一个新手,当它起作用时,我认为我正在做某事。因为我在这上面花了几个小时,所以我需要知道为什么下面的代码有效(这样我会觉得我学到了一些东西)。我将突出显示代码中我无法终生验证其工作原理的部分。
var buttons = document.getElementsByClassName("CSS");
for (var i = 0; i < buttons.length; i++) {
// Generate strings associated with the button ids and the event handlers for each button
var buttonID = "button" + i;
var clickHandlerID = "clickHandler" + i;
var buttonEH = document.getElementById(buttonID);
// Identify the button elements by id
// As clickHandlerID is a string, to get the browser to recognise it as a function name
var clickHandler = window[clickHandlerID];
buttonEH.addEventListener("click", clickHandler, false);
}
/*****************************************************************************/
// Why does this work?
// clickHandler1, clickHandler2, etc are not referenced in my event handler.
// My botched attempt to create them in the event handler (var clickHandler = window[clickHandlerID];)
// resulted in "undefined" values (from console.log(clickHandler)).
// Yet it worked?!?! (I did eventually find the correct approach, a simple 10 line solution,
// but I am troubled that I don't understand what is going on here. Any help would be greatly appreciated!!)
/*****************************************************************************/
function clickHandler1 () {
if (pt1.style.display === "block") {
pt1.style.display = "none";
} else {
pt1.style.display = "block";
}
}
function clickHandler2 () {
if (pt2.style.display === "block") {
pt2.style.display = "none";
} else {
pt2.style.display = "block";
}
}
var buttons = document.getElementsByClassName("CSS");
for (var i = 0; i < buttons.length; i++) {
// Generate strings associated with the button ids and the event handlers for each button
var buttonID = "button" + i;
var clickHandlerID = "clickHandler" + i;
var buttonEH = document.getElementById(buttonID);
// Identify the button elements by id
// As clickHandlerID is a string, to get the browser to recognise it as a function name
var clickHandler = window[clickHandlerID];
console.log(clickHandler);
buttonEH.addEventListener("click", clickHandler, false);
}
/*****************************************************************************/
// Why does this work?
// clickHandler1, clickHandler2, etc are not referenced in my event handler.
// My botched attempt to create them in the event handler (var clickHandler = window[clickHandlerID];)
// resulted in "undefined" values (from console.log(clickHandler)).
// Yet it worked?!?! (I did eventually find the correct approach, a simple 10 line solution,
// but I am troubled that I don't understand what is going on here. Any help would be greatly appreciated!!)
/*****************************************************************************/
function clickHandler0 () {
if (pt0.style.display === "block") {
pt0.style.display = "none";
} else {
pt0.style.display = "block";
}
}
function clickHandler1 () {
if (pt1.style.display === "block") {
pt1.style.display = "none";
} else {
pt1.style.display = "block";
}
}
function clickHandler2 () {
if (pt2.style.display === "block") {
pt2.style.display = "none";
} else {
pt2.style.display = "block";
}
}
#pt0, #pt1, #pt2, #pt3 {
display: none;
}
<button id="button0" class="CSS">button 1</button>
<button id="button1" class="CSS">button 2</button>
<button id="button2" class="CSS">button 3</button>
<div id="pt0">PT1</div>
<div id="pt1">PT2</div>
<div id="pt2">PT3</div>
在顶级范围内定义的所有函数和变量都成为 window
对象的属性。所以 window['clickHandler1']
等价于 clickHandler1
。您的代码:
var clickhandler = window[clickHandlerID];
当 clickHandlerID
设置为 "clickHandler1"
、"clickHandler2"
等字符串时