Вставить открытое окно со скриптом
этот вопрос запрашивает способ открыть новое окно с помощью 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'] ?>));