2012-02-07 12 views
14

मान लें कि मेरे पास window.open (नाम पैरामीटर के बिना) है, जो मेरे प्रोजेक्ट में बिखरा हुआ है और मैं कार्यान्वयन को बदलना चाहता हूं ताकि जहां भी नाम निर्दिष्ट नहीं किया गया हो, मैं एक डिफ़ॉल्ट नाम निर्दिष्ट करूंगा।window.open कार्यक्षमता को ओवरराइड कैसे करें?

मैं इसके बारे में क्या करना चाहता हूं, खिड़की के लिए अपनी खुद की विधि को हुक करना है ताकि जब भी window.open चलता है तो यह आंतरिक रूप से मेरी अपनी विधि को कॉल करेगा जो तब विंडो.ओपेन (नाम पैरामीटर के साथ) को कॉल करेगा।

क्या यह जावास्क्रिप्ट के माध्यम से संभव है? क्या इस वर्चुअल फ़ंक्शन को कॉल करने वाले इस विंडो में किसी भी परिपत्र निर्भरता के मुद्दे होंगे जो बदले में window.open फ़ंक्शन को कॉल कर देगा?

पी। सरल शब्दों में जो मैं करना चाहता हूं वह विंडो.ऑपन कार्यक्षमता को ओवरराइड कर रहा है।

उत्तर

26

परिपत्र कॉल से बचने के लिए, आपको एक चर में मूल window.open फ़ंक्शन को दूर करना होगा।

एक अच्छा तरीका (जो वैश्विक नामस्थान को प्रदूषित नहीं करता है) एक बंद करने का उपयोग करना है। एक अज्ञात फ़ंक्शन में मूल window.open फ़ंक्शन को एक तर्क के रूप में पास करें (नीचे open कहा जाता है)। यह अनाम कार्य आपके हुक फ़ंक्शन के लिए एक कारखाना है। आपका हुक समारोह स्थायी रूप से open तर्क के माध्यम से मूल window.open समारोह के लिए बाध्य है:

window.open = function (open) { 
    return function (url, name, features) { 
     // set name if missing here 
     name = name || "default_window_name"; 
     return open.call(window, url, name, features); 
    }; 
}(window.open); 
+0

क्या आप यहां समझा सकते हैं कि क्या हो रहा है? मैं जेएस के साथ अच्छी तरह से परिचित नहीं हूँ मैं डर रहा हूँ। –

+0

मैंने इसे ऊपर दिए गए अपडेट के साथ समझाया। मुझे नहीं लगता कि मैं इससे गहन विवरण में जा सकता हूं। मैं इस पर पढ़ने की अनुशंसा करता हूं: 1. फ़ंक्शन स्कॉप्स और कॉल/लागू विधियां। 2. मॉड्यूल पैटर्न। –

+0

यह जेएस त्रुटि दे रहा है: माइक्रोसॉफ्ट जेस्क्रिप्ट रनटाइम त्रुटि: ऑब्जेक्ट संपत्ति या विधि 'कॉल' का समर्थन नहीं करता है –

4

P.s. In simple terms what I want to do is override the window.open functionality.

var orgOpen = window.open; 

window.open = function (url, windowName, windowFeatures) { 
    alert("Overrided!"); 
    return orgOpen(url, windowName, windowFeatures); 
} 

window.open("http://www.stackoverflow.com"); 
+2

1. मतदान वैश्विक नामस्थान। 2. हुक फ़ंक्शन किसी भी तर्क का उपयोग नहीं करता है। 3. हुक फ़ंक्शन नई विंडो ऑब्जेक्ट को वापस नहीं करता है। 4. यह कैसे काम करता है? –

+1

मुझे नामस्थान प्रदूषण के बारे में बहुत कुछ परवाह नहीं है। – georg

9

मैं जानता हूँ कि यह उत्तर एक छोटे से देर हो चुकी है, लेकिन मुझे लगा कि एक अधिक सामान्य समाधान के लिए सहायक हो सकता है अन्य लोग (अन्य विधियों को ओवरराइड करने का प्रयास कर रहे हैं)

function wrap(object, method, wrapper){ 
    var fn = object[method]; 

    return object[method] = function(){ 
     return wrapper.apply(this, [fn.bind(this)].concat(
      Array.prototype.slice.call(arguments))); 
    }; 
}; 

//You may want to 'unwrap' the method later 
//(setting the method back to the original) 
function unwrap(object, method, orginalFn){ 
    object[method] = orginalFn; 
}; 

//Any globally scoped function is considered a 'method' of the window object 
//(If you are in the browser) 
wrap(window, "open", function(orginalFn){ 
    var originalParams = Array.prototype.slice.call(arguments, 1); 
    console.log('open is being overridden'); 
    //Perform some logic 
    //Call the original window.open with the original params 
    orginalFn.apply(undefined, originalParams); 
}); 
+1

ऑब्जेक्ट के फ़ंक्शन को हुक करने का अच्छा साफ सामान्य तरीका –

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