Вставить открытое окно со скриптом

этот вопрос запрашивает способ открыть новое окно с помощью window.open а затем ввести его со скриптом. Это было невозможно из-за междоменных проблем безопасности.

однако моя проблема в том, что я хочу сделать то же самое, за исключением того же домена в том же домене. Возможно ли это?

отметим, что .write не решает эту проблему, потому что сначала стирает весь html со страницы.

3 ответов


вы можете сделать что-то вроде этого:

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

это, кажется, работает:

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 событие (оно перезапишет сценарий инъекции).

обратите внимание, что вы можете сделать что-нибудь внутри


да...

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

вот трюк, который я использую, он использует строки запроса и является клиентской стороной. Не идеально, но это работает:

на странице отправки, сделать:

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 вы можете использовать это более надежное решение на получение страницы:
eval(decodeURIComponent(<?=$_GET['javascript'] ?>));