jquery - 触发以名称为变量名的函数
问题描述
$('.dgok').click(function(){
var fn = $(this).attr('data-fn');
console.log(fn); // abc
fn();
});
function abc(){
console.log('abc');
}
.dgok{
cursor:pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='dgok' data-fn='abc'>OK</div>
结果: Error fn is not a function...
有没有办法做到这一点?
lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum
解决方案
动态访问函数名通常是代码异味,但如果您abc
在顶层,则可以访问window[fnName]
,其中fnName
是包含函数名的字符串。精确的变量名很重要——你fn
的不是一个函数,而是一个字符串,所以最好把它称为一个更清楚地表明它是一个字符串的东西(通过尝试调用它来减少自己混淆的机会)。例如:
$('.dgok').click(function() {
var fnName = $(this).attr('data-fn');
window[fnName]();
});
function abc() {
console.log('abc');
}
.dgok {
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='dgok' data-fn='abc'>OK</div>
如果您不在顶层,abc
则无法使用 - 改用由函数名称索引的对象:window[fnName]
(() => {
const fns = {
abc: () => console.log('abc')
};
$('.dgok').click(function() {
var fnName = $(this).attr('data-fn');
fns[fnName]();
});
})();
.dgok {
cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='dgok' data-fn='abc'>OK</div>
推荐阅读
- php - 在 laravel 中,如何将多维数组作为 artisan 命令的选项传递?
- tomcat - GC 开销错误后如何保持 Tomcat 工作?
- xamarin - 如何在不使用第三方库的情况下在 Xamarin.iOS 中将 gif 与 UIImageView 一起使用?
- php - 在 Laravel 5 之外使用 Facade(在 CodeIgniter 中)
- java - 在 Java 中运行 python 脚本:为什么我得到空输出?
- android - 模拟器正在显示我的图像。但是我的手机不能
- c# - C# 如何在没有 MS Access 的情况下连接到 Access DB?
- excel - 将 Word 段落复制到 Excel 单元格
- java - Spring - 多种配置和@CompontentScan 顺序
- azure - 如何在 cosmos db 中查询某些文档,更改它们的属性并将它们保存回来