【发布时间】:2019-04-02 00:32:57
【问题描述】:
我有一个模块化系统,它从我的服务器获取一些数据并通过 ajax 将其返回给客户端,然后客户端对这些数据进行处理。
为了保持代码模块化,我想引入一个回调变量,这样我就可以指定一个回调函数,该函数会根据请求的数据而变化。这最好插入到与功能相关的元素中(即按钮或输入)
现在我将回调函数名称存储在 dom 中,作为元素 data-callback="functionName" 属性,然后 eval()ing 该值以运行回调。
sn-p:
document.addEventListener( 'click', function( evt ){
var tgt = evt.target;
if( tgt.id == "btn" ){
var callback = tgt.dataset.callback;
var callbackParam = tgt.dataset.callbackParam;
eval( callback + "('" + callbackParam + "')" );
}
});
function foo( str ){
document.getElementById( "returnDisplay" ).innerText = str;
window.setTimeout( function(){
document.getElementById( "returnDisplay" ).innerText = '';
}, 1000 );
}
<div id=returnDisplay></div>
<button id=btn data-callback="foo" data-callback-param="bar">Click me</button>
我知道 eval 被认为是危险的,有没有其他方法可以通过 DOM 将回调传递给 javascript?
【问题讨论】:
-
为什么不直接绑定事件呢?
-
@Ele,我猜是习惯,我喜欢处理 dom 上的所有事件,所以我只绑定一个事件,然后检查事件目标以执行它。这意味着当我向 DOM 添加元素时,我不需要为我使用 javascript 创建的每个元素分配事件,而是我可以放心,事件将在 DOM 根目录中被提取并相应地过滤掉。我自己编的,是不是坏主意?
标签: javascript ajax callback dataset