2009-01-30 19 views
47

मैं एक फ़ंक्शन नाम पर एक ईवेंट को कैसे जोड़ सकता हूं जिसे मैंने स्ट्रिंग के रूप में परिभाषित किया है?एक स्ट्रिंग का उपयोग कर एक जावास्क्रिप्ट फ़ंक्शन नाम पर कॉल करें?

मैं प्रोटोटाइप.जेएस का उपयोग कर रहा हूं, हालांकि यह प्रोटोटाइप-स्पीफिक नहीं है।

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

परिणामस्वरूप जावास्क्रिप्ट शिकायत करेगा कि मेरा हैंडलर एक कार्य नहीं है। मैं eval() का उपयोग नहीं करना चाहूंगा।

+0

संभव डुप्लिकेट [एक निष्पादित करने के लिए कैसे जब मेरे पास स्ट्रिंग के रूप में इसका नाम होता है तो जावास्क्रिप्ट फ़ंक्शन] (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

... या स्कोप [myFuncName] सामान्य रूप से – annakata

+0

युप, जब तक आपके पास कहीं भी दायरे के लिए हैंडल है, यह – Greg

+0

काम करेगा यह मेरे जीवन को बचाया। धन्यवाद दस लाख बार। – Alex

6

... या इस [myFuncName];

+0

Underrated समाधान। कृपया मेरा अपवित्र ले लो। – woodhead92

3

formData.fields[x].onclick जैसे वैश्विक कार्यों का नाम है? यदि ऐसा है तो प्रयास करें:

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

क्या आपको पता है कि ऑनक्लिक संपत्ति में क्या है या यह किस प्रकार है? मुझे लगता है कि यह प्रोटोटाइप विशिष्ट सामान है, क्योंकि "फ़ील्ड" डीओएम रूपों में मौजूद नहीं है।

9

मैंने इस समस्या पर काम किया है, क्योंकि मुझे इस तरह के एक समारोह की आवश्यकता है। यहां मेरा सैंडबॉक्स कोड है, पूरी तरह से परीक्षण नहीं किया गया है, लेकिन दूसरों के लिए एक प्रारंभ बिंदु हो सकता है। ध्यान दें कि कोड में एक eval() है क्योंकि मैं यह नहीं समझ सका कि उस चरण को कैसे बाईपास करना है, शायद जावास्क्रिप्ट क्विर्क और किसी भी अन्य तरीके से नहीं किया जा सकता है। अगर मुझे 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; के लिए (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 ")। कॉल (args);' – RY35

0

करना होगा आप तर्क के साथ एक स्ट्रिंग फ़ंक्शन को कॉल करने की जरूरत है, ऐसा करते हैं:

window[stringFunctionName].apply(window, arrayOfArguments) 

आप window के स्थान पर scope उपयोग कर सकते हैं यदि पसंदीदा

0

अद्यतन: --- ES6 निर्यात का उपयोग करें और

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

यह प्रश्न का उत्तर कैसे देता है? –

संबंधित मुद्दे

 संबंधित मुद्दे