2011-08-24 6 views
9

कहें कि आपके पास वैश्विक फ़ंक्शन अलर्ट 2 है:किसी अन्य विंडो के संदर्भ में जावास्क्रिप्ट विधि को कॉल करना संभव है?

function alert2(msg) { 
    window.alert(msg); 
} 

और आपके पास दूसरी विंडो ऑब्जेक्ट का संदर्भ भी है:

childWindow = window.open(myUrl); 

अब आप बच्चे के संदर्भ में विंडो से अलर्ट 2 को कॉल करना चाहते हैं विन्डो:

alert2.call(childWindow, "does not work without this.window"); 

मुख्य विंडो में संवाद बॉक्स प्रकट होता है क्योंकि चेतावनी 2 के अंदर "विंडो" विंडो से बंधी है जिसमें इस विधि को परिभाषित किया गया था (पैरेंट विंडो)।

एक समाधान चेतावनी 2 को संशोधित करना है:

function alert2(msg) { 
    this.alert(msg); 
} 

क्या इस संशोधन के बिना ऐसा करना संभव है? इस तरह कुछ:

alert2.call(childWindow.parent, "no such thing as window.parent"); 

यह एक प्रदूषित उदाहरण है; childWindow.alert ("") वह नहीं है जिसे मैं ढूंढ रहा हूं!

http://jsfiddle.net/hJ7uw/2/

से शुरू होने वाले jsfiddle पर मेरा स्रोत देखा और संशोधित किया जा सकता है

उत्तर

5

नोट शुरू करने jsfiddle पर संशोधित: अगर दोनों खिड़कियों यह केवल काम करता है एक ही डोमेन (एकल डोमेन नीति) के हैं।

var func = function() { 
    var parent = window; // pointer to parent window 
    var child = childWindow; 

    return function() { 

     ... anything you like to do ... 
     parent.alert('Attached to main window') 
     child.alert('Attached to child window') 
    } 
}(); 

childWindow.func = func; // pass function to child window 

नेस्टेड कार्यों सुनिश्चित करें कि आप संदर्भ समारोह में बनाया गया था, जहां (ध्यान दें जिसके अंत में समाप्त हो जाता है पर }(); से संदर्भ का उपयोग कर सकते हैं:

आप क्या कर सकते childWindow में समारोह बनाने है पहला कार्य और इसे तुरंत कॉल करता है)।

अंतिम पंक्ति बच्चे की खिड़की में नया कार्य बनाता है; बाल विंडो में सभी जावास्क्रिप्ट कोड इसे window.func के रूप में भी एक्सेस कर सकते हैं।

यह थोड़ा उलझन में है लेकिन बस इस तरह सोचें: आपके पास दो खिड़की के उदाहरण/वस्तुएं हैं। किसी भी जावास्क्रिप्ट ऑब्जेक्ट की तरह, आप उन्हें नए गुण असाइन कर सकते हैं।

+1

धन्यवाद ... अपने कोड समस्या की मेरी समझ को दर्शाते हैं। इस मामले में उपरोक्त func() में "बच्चे" या "पैरेंट" के अर्थ को प्रतिस्थापित करने का कोई तरीका नहीं है। इसी प्रकार फ़ंक्शन में "विंडो" के अर्थ को प्रतिस्थापित करने का कोई तरीका नहीं है क्योंकि "विंडो" को कैप्चर किया गया था जब चेतावनी 2 को "माता-पिता" और "बच्चे" के रूप में बनाया गया था जब func परिभाषित किया गया था। –

2

ऑब्जेक्ट प्राप्त करने के लिए आप childWindow.opener का उपयोग कर सकते हैं जिसने बच्चे की खिड़की खोली।

alert2.call(childWindow.opener, "called from child using parent as context"); 

डेमो: http://jsfiddle.net/hJ7uw/8/

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

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