javascript - 如何从数据属性执行功能
问题描述
<div id='dgok' data-fn="delbanner('banners')">OK</div>
js
$('#dgok').click(function(){
let fn = $(this).attr('data-fn');
console.log(fn) // delbanner('banners')
fn();
});
错误:
Uncaught TypeError: fn is not a function
在这种情况下如何执行delbanner('banners')
(点击dgok
)?
解决方案
避免eval
您可以尝试基于通过某些容器访问函数的方法(window
例如):
const fnContainer = window;
$('#dgok').click(function(){
const fn = $(this).attr('data-fn');
const fnName = fn.substring(0, fn.indexOf('(')); // 'delbanner'
const fnArg = fn.substring(fn.indexOf('(') + 2, fn.length - 2); // 'banners'
if (typeof fnContainer[fnName] === 'function') {
fnContainer[fnName].apply(fnContainer, [fnArg]); // window[fnName](fnArg);
}
});
在这里,我假设您的函数已定义window
并具有 1 个字符串参数。
将函数参数放在单独的数据属性中,该方法可能看起来更简单
const fnContainer = window;
$('#dgok').click(function(){
const fnName = $(this).attr('data-fn');
const fnArg = $(this).attr('data-arg');
if (typeof fnContainer[fnName] === 'function') {
fnContainer[fnName].apply(fnContainer, [fnArg]); // window[fnName](fnArg);
}
});
推荐阅读
- python - 使用 boto3 从 AWS Glue 获取表
- javascript - 使用错误回调处理节点中 mongodb 驱动程序的错误
- android - React Native 设置了一个可以触发一些代码的警报
- angular - Okta 用户 api 抛出请求正文格式不正确
- c++ - 我想在主类中输入数据(10 个玩家和分数),如何调用 void “ScoresList::add(const GameEntry& e)”?
- c++ - 指向数组的指针和对数组的引用之间的区别
- python - python Counter 是否预期行为如下?
- javascript - javascript fetch 响应 403 错误
- r - 如何以时间为 x 轴使用 geom_col
- python - RPLIDAR A1 没有像 python 预期的那样快速采样