我正在使用以下代码将一个文本区域的输入复制到另一个文本区域:
/**
* 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/