使用脚本注入打开的 window
Inject an opened window with script
This question 请求使用 window.open
打开一个新的 window 然后用脚本注入它的方法。由于跨域安全问题无法实现。
但是,我的问题是我想做完全相同的事情,除了从同一个域到同一个域。这可能吗?
请注意 .write
不能解决这个问题,因为它首先从页面上擦除所有 html。
是的...
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'] ?>));
你可以这样做:
var theWindow = window.open('http://whosebug.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://whosebug.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://whosebug.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);
};
这是做什么的(第一位代码的解释。所有示例都非常相似):
- 打开新的 window
- 获取对新 window 的
document
的引用
- 创建脚本元素
- 将您想要 'inject' 的所有代码放入一个函数中
- 更改脚本的
innerHTML
以在 window 时加载所述函数
使用 window.onload
事件加载(您也可以使用 addEventListener
)。为方便起见,我使用了 toString()
,因此您不必连接一堆字符串。 toString
基本上 returns 整个 injectThis
函数作为一个字符串。
- 将脚本附加到新的 window 的
document.body
,它实际上不会将它附加到加载的文档,而是在加载之前附加它(到空主体) ,这就是为什么您必须使用 window.onload
,以便您的脚本可以操作新文档。
使用 window.addEventListener('load', injectThis.toString());
代替 window.onload
可能是个好主意,以防您的新页面中已有使用 window.onload
事件的脚本(它会覆盖注入脚本)。
请注意,您可以在 injectThis
函数内执行任何操作:附加 DIV、执行 DOM 查询、添加更多脚本等...
另请注意,您可以使用 this
.
在 theWindow.onload
事件中操纵新的 window 的 DOM
This question 请求使用 window.open
打开一个新的 window 然后用脚本注入它的方法。由于跨域安全问题无法实现。
但是,我的问题是我想做完全相同的事情,除了从同一个域到同一个域。这可能吗?
请注意 .write
不能解决这个问题,因为它首先从页面上擦除所有 html。
是的...
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'] ?>));
你可以这样做:
var theWindow = window.open('http://whosebug.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://whosebug.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://whosebug.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);
};
这是做什么的(第一位代码的解释。所有示例都非常相似):
- 打开新的 window
- 获取对新 window 的
document
的引用
- 创建脚本元素
- 将您想要 'inject' 的所有代码放入一个函数中
- 更改脚本的
innerHTML
以在 window 时加载所述函数 使用window.onload
事件加载(您也可以使用addEventListener
)。为方便起见,我使用了toString()
,因此您不必连接一堆字符串。toString
基本上 returns 整个injectThis
函数作为一个字符串。 - 将脚本附加到新的 window 的
document.body
,它实际上不会将它附加到加载的文档,而是在加载之前附加它(到空主体) ,这就是为什么您必须使用window.onload
,以便您的脚本可以操作新文档。
使用 window.addEventListener('load', injectThis.toString());
代替 window.onload
可能是个好主意,以防您的新页面中已有使用 window.onload
事件的脚本(它会覆盖注入脚本)。
请注意,您可以在 injectThis
函数内执行任何操作:附加 DIV、执行 DOM 查询、添加更多脚本等...
另请注意,您可以使用 this
.
theWindow.onload
事件中操纵新的 window 的 DOM