2012-09-12 18 views
14

मैं एक क्रोम एक्सटेंशन बनाना चाहता हूं जो window के अंदर एक नई वस्तु प्रदान करता है। जब ब्राउज़र में एक्सटेंशन के साथ ब्राउज़र में एक वेब पेज देखा जाता है, तो मुझे जावास्क्रिप्ट के माध्यम से उपलब्ध होने के लिए window.mything चाहिए। window.mything ऑब्जेक्ट में कुछ फ़ंक्शन होंगे जिन्हें मैं एक्सटेंशन में परिभाषित कर दूंगा, और इन फ़ंक्शंस को console.log या किसी भी जावास्क्रिप्ट फ़ाइल से कॉल करने योग्य होना चाहिए जब पृष्ठ को ब्राउज़र में एक्सटेंशन सक्षम किया गया हो।विंडो ऑब्जेक्ट को Chrome एक्सटेंशन से संशोधित किया जा सकता है?

मैं सफलतापूर्वक एक Content Script का उपयोग करके एक जावास्क्रिप्ट पेज में फ़ाइल इंजेक्षन करने में सक्षम था:

var s = document.createElement("script"); 
s.src = chrome.extension.getURL("mything.js"); 
document.getElementsByTagName("head")[0].appendChild(s); 

mything.js इस तरह दिखता है:

window.mything = {thing: true}; 
console.log(window); 

जब भी कोई पृष्ठ लोड हो तो मैं देख रहा हूँ पूरे window ऑब्जेक्ट के रूप में मैं कंसोल में होने की उम्मीद करता हूं। हालांकि, मैं कंसोल से window.mything ऑब्जेक्ट से बातचीत नहीं कर सकता। ऐसा लगता है कि इंजेक्शन स्क्रिप्ट ने वास्तव में वैश्विक window ऑब्जेक्ट को संशोधित नहीं किया है।

मैं क्रोम एक्सटेंशन से वैश्विक window ऑब्जेक्ट को कैसे संशोधित कर सकता हूं?

+0

यह असंभव है। क्या आप सही कंसोल देख रहे हैं, क्या स्क्रिप्ट वास्तव में निष्पादित है (दस्तावेज का निरीक्षण करें और स्क्रिप्ट टैग/सिंटैक्स त्रुटियों के लिए जांच करें)? स्क्रिप्ट निश्चित रूप से पृष्ठ के संदर्भ में चलता है, और इसलिए, 'mything' अस्तित्व में होना चाहिए। –

उत्तर

27

आप सीधे नहीं कर सकते हैं। content scripts documentation से:

हालांकि, सामग्री स्क्रिप्ट में कुछ सीमाएं हैं। वे नहीं कर सकते: क्रोम

  • उपयोग * एपीआई
  • उपयोग चर या कार्यों अपने विस्तार के पृष्ठों द्वारा परिभाषित (chrome.extension के कुछ हिस्सों को छोड़ कर)
  • उपयोग चर या कार्यों वेब पृष्ठों से या अन्य द्वारा परिभाषित किया गया। सामग्री स्क्रिप्ट

(जोर जोड़ा)

window ऑब्जेक्ट सामग्री स्क्रिप्ट देखता है वही window ऑब्जेक्ट नहीं है जो पृष्ठ देखता है।

हालांकि, आप window.postMessage विधि का उपयोग कर डीओएम के माध्यम से संदेश पास कर सकते हैं। आपके पृष्ठ और सामग्री स्क्रिप्ट दोनों संदेश ईवेंट सुनते हैं, और जब भी आप उन स्थानों में से किसी एक से window.postMessage पर कॉल करते हैं, तो अन्य इसे प्राप्त करेंगे। "सामग्री स्क्रिप्ट" दस्तावेज़ पृष्ठ पर example of this है।

संपादित करें: आप सामग्री स्क्रिप्ट से एक स्क्रिप्ट इंजेक्शन द्वारा पृष्ठ पर कुछ तरीकों को संभावित रूप से जोड़ सकते हैं। यह अभी भी, विस्तार के बाकी हालांकि साथ वापस संवाद करने के लिए postMessage की तरह कुछ का उपयोग किए बिना सक्षम नहीं होगा, लेकिन आप कम से कम करने के लिए कुछ बातें जोड़ सकते हैं पृष्ठ की window

var elt = document.createElement("script"); 
elt.innerHTML = "window.foo = {bar:function(){/*whatever*/}};" 
document.head.appendChild(elt); 
+0

धन्यवाद, मैंने आपके सुझाव शब्द का उपयोग नहीं किया, लेकिन अवधारणा ने मुझे वास्तविक मुद्दे पर शून्य में मदद की। –

+0

यू भी eval ("window.foo = {bar: function() {/ * जो भी * /}};") का उपयोग कर सकते हैं; – User

+0

@User नहीं, आप नहीं कर सकते, मैंने अभी कोशिश की। – cprcrack

4

मैं चारों ओर के साथ खेल किया गया है इस। मैंने पाया कि मैं अपने जावास्क्रिप्ट को एक window.location = कॉल में लपेटकर ब्राउज़र की विंडो ऑब्जेक्ट से बातचीत कर सकता हूं।

var myInjectedJs = "window.foo='This exists in the \'real\' window object';" 
window.location = "javascript:" + myInjectedJs; 

var myInjectedJs2 = "window.bar='So does this.';" 
window.location = "javascript:" + myInjectedJs2; 

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

0

सामग्री स्क्रिप्ट कर सकते हैं कॉल window तरीकों जो तब window वस्तु उत्परिवर्तित करने के लिए इस्तेमाल किया जा सकता होगा। <script> टैग इंजेक्शन से यह आसान है और <head> और <body> को तब तक काम करता है जब तक कि अभी तक पार्स नहीं किया गया है (उदाहरण के लिए run_at: document_start का उपयोग करते समय)।

// In Content Script 
window.addEventListener('load', loadEvent => { 
    let window = loadEvent.currentTarget; 
    window.document.title='You changed me!'; 
}); 
0

एक क्रोम एक्सटेंशन के लिए अपने स्वयं के संदर्भ में जो खिड़की से अलग है भीतर content_script चलाता है। हालांकि, तो यह इस तरह पेज की खिड़की के रूप में एक ही संदर्भ में चलाता है, आप पृष्ठ में एक स्क्रिप्ट इंजेक्षन कर सकते हैं: Chrome extension - retrieving global variable from webpage

मैं खिड़की वस्तु पर तरीकों कॉल और अनिवार्य रूप से करने के लिए एक script.js जोड़कर खिड़की गुण संशोधित करने में सक्षम था पेज के डोम:

var s = document.createElement('script'); 
s.src = chrome.extension.getURL('script.js'); 
(document.head||document.documentElement).appendChild(s); 
s.onload = function() { 
    s.remove(); 
}; 

और कहा कि इंजेक्शन स्क्रिप्ट फ़ाइल में कस्टम ईवेंट श्रोता बनाने:

document.addEventListener('_my_custom_event', function(e) { 
    // do whatever you'd like! Like access the window obj 
    window.myData = e.detail.my_event_data; 
}) 

और content_script में है कि घटना भेजने:

var foo = 'bar' 
document.dispatchEvent(new CustomEvent('_save_OG_Editor', { 
    'detail': { 
    'my_event_data': foo 
    } 
})) 

या इसके विपरीत; script.js में प्रेषण ईवेंट और अपने एक्सटेंशन की content_script में उन्हें सुनें (जैसे उपर्युक्त लिंक अच्छी तरह से दिखाता है)।

बस अपनी इंजेक्शन वाली स्क्रिप्ट को अपनी एक्सटेंशन की फ़ाइलों में जोड़ना सुनिश्चित करें, और स्क्रिप्ट फ़ाइल का पथ अपने manifest within "web_accessible_resources" पर जोड़ें या आपको एक त्रुटि मिलेगी।

आशा है कि किसी की मदद करता है \ (• ◡ •)/

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