【问题标题】:Javascript listens for events only on the last node specifiedJavascript 仅在指定的最后一个节点上侦听事件
【发布时间】:2013-07-26 23:02:35
【问题描述】:

所以我正在开发一个简单的 gui。问题是只有最后一个textarea 似乎受脚本影响。之前的一切都没有反应。 (查看截图)

document.addEventListener("DOMContentLoaded", function (){

// Interactive textareas
var txta = document.getElementsByTagName('textarea');
for (var i = 0; i < txta.length; i++){
    var earse = txta[i].value;
    console.log(earse); // debugging
    txta[i].addEventListener('focus', function(e){
        if (e.target.value === earse) {
            e.target.value = "";
            e.target.addEventListener('blur', function(e){
                if (e.target.value === "") {
                    e.target.value = earse;
                }
            }, false);
        }
    }, false);
    console.log(txta[i]); // debugging
};

}, false);

截图(http://i.imgur.com/HTsMypB.jpg):

HTML 只是几个简单的textarea,其值都在 html 中指定。

【问题讨论】:

    标签: javascript for-loop addeventlistener


    【解决方案1】:

    函数内部的闭包:

    document.addEventListener("DOMContentLoaded", function (){
    
    // Interactive textareas
    var txta = document.getElementsByTagName('textarea');
    for (var i = 0; i < txta.length; i++){
        var earse = txta[i].value;
        console.log(earse); // debugging
        (function(earse){
                txta[i].addEventListener('focus', function(e){
                        if (e.target.value === earse) {
                                e.target.value = "";
                                e.target.addEventListener('blur', function(e){
                                        if (e.target.value === "") {
                                                e.target.value = earse;
                                        }
                                }, false);
                        }
                }, false);
            })(earse);
        console.log(txta[i]); // debugging
    };
    
    }, false);
    

    http://jsfiddle.net/WjV8n/

    评论:您需要在循环中使用闭包变量earse。因为每一步你都会改变这个变量。

    【讨论】:

    • 我们真的需要一个规范的问题来链接到这些问题。他们每天出现几十次。
    • 我仍然不明白为什么我需要“在循环内关闭变量耳朵”。它应该只是工作,因为每次都应该覆盖变量。
    • @Johnny 好吧,earse === txta[txta.length] 在事件处理程序执行时。在 Mihail 的代码中,earse 作为参数传递给匿名函数。 for 循环无法更改此参数(它在匿名函数中是本地的),您可以保留 earse 的值,就像在事件处理程序中的迭代时一样。
    • 我知道他正在将耳朵传递给匿名函数。我不明白为什么没有它就不能工作。用javascript解释这段代码有什么区别。在我的示例中,它应该是这样的:earse 就是这样,添加事件侦听器 - 3 次。
    • Johnny:因为在 for 循环之后,earse ===(最后一个 textarea 的值)。在带参数的匿名函数中,每个文本区域都有自己的耳朵变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    相关资源
    最近更新 更多