2010-10-13 17 views
5

मेरे पास एक ऐसा फ़ंक्शन है जो एक JQuery ईवेंट हैंडलर है। चूंकि यह एक JQuery इवेंट हैंडलर है, यह उस ऑब्जेक्ट को संदर्भित करने के लिए this चर का उपयोग करता है जिस पर इसे लागू किया जाता है (जैसा कि उस लाइब्रेरी के लिए सामान्य है)।मैं जावास्क्रिप्ट में 'यह' को फिर से परिभाषित कैसे करूं?

दुर्भाग्य से, मुझे इस बिंदु पर मैन्युअल रूप से उस विधि को कॉल करने की आवश्यकता है। मैं कॉल किए गए फ़ंक्शन के अंदर this कैसे बना सकता हूं जैसे कि इसे JQuery से कहा जाता है?

उदाहरण कोड:

performAjaxRequest.apply(dialog, []); 
// arguments (instead of []) might be even better 

चाल करना चाहिए:

function performAjaxRequest() { 
    //Function which builds AJAX request in terms of "this" 
} 

function buildForm(dialogOfForm) { 
    var inputItem; 
    dialogOfForm.html('...'); 
    dialogOfForm.dialog('option', 'buttons', { 
     "Ok" : performAjaxRequest 
    }); 
    inputItem = dialogOfForm.children(':not(label)'); 
    //Redirect enter to submit the form 
    inputItem.keypress(function (e) { 
     if (e.which === 13) { 
      performAjaxRequest(); //Note that 'this' isn't the dialog box 
            //as performAjaxRequest expects here, it's 
            //the input element where the user pressed 
            //enter! 
     } 
    } 
} 

उत्तर

8

तो dialog वस्तु आप तो this करने के लिए सेट करने की आवश्यकता है है।

अन्यथा, jQuery में आप बस तत्व आप उदाहरण के लिए this

करने के लिए सेट की है, कहो, चाहते हैं कि पर trigger विधि कॉल कर सकते हैं, कि तुम एक click घटना एक बटन पर हो करना चाहते थे और आप की जरूरत यह अब होने वाला है। सीधे शब्दों में कहते हैं:

$("#my_button").trigger("click"); 

आपका #my_button के click हैंडलर लागू किया जाएगा, और this#my_button तत्व को स्थापित किया जाएगा।

आप this jQuery वस्तु ही की बात कर के साथ एक अलग this के साथ एक विधि कॉल करने के ... उदाहरण के लिए कहते हैं, की जरूरत है, तो आप अपने कार्य पर call या apply उपयोग करना चाहते हैं जाएगा।

चक और मेडर पहले से ही आप प्रत्येक के उदाहरण दे दिया है ... लेकिन सभी एक ही स्थान में सब कुछ है करने के लिए:

// Call 
my_function.call(object_to_use_for_this, argument1, argument2, ... argumentN); 

// Apply 
my_function.apply(object_to_use_for_this, arguments_array); 

देखें: A List Apart's Get Out of Binding Situations

+0

मान लें कि मेरे पास वास्तविक घटना या तत्व का आसान संदर्भ नहीं है जिस पर ईवेंट निकाल दिया जाएगा। –

+0

@ बिली ... तो आप एक परिवर्तनीय वस्तु या वस्तुओं के सेट पर एक चरणीय घटना ट्रिगर करना चाहते हैं? यदि हां, तो सामान्य कोड कैसा दिखता है? इस समय क्या आप जानते हैं कि आप जो भी ट्रिगर करना चाहते हैं उसे ट्रिगर करना चाहते हैं? –

+0

बस प्रश्न को अपडेट किया गया - मुझे बताएं कि क्या यह स्पष्ट हो जाता है। –

10

आप समारोह के call विधि का उपयोग कर सकते हैं।

someFunction.call(objectToBeThis, argument1, argument2, andSoOnAndSoOn); 
+1

+1 पहले उत्तर में है जो मैंने प्रस्तुत की गई सबसे सीधी समस्या का उत्तर देता है। @ शॉन के जवाब को चेकमार्क किया गया है, हालांकि बस यह अधिक पूर्ण है। –

3

आप .. के लिए देख रहे

functionRef.apply(objectContext, arguments); 
+1

+1 - यह भी एक अच्छा जवाब है, हालांकि @ चक का जवाब अधिक सीधे करता है जो मैं ढूंढ रहा था। –

0

उपयोग को बंद करने यानी उस जल्दी पर करने के लिए इस असाइन करना; तो आप जो कर सकते हैं वह कर सकते हैं।

var that = this; 
+0

मेरा उदाहरण कोड देखें। ध्यान दें कि ईवेंट फ़ंक्शन दो स्थानों से बुलाया जा रहा है। 'PerformAjaxRequest' की सामग्री को डुप्लिकेट किए बिना बंद करने के साथ आप इसे हल करने का प्रस्ताव कैसे देते हैं? –

1

आप निश्चित रूप से call() और apply() के रूप में लोगों ने कहा है, लेकिन एक छोटे से सहायक कभी नहीं दर्द होता है ... jQuery में

गुरु सीखना चाहिए, वहाँ $.proxy है।शुद्ध js में, आप उस niftyness पुन: बना सकते;) की तरह कुछ के साथ:

function proxyFn(fn , scope){ 
    return function(){ 
    return fn.apply(scope,arguments); 
    } 
} 

प्रयोग उदाहरण:

var myFunctionThatUsesThis = function(A,B){ 
    console.log(this,arguments); // {foo:'bar'},'a','b' 
}; 

// setTimeout or do Ajax call or whatever you suppose loses "this" 

var thisTarget = {foo: 'bar'}; 
setTimeout(proxyFn(myFunctionThatUsesThis, thisTarget) , 1000 , 'a', 'b'); 

// or... 

var contextForcedCallback = proxyFn(myAjaxCallback , someObjectToBeThis); 
performAjaxRequest(myURL, someArgs, contextForcedCallback); 

आप इसे दुरुपयोग न है, यह एक यकीन है कि आग उपकरण कभी नहीं करने के लिए "इस" के दायरे को ढीला करो।

+0

क्षमा करें, मेरे द्वारा प्रदान किया गया मूल कार्य एक मानसिक लैप्सस था। यह बेन सही संस्करण में अद्यतन किया गया है। – Quickredfox

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

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