Javascript事件处理程序-为什么起作用?

散乱

我是javascript新手,可以从下面的代码中看出来。我想为页面上的6个按钮创建事件处理程序。单击按钮后,按钮下方的代码块的显示属性将从“无”更改为“块”。为此,我需要将每个按钮与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"等。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Javascript遍历<li>列表并分配事件(onitemclick)处理程序不起作用-为什么?

来自分类Dev

Javascript事件处理程序不起作用

来自分类Dev

JavaScript事件处理程序不起作用

来自分类Dev

当我具有触摸事件处理程序时,为什么我的鼠标事件处理程序不起作用?

来自分类Dev

为什么悬停在委托事件处理程序中不起作用?

来自分类Dev

为什么触摸事件不起作用?

来自分类Dev

为什么多处理不起作用?

来自分类Dev

JavaScript按钮事件处理程序不起作用

来自分类Dev

为什么该程序不起作用?

来自分类Dev

为什么程序不起作用?

来自分类Dev

为什么我的信号处理程序不起作用?

来自分类Dev

为什么XUL负载处理程序不起作用?

来自分类Dev

为什么我的信号处理程序不起作用?

来自分类Dev

为什么img上的onclick处理程序不起作用?

来自分类Dev

JavaScript函数-为什么起作用?

来自分类Dev

为什么javascript函数不起作用?

来自分类Dev

Javascript 代码不起作用。为什么?

来自分类Dev

删除JavaScript事件:为什么此示例不起作用?

来自分类Dev

为什么我的JavaScript验证程序不起作用?

来自分类Dev

OnChange事件处理程序不起作用

来自分类Dev

Opencart事件处理程序不起作用

来自分类Dev

Opencart事件处理程序不起作用

来自分类Dev

onclick事件处理程序不起作用

来自分类Dev

为什么document.ready中的事件处理函数起作用但取出后不起作用?

来自分类Dev

为什么WindowStateChange事件对我不起作用

来自分类Dev

为什么窗口onscroll事件不起作用?

来自分类Dev

为什么oncreate事件中的方法不起作用?

来自分类Dev

为什么使用ajax的全日历事件不起作用?

来自分类Dev

为什么保存事件在云代码中不起作用?

Related 相关文章

  1. 1

    Javascript遍历<li>列表并分配事件(onitemclick)处理程序不起作用-为什么?

  2. 2

    Javascript事件处理程序不起作用

  3. 3

    JavaScript事件处理程序不起作用

  4. 4

    当我具有触摸事件处理程序时,为什么我的鼠标事件处理程序不起作用?

  5. 5

    为什么悬停在委托事件处理程序中不起作用?

  6. 6

    为什么触摸事件不起作用?

  7. 7

    为什么多处理不起作用?

  8. 8

    JavaScript按钮事件处理程序不起作用

  9. 9

    为什么该程序不起作用?

  10. 10

    为什么程序不起作用?

  11. 11

    为什么我的信号处理程序不起作用?

  12. 12

    为什么XUL负载处理程序不起作用?

  13. 13

    为什么我的信号处理程序不起作用?

  14. 14

    为什么img上的onclick处理程序不起作用?

  15. 15

    JavaScript函数-为什么起作用?

  16. 16

    为什么javascript函数不起作用?

  17. 17

    Javascript 代码不起作用。为什么?

  18. 18

    删除JavaScript事件:为什么此示例不起作用?

  19. 19

    为什么我的JavaScript验证程序不起作用?

  20. 20

    OnChange事件处理程序不起作用

  21. 21

    Opencart事件处理程序不起作用

  22. 22

    Opencart事件处理程序不起作用

  23. 23

    onclick事件处理程序不起作用

  24. 24

    为什么document.ready中的事件处理函数起作用但取出后不起作用?

  25. 25

    为什么WindowStateChange事件对我不起作用

  26. 26

    为什么窗口onscroll事件不起作用?

  27. 27

    为什么oncreate事件中的方法不起作用?

  28. 28

    为什么使用ajax的全日历事件不起作用?

  29. 29

    为什么保存事件在云代码中不起作用?

热门标签

归档