能否将javascript函数名设置为html属性?
是否可以编写一个html属性来存储javascript函数的名称,然后提取该val()并执行该函数?例如:能否将javascript函数名设置为html属性?,javascript,jquery,html,Javascript,Jquery,Html,是否可以编写一个html属性来存储javascript函数的名称,然后提取该val()并执行该函数?例如: <button id="example" data-function-name="showAllElements()"> 你可以,是的。你是否应该完全是另一个问题,答案几乎肯定是“否”(就执行字符串而言;就下面所示的备选方案而言,有时它是有用的) 计算代码片段的方法(由于(),您拥有的不仅仅是函数名)是使用可怕的eval: eval(fn); 几乎总是有比使用eval更好的
<button id="example" data-function-name="showAllElements()">
你可以,是的。你是否应该完全是另一个问题,答案几乎肯定是“否”(就执行字符串而言;就下面所示的备选方案而言,有时它是有用的)
计算代码片段的方法(由于()
,您拥有的不仅仅是函数名)是使用可怕的eval
:
eval(fn);
几乎总是有比使用eval
更好的选择。(见下文。)
eval
示例:
$(“#示例”)。在(“单击”,函数(){
var fn=$(“#示例”).attr(“数据函数名”);
eval(fn);
});
函数显示(){
警惕(“称为展示”);
}
点击我
当然可以。。。假设showAllegements
是全局的
函数显示(){
log(“test!”);
}
document.querySelector(“按钮”).addEventListener(“单击”),函数(e){
var functionName=this.getAttribute(“数据函数名”);
窗口[函数名]();
});代码>
x
虽然我不认为可以直接使用HTML属性(除了上面提到的全局函数)来实现,但是如果可以在页面加载时使用javascript添加数据元素,那么可以直接实现。正如这里所说,jquery的$.data()
与数据-*
属性不同。根据,使用.data()
“存储的值是新的数据值;它可以是除未定义之外的任何Javascript类型。”
因此,您可以直接使用
function my_func(){
// Do stuff
}
$(function(){
$('#foo').data('func', my_func);
});
后来
var func = $('#foo').data('func');
if( $.isFunction( func ) ) {
func.call( $('#foo'), somearg );
}
我有
这样做的好处是,您可以在机柜等中使用函数。只要将它们添加到同一机柜范围内的元素中。要找到答案,您必须尝试:)这可能会对您有所帮助:。它用于变量,但与函数的方式相同。很好,我没想到!当然,只适用于全局函数,全局函数和所有全局函数一样,都是一个坏主意。@T.J.Crowder-不,它适用于任何对象,只要您有一个引用。它只是按函数名查找函数,然后调用它。这没什么神奇的。也可以是:({foo:function(){console.log('bar');}}})['foo']()代码>。那里没有全局函数。我意识到我把它作为一个热门帖子漏掉了。没有看到任何其他答案。你的很可能在那里,但这不是我添加它的原因。我刚刚意识到我犯了一个错误,就是告诉OP如何使用eval
,告诉他们可能不应该这样做,并且不给他们选择的机会!:-)噢,+1用于巧妙地使用reduce
!谢谢,我真的很喜欢你的建议!另外,您能给我解释一下使用.data()的情况吗?很遗憾,我有一段时间误用了jQuery。。。认为它是包装纸/塑料填充物。@canon:你和其他很多人。:-)我一直在想,在另一个世界中,API是如何让这一点变得更清楚的,因为人们会被它误导。但我什么都没想到,反正现在已经出局了。。。
var func = $('#foo').data('func');
if( $.isFunction( func ) ) {
func.call( $('#foo'), somearg );
}