如何将事件连接到我定义为字符串的函数名?
我正在使用Prototype.js,虽然这不是Prototype-speficic。
$(inputId).observe('click', formData.fields[x].onclick);
这会导致JavaScript抱怨我的处理程序不是函数。我不希望我们使用eval()
。
答案 0 :(得分:81)
如果函数在全局范围内,您可以使用window对象获取它:
var myFunc = window[myFuncName];
答案 1 :(得分:9)
我已经解决了这个问题,因为我需要这样的功能。这是我的沙箱代码,没有经过全面测试,但可以成为其他人的起点。 请注意,代码中有一个eval(),因为我无法弄清楚如何绕过该步骤,可能是一个javascript怪癖,无法以任何其他方式完成。如果有办法摆脱eval(),请告诉我!
executeFunctionByName = function(functionName)
{
var args = Array.prototype.slice.call(arguments).splice(1);
//debug
console.log('args:', args);
var namespaces = functionName.split(".");
//debug
console.log('namespaces:', namespaces);
var func = namespaces.pop();
//debug
console.log('func:', func);
ns = namespaces.join('.');
//debug
console.log('namespace:', ns);
if(ns == '')
{
ns = 'window';
}
ns = eval(ns);
//debug
console.log('evaled namespace:', ns);
return ns[func].apply(ns, args);
}
core = {
paragraph: {
titlebar: {
user: "ddd",
getUser: function(name)
{
this.user = name;
return this.user;
}
}
}
}
var testf = function()
{
alert('dkdkdkd');
}
var x = executeFunctionByName('core.paragraph.titlebar.getUser', 'Ikon');
executeFunctionByName('testf');
答案 2 :(得分:6)
...或者[myFuncName];
答案 3 :(得分:5)
也许?
setTimeout ( "myFunc()", 1 );
答案 4 :(得分:3)
window.myFunction === window["myFunction"]
答案 5 :(得分:3)
看起来formData.fields[x].onclick
是否包含全局函数的名称?如果是这样,试试:
$(inputId).observe('click', window[formData.fields[x].onclick]);
答案 6 :(得分:3)
只需eval
即可完成工作
var call = eval("method_name").call(args);
答案 7 :(得分:1)
你知道onclick属性包含什么或它是什么类型的?我认为这是原型特定的东西,因为DOM表单中不存在“字段”。
答案 8 :(得分:0)
如果需要使用参数调用字符串函数,请执行以下操作:
window[stringFunctionName].apply( window, arrayOfArguments )
如果愿意,您可以使用scope
代替window
答案 9 :(得分:0)
更新:--- 使用ES6导出和导入
a.js
const fn = {
aaa: function() {
//code
},
bbb: function() {
//code
},
//codes ....
nnn: function() {
//code
}
}
export default fn
b.js
import someFn from './a'
//eg
const str1='aaa'
const str2 = 'bbb'
someFn[str1]()
eval('str')
(过时的功能https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features)
setTimeout('str')
setInterval('str')
window['str']
(但......有时,全局对象不是窗口)
new Function('str')
以上这些方法由于某些原因总是不推荐,但它们使用起来非常方便。 下面这些方法是安全的,但实际上并不便于使用。
切换...案例(或者如果......其他)
switch(str){
case 'str1':
fn1()
break
case 'str2':
fn2
//and so on
}
将函数放入对象
const fn={
str1:fn1,
str2:fn2
//and so on
}
fn[str1] //call function