[英]How to simplify multiple functions that have different ids
我想简化以下代码:
var filesystem = new fp.FloorplanFilesystem(myFloorplan, fp.FILESYSTEM_UI_STATE);
document.getElementById("newFloorplan").addEventListener("click", function (event) {
filesystem.newFloorplan();
event.preventDefault();
});
document.getElementById("showOpenWindow").addEventListener("click", function (event) {
filesystem.showOpenWindow();
event.preventDefault();
});
document.getElementById("saveFloorplan").addEventListener("click", function (event) {
filesystem.saveFloorplan();
event.preventDefault();
});
document.getElementById("saveFloorplanAs").addEventListener("click", function (event) {
filesystem.saveFloorplanAs();
event.preventDefault();
});
document.getElementById("showRemoveWindow").addEventListener("click", function (event) {
filesystem.showRemoveWindow();
event.preventDefault();
});
它开始占用大量空间,看起来很乱。
只需使用ID和函数名称的动态值调用包装函数:
var filesystem = new fp.FloorplanFilesystem(myFloorplan, fp.FILESYSTEM_UI_STATE);
function bindEvent(id, callbackFunction) {
document.getElementById(id).addEventListener('click', function (event)) {
event.preventDefault();
filesystem[callbackFunction]();
}
}
bindEvent('newFloorplan', 'newFloorplan');
bindEvent('showOpenWindow', 'showOpenWindow');
...
您可以使用括号表示法通过包含字符串的变量来访问对象的属性。
var filesystem = new fp.FloorplanFilesystem(myFloorplan, fp.FILESYSTEM_UI_STATE); ["newFloorplan", "showOpenWindow", "saveFloorplan", "saveFloorplanAs", "showRemoveWindow"].forEach(function(id){ var el = document.getElementById(id); el.addEventListener('click', function(event){ filesystem[id](); event.preventDefault(); }); });
const filesystem = new fp.FloorplanFilesystem (myFloorplan, fp.FILESYSTEM_UI_STATE)
const ids = ['newFloorplan', 'showOpenWindow', 'saveFloorplan', 'saveFloorplanAs', 'showRemoveWindow']
const handler = id => event => (filesystem [id] (), event.preventDefault ())
ids.forEach (id => document.getElementById (id).addEventListener ('click', handler (id)))
由于您的元素使用您要调用的函数的名称作为其ID,因此您可以在事件处理程序中提取它:
var filesystem = new fp.FloorplanFilesystem(myFloorplan, fp.FILESYSTEM_UI_STATE);
function fs_handler(event) {
filesystem[event.target.id]();
event.preventDefault();
}
["newFloorplan", "showOpenWindow", "saveFloorplan", "saveFloorplanAs", "showRemoveWindow"].forEach(function(id) {
document.getElementById(id).addEventHandler('click', fs_handler);
});
这通常比为每个项目创建新的回调函数对象更受欢迎。
此外,如果可点击元素都共享一个共同的父元素,您只需通过事件委派就可以注册事件处理程序,从而无需单独注册每个按钮。
我的命题(es6) - “头部代码”:
[
"newFloorplan",
"showOpenWindow",
"saveFloorplan",
"saveFloorplanAs",
"showRemoveWindow",
].map(id=>document.getElementById(id).addEventListener('click', event=>{
filesystem[id]();
event.preventDefault()
}));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.