2009-01-30 2 views
47

Как подключить событие к имени функции, которое я определил как строку?Вызов имени функции JavaScript с помощью строки?

Я использую Prototype.js, хотя это не Prototype-speficic.

$(inputId).observe('click', formData.fields[x].onclick); 

Это приведет к тому, что JavaScript будет жаловаться на то, что мой обработчик не является функцией. Я бы предпочел не использовать eval().

+0

возможно дубликат [Как выполнить JavaScript, когда у меня есть его имя как строка] (http://stackoverflow.com/questions/359788/how-to-execute-a-javascript-function-when-i-have-its-name-as-a- строка) – olibre

ответ

79

Если функция находится в глобальной области видимости, вы можете получить его с помощью объекта окна:

var myFunc = window[myFuncName]; 
+11

... или scope [myFuncName] вообще – annakata

+0

Yup, если у вас есть дескриптор области где-то, это будет работать – Greg

+0

Это спасло мою жизнь. Спасибо миллион раз. – Alex

6

... или это [myFuncName];

+0

Недооцененное решение. Пожалуйста, возьмите мой верхний план. – woodhead92

3

Похоже, что formData.fields[x].onclick содержит имя глобальной функции? Если да, попробуйте:

$(inputId).observe('click', window[formData.fields[x].onclick]); 
1

Знаете ли вы, что содержит свойство onclick или какой тип оно есть? Я предполагаю, что это прототип специфического материала, поскольку «поля» не существуют в формах DOM.

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'); 
+0

Чтобы избавиться от eval, вы можете перемещаться по пространствам имен из оконного объекта: 'var func = window; for (var i = 0; i

+0

Спасибо Ikon. Я пробовал много способов, этот ответ решит мою проблему. –

5

Возможно, возможно?

setTimeout ("myFunc()", 1); 
3

Просто eval бы сделать работу

var call = eval("method_name").call(args); 
+0

Отлично! это сработало ... спасибо; Вы забыли. между. 'var call = eval (" mathod_name "). Call (args);' – RY35

0

Если вам нужно вызвать функцию строки с аргументами, сделайте следующее:

window[stringFunctionName].apply(window, arrayOfArguments) 

Вы можете использовать scope вместо window если это необходимо

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]() 

Эти методы выше всегда не будет рекомендовать по каким-либо причинам, но они действительно удобны в использовании. Эти методы ниже безопасны, но на самом деле не рекомендуется использовать.

  • переключатель ... случай (или если ... иначе)

    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 
    
+0

Как это ответить на вопрос? –

Смежные вопросы