2015-04-28 7 views
7

This question prosi o sposób otwarcia nowego okna przy użyciu window.open, a następnie wstrzyknięcie go skryptem. Nie było to możliwe z powodu problemów z zabezpieczeniami międzydomenowymi.Wstrzyknięcie otwartego okna ze skryptem

Jednak moim problemem jest to, że chcę zrobić dokładnie to samo, z wyjątkiem tej samej domeny do tej samej domeny. czy to możliwe?

Uwaga: .write nie rozwiązuje tego problemu, ponieważ najpierw usuwa cały HTML ze strony.

Odpowiedz

8

można zrobić coś takiego:

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); 

To także wydaje się działać:

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); 
}; 

A jeśli z jakiegoś powodu chcesz użyć 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); 
}; 

co to (wyjaśnienie dla pierwszego kawałka kodu. Wszystkie przykłady są dość podobne):

  • Otwiera nowe okno
  • Pobiera odwołanie do Tworzy nowe okno na document
  • elementu SCRIPT
  • Miejsca cały kod chcesz „wstrzyknąć” do funkcja
  • Zmienia skrypt innerHTML w celu załadowania wspomnianej funkcji po załadowaniu okna , przy zdarzeniu (można także użyć addEventListener). Dla wygody użyłem toString(), więc nie musisz łączyć wielu ciągów. toString zasadniczo zwraca całą funkcję injectThis jako ciąg znaków.
  • Dołącza skrypt do nowego okna: , w rzeczywistości nie zostanie dołączony do załadowanego dokumentu, dołącza go przed załadowaniem (do pustego obiektu), dlatego należy użyć window.onload, aby Twój skrypt może manipulować nowym dokumentem.

To chyba dobry pomysł, aby użyć window.addEventListener('load', injectThis.toString()); zamiast window.onload, w przypadku jeśli masz już scenariusz w swojej nowej stronie, która używa zdarzenia window.onload (że to nadpisać skrypt wtrysku).

pamiętać, że można zrobić coś wewnątrz funkcji injectThis: dołączanie div wykonaj zapytania DOM, dodać jeszcze więcej skryptów, itp ...

Należy również pamiętać, że można manipulować w nowym oknie DOM wnętrza theWindow.onload zdarzenie, używając this.

+0

Nie działa w IE11. – Suncatcher

+0

Działa na FF. Chrom? Nie. –

0

Tak ...

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

Powoduje to wyczyszczenie strony, dopóki nie będzie już nic do wstrzyknięcia. – DaemonOfTheWest

+0

To był prosty przykład. Gdy już masz obiekt dokumentu, możesz nim manipulować, tak jak każdy inny obiekt dokumentu. Pamiętaj jednak, że zanim zaczniesz manipulować, musisz poczekać, aż DOM zostanie załadowany. –

+0

Nie, za każdym razem, gdy użyjesz '.write', najpierw usuniesz wszystkie treści z miejsca docelowego. Nie ma znaczenia, co robisz - to nie działa. – DaemonOfTheWest

0

Oto sztuczka używam, używa ciągów zapytań i jest po stronie klienta. Nie idealne, ale to działa:

Na stronie wysyłającego zrobić:

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

Wymień mypage.html ze swojej strony. Teraz na stronie przyjmowania dodaj:

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

Będziesz musiał zrobić kilka zwrotów, aby upewnić się, że to działa.


Jeśli MIEĆ PHP można użyć tego bardziej niezawodne rozwiązanie na stronie przyjmującej:

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

A jak to zrobić w pustym oknie 'window.open (" ")'? – Suncatcher