2010-09-01 13 views
7

मेरे एक्सटेंशन में, मैं यह निर्धारित करने की कोशिश कर रहा हूं कि एक नया टैब किसी अन्य टैब द्वारा पॉपअप के रूप में बनाया गया था और यदि ऐसा है, तो कौन सा टैब।क्रोम एक्सटेंशन सामग्री स्क्रिप्ट्स window.opener का उपयोग कर सकते हैं?

मैंने सोचा कि मैं इसे समझने में सहायता के लिए सामग्री स्क्रिप्ट से window.opener का उपयोग करने में सक्षम होगा। लेकिन ऐसा लगता है कि window.opener सामग्री स्क्रिप्ट में सही ढंग से काम नहीं करता है।

जब मैं मैन्युअल रूप से एक टैब बनाता हूं, तो यह विंडो है। ओपनर अपेक्षा के अनुरूप शून्य है।

जब कोई टैब किसी अन्य टैब द्वारा पॉपअप के रूप में बनाया जाता है, तो इसकी window.opener अपरिभाषित है। मैं इस से अनुमान लगा सकता हूं कि टैब पॉपअप के रूप में बनाया गया था, लेकिन मैं इसका उपयोग यह पता लगाने के लिए नहीं कर सकता कि किस टैब ने नया बनाया है।

क्या यह ज्ञात मुद्दा है, और क्या किसी को किसी भी कामकाज के बारे में पता है?

+0

http://stackoverflow.com/questions/3124543/is-it-possible-to-determine-a-tabs-opener-within-a-google-chrome-extension – npdoty

+0

का संभावित डुप्लिकेट हां, ऐसा लगता है। लेकिन न तो सवाल का उत्तर दिया गया है .. – Greg

+0

[हम समान प्रश्नों को खड़े होने के लिए आगे बढ़ रहे हैं।] (Http://blog.stackoverflow.com/2010/11/dr-strangedupe-or-how-i-learned- टू-स्टॉप-चिंता-और-प्यार-डुप्लिकेशंस /) – Will

उत्तर

16

मैंने इस समस्या में बारीकी से नहीं देखा, लेकिन मुझे लगता है कि मैं आपको सही दिशा में इंगित कर सकता हूं। सामग्री स्क्रिप्ट एक चरणीय विंडो से एक चर का उपयोग नहीं कर सकता क्योंकि यह sandboxed है। का संभावित हल अपने कोड इस आप एक स्क्रिप्ट टैग के अंदर अपनी स्क्रिप्ट इंजेक्षन करने की जरूरत है ऐसा करने के लिए, एक पृष्ठ पर सीधे चलाने के लिए होगा:

आपका सामग्री स्क्रिप्ट के इस प्रकार दिखाई देगा:

function injectJs(link) { 
     var scr = document.createElement("script"); 
     scr.type="text/javascript"; 
     scr.src=link; 
     (document.head || document.body || document.documentElement).appendChild(scr); 
} 

injectJs(chrome.extension.getURL("inject.js")); 

अब आप चला सकते हैं

inject.js:

alert(window.opener); 

मुझे लगता है अब आप एक बा को वापस इस जानकारी पारित करने के लिए चाहते हैं सैंडबॉक्स प्रतिबंध के बिना अपने कोड के रूप में अगर यह सही पेज पर था सीकेग्राउंड पेज, जो एक और चुनौती है क्योंकि आप क्रोम एपीआई का उपयोग नहीं कर सकते हैं। अच्छी खबर यह है कि सामग्री स्क्रिप्ट डीओएम तक पहुंच सकती है और डीओएम घटनाओं को सुन सकती है, ताकि आप उन्हें सामग्री स्क्रिप्ट पर जानकारी पास करने के लिए उपयोग कर सकें जो इसे पृष्ठभूमि पृष्ठ पर भेज दे। मुझे पूरा यकीन है कि आपको एक कस्टम डोम ईवेंट पंजीकृत करने में सक्षम होना चाहिए और अपनी सामग्री स्क्रिप्ट को सुनना चाहिए (मैंने इस भाग को आजमाया नहीं है)।

+0

मैंने इस तरह की विधि का उपयोग करके अपनी समस्या को हल किया; पृष्ठ में बहुत सारे कोड इंजेक्शन और 'पोस्टमेसेज' का उपयोग करके फ्रेम और पृष्ठ और मेरी सामग्री स्क्रिप्ट के बीच संवाद करने के लिए। यह काफी दर्द है, लेकिन ऐसा लगता है कि ज्यादातर समय काम करता है। – Greg

+3

इस 'इंजेक्शन स्क्रिप्ट -> सामग्री स्क्रिप्ट -> पृष्ठभूमि पृष्ठ' संचार के कुछ उदाहरण देखने का कोई मौका। @Greg या @serg से मैं वर्तमान में उस सटीक समस्या के साथ संघर्ष कर रहा हूं – kevzettler

+2

@kevzettler आप एक स्क्रिप्ट इंजेक्ट कर सकते हैं जो 'window.bodyiredData' को' document.body' पर एक विशेषता के रूप में संग्रहीत करता है, और फिर अपनी सामग्री से विशेषता को पढ़ता है- स्क्रिप्ट (चूंकि वे एक ही डोम साझा करते हैं) – levi

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