【发布时间】:2016-02-05 18:29:39
【问题描述】:
我试图在我的代码中减少重复次数。在我的一些包含许多元素的代码中,我觉得我做的太多了。是时候学习如何减少代码并遵循 DRY 技术了。
下面的代码是我当前如何将 eventListeners 附加到我的元素。
var at1, at2 ,at3 ,at4 ,at5 ,at6 , at7, at8,
at1 = UI.byId("at1");
at1.addEventListener("click", UI.at1Func, false);
at2 = UI.byId("at2");
at2.addEventListener("click", UI.at2Func, false);
at3 = UI.byId("at3");
at3.addEventListener("click", UI.at3Func, false);
at4 = UI.byId("at4");
at4.addEventListener("click", UI.at4Func, false);
at5 = UI.byId("at5");
at5.addEventListener("click", UI.at5Func, false);
at6 = UI.byId("at6");
at6.addEventListener("click", UI.at6Func, false);
at7 = UI.byId("at7");
at7.addEventListener("click", UI.at7Func, false);
at8 = UI.byId("at8");
at8.addEventListener("click", UI.at8Func, false);
我一直在尝试使用 forEach 循环。但我遇到了功能问题。对于初学者来说,该功能似乎被抢先触发。而且因为我希望我的主要负载能够反映任何变化,所以它会创建无限循环并崩溃。我正在使用 VS2015,我尝试使用没有任何库的普通 JS 编写...请不要使用 jquery。
这是我在 forEach 循环中的尝试:请参阅底部的编辑。
var ats = ['at1', 'at2', 'at3', 'at4', 'at5', 'at6', 'at7', 'at8'];
ats.forEach(function (key) {
var ele = UI.byId(key);
ele.addEventListener("click", UI.atFunc(key), false);
});
该函数在我的“UI.myLoad”代码块中。这是 UI.atFunc(key)...
atFunc: function (key) {
var value = localStorage.getItem(key);
localStorage.setItem(key, value++);
console.log(key);
//UI.myLoad(); //commented out to prevent crashing for now.
},
预期的行为是,当单击任何键时,应将 1 个整数的值添加到其在本地存储中的透视项目中,并且 UI.myLoad 仅加载应用程序上的主要主题、值和超时。但是因为我的 forLoop 在那个代码块中,所以它会导致崩溃。我将它移到 UI.myLoad 的范围之外,但它根本不起作用。代码有问题吗?还是我以错误的方式解决这个问题,应该尝试只使用 for 循环?我见过 forEach 正常工作的例子,但我自己做不到。
[编辑:下面的代码是使用公认答案的解决方案,但发现了另一个问题。现在确定了完整的解决方案。]
(function () {
var UI;
UI = {
byId: function (id) {
return document.getElementById(id);
},
loadBtns: function () {
var ats = ['at1', 'at2', 'at3', 'at4', 'at5', 'at6', 'at7', 'at8'];
ats.forEach(function (key) {
var ele = UI.byId(key);
ele.addEventListener("click", UI.atFunc(key), false);
});
},
myLoad: function () {
//load and refresh elements
/*
var at1 = localStorage.getItem("at1");
if (!at1) {
spn1.innerText = 0;
}
if (at1) {
spn1.innerText = at1;
}
....
*/
},
atFunc: function (key) {
return function() {
var value = localStorage.getItem(key);
localStorage.setItem(key, +value + +1);
UI.myLoad();
};
}
}
window.onload = function () {
UI.myLoad();
UI.loadBtns();
}
}())
【问题讨论】:
-
你想给它附加一个函数,而不是立即运行它。从
atFunc返回一个新函数。 -
我进行了编辑,但函数以指数方式返回
标签: javascript foreach