Javascript 事件监听因使用匿名函数或命名函数而有所不同

标签 javascript events dom

我正在使用以下代码将一个文本区域的输入复制到另一个文本区域:

/**
 * Copies the values entered into the old description
 * into the new description, until the user focuses 
 * on the new description
 */
var DescriptionLinker = (function() {
    var elOldDescription,
        elNewDescription,
        linkIsBroken;

    this.init = function() {
        console.log('Initializing DescriptionLinker');
        elOldDescription = document.getElementById("old-description");
        elNewDescription = document.getElementById("new-description");
        linkIsBroken = false;

        linkDescriptions();
        watchLinkBreak();
    }

    // Assigns values to 'this'
    var finalize = function() {
        this.elOldDescription = elOldDescription;
        this.elNewDescription = elNewDescription;
    }

    var linkDescriptions = function() {
        elOldDescription.addEventListener("keyup", linkListener(), false);
    }

    var unlinkDescriptions = function() {
        elOldDescription.removeEventListener("keyup", linkListener(), false);
    }

    var linkListener = function(){
        elNewDescription.value = elOldDescription.value;
    }

    var watchLinkBreak = function() {
        console.log("Watching for link break");
        elNewDescription.addEventListener("focus", function(){
            unlinkDescriptions();
        });
    }

    finalize();
    return this;
})();

DescriptionLinker.init();

代码有效,但值未出现在 <textarea id="new-description"></textarea> 中直到我专注于文本区域。如果我将调用替换为 linkerfunction()使用相同的匿名函数,则值正确出现在 new-description 中我在 old-description 中键入的文本区域.有什么想法吗?

澄清一下,以下内容可以正常工作:

var linkDescriptions = function() {
    elOldDescription.addEventListener("keyup", function(){ 
         elNewDescription.value = elOldDescription.value;
    }, false);
}
var unlinkDescriptions = function() {
    elOldDescription.removeEventListener("keyup", function(){ 
         elNewDescription.value = elOldDescription.value;
    }, false);
}

所有这一切的 PS 原因是从旧系统过渡 :p

最佳答案

当然!当你传递一个定义的函数代替匿名函数时,你省略了 (),否则这个函数将在编译后立即被调用。所以,改变

lOldDescription.addEventListener("keyup", linkListener(), false);

lOldDescription.addEventListener("keyup", linkListener, false);
                                                      ^^ bye bye ()

关于Javascript 事件监听因使用匿名函数或命名函数而有所不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19943724/

相关文章:

javascript - Enter 触发表单提交

javascript - Math.floor() 不适合我

PHP 简单 HTML DOM 解析器,在没有类和 ID 的标签内查找文本

javascript - 需要事件处理程序时切换类问题

.net - 需要事件以在计时器事件上执行,节拍器精度

javascript - 根据内容文本更改背景颜色

javascript - 随机排序数组

javascript - 获取响应 header /正文

javascript - ipad ios 5 上 iframe 内的文本输入或 textarea 元素不支持事件

javascript - React 中的 throttle