2015-04-28 6 views
7

This questionwindow.open का उपयोग करके एक नई विंडो खोलने का एक तरीका मांगने के लिए पूछता है और फिर इसे एक स्क्रिप्ट के साथ इंजेक्ट करता है। क्रॉस-डोमेन सुरक्षा समस्याओं के कारण यह संभव नहीं था।स्क्रिप्ट

हालांकि, मेरी समस्या यह है कि मैं एक ही डोमेन से उसी डोमेन को छोड़कर, वही काम करना चाहता हूं। क्या यह संभव है?

ध्यान दें कि .write इस समस्या को हल नहीं करता है क्योंकि यह पहले पृष्ठ से सभी HTML को मिटा देता है।

उत्तर

8

आप कुछ इस तरह कर सकते हैं काम करने लगता है:

var theWindow = window.open('http://stackoverflow.com'), 
    theScript = document.createElement('script'); 
function injectThis() { 
    // The code you want to inject goes here 
    alert(document.body.innerHTML); 
} 
// Self executing function 
theScript.innerHTML = '(' + injectThis.toString() + '());'; 
theWindow.onload = function() { 
    // Append the script to the new window's body. 
    // Only seems to work with `this` 
    this.document.body.appendChild(theScript); 
}; 

और किसी कारण से आप eval उपयोग करना चाहते हैं: कोड के पहले बिट के लिए

var theWindow = window.open('http://stackoverflow.com'), 
    theScript; 
function injectThis() { 
    // The code you want to inject goes here 
    alert(document.body.innerHTML); 
} 
// Self executing function 
theScript = '(' + injectThis.toString() + '());'; 
theWindow.onload = function() { 
    this.eval(theScript); 
}; 

यह क्या करता है (स्पष्टीकरण। सभी उदाहरण काफी समान हैं):

  • नई विंडो
  • नई विंडो के document
  • एक स्क्रिप्ट तत्व बनाता है के लिए एक संदर्भ हो जाता है खोलता है
  • स्थान सभी कोड आप में 'इंजेक्षन' करना चाहते हैं एक समारोह
  • परिवर्तन स्क्रिप्ट के innerHTML लोड करने के लिए समारोह कहा कि जब खिड़की भार, window.onload घटना के साथ (आप भी addEventListener उपयोग कर सकते हैं)। मैंने सुविधा के लिए toString() का उपयोग किया, इसलिए आपको स्ट्रिंग्स का एक गुच्छा जोड़ना नहीं है। toString मूल रूप से स्ट्रिंग के रूप में पूरे injectThis फ़ंक्शन को लौटाता है।
  • स्क्रिप्ट को नई विंडो के document.body में जोड़ता है, यह वास्तव में इसे लोड किए गए दस्तावेज़ में संलग्न नहीं करेगा, यह लोड होने से पहले इसे जोड़ता है (खाली शरीर में), और यही कारण है कि आपको window.onload का उपयोग करना होगा, ताकि आपकी स्क्रिप्ट नए दस्तावेज़ में हेरफेर कर सकती है।

यह शायद एक अच्छा विचार window.addEventListener('load', injectThis.toString()); बजाय window.onload उपयोग करने के लिए है, के मामले में आप पहले से ही अपने नए पृष्ठ के भीतर एक स्क्रिप्ट window.onload घटना का उपयोग करता है (यह इंजेक्शन स्क्रिप्ट के ऊपर लिख चाहते हैं)।

ध्यान दें कि आप injectThis समारोह के अंदर कुछ भी कर सकते हैं: DIVs संलग्न, डोम प्रश्नों करते हैं, और भी अधिक लिपियों, आदि जोड़ने ...

भी ध्यान रखें कि आप theWindow.onload के अंदर नई विंडो के डोम में हेरफेर कर सकते हैं घटना, this का उपयोग कर।

+0

आईई 11 पर काम नहीं करता है। – Suncatcher

+0

एफएफ पर काम करता है। क्रोम? नहीं। –

0

हाँ ...

var w = window.open(<your local url>); 
w.document.write('<html><head>...</head><body>...</body></html>'); 
+0

यह तब तक वेबपृष्ठ को मिटा देता है जब तक इंजेक्ट करने के लिए कुछ भी नहीं है। – DaemonOfTheWest

+0

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

+0

नहीं, जब भी आप '.write' का उपयोग करते हैं तो यह आपके गंतव्य से पहले सभी सामग्री साफ़ कर देगा। इससे कोई फर्क नहीं पड़ता कि आप क्या कर रहे हैं - यह काम नहीं करता है। – DaemonOfTheWest

0

यहाँ एक चाल मैं उपयोग करें, यह क्वेरी स्ट्रिंग का उपयोग करता है, और ग्राहक के पक्ष है। सही नहीं है, लेकिन यह काम करता है:

भेजने पृष्ठ पर, कार्य करें:

var javascriptToSend = encodeURIComponent("alert('Hi!');"); 
window.open('mypage.html?javascript=' + javascriptToSend); 

अपने पृष्ठ के साथ mypage.html बदलें। अब प्राप्त पृष्ठ पर, जोड़ें:

(location.href.match(/(?:javascript)=([^&]+)/)[1])&&eval(decodeURIComponent(location.href.match(/(?:javascript)=([^&]+)/)[1])); 

आपको यह सुनिश्चित करने के लिए कुछ और आगे करना होगा।


आप PHP आप प्राप्त पृष्ठ पर इस और अधिक विश्वसनीय समाधान का उपयोग कर सकते हैं:

var theWindow = window.open('http://stackoverflow.com'), 
    theDoc = theWindow.document, 
    theScript = document.createElement('script'); 
function injectThis() { 
    // The code you want to inject goes here 
    alert(document.body.innerHTML); 
} 
theScript.innerHTML = 'window.onload = ' + injectThis.toString() + ';'; 
theDoc.body.appendChild(theScript); 

यह भी:

eval(decodeURIComponent(<?=$_GET['javascript'] ?>)); 
+0

और रिक्त विंडो 'window.open ("")' पर इसे कैसे पूरा करें? – Suncatcher