javascript – 使用脚本注入打开的窗口

前端之家收集整理的这篇文章主要介绍了javascript – 使用脚本注入打开的窗口前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
This question要求使用window.open打开一个新窗口,然后用脚本注入它.由于跨域安全问题,这是不可能的.

但是,我的问题是我想做同样的事情,除了从同一个域到同一个域.这可能吗?

请注意.write不能解决此问题,因为它首先擦除页面中的所有html.

解决方法

你可以这样做:
var theWindow = window.open('https://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('https://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('https://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);
};

这是做什么的(第一部分代码的解释.所有例子都非常相似):

>打开新窗口
>获取对新窗口文档的引用
>创建一个脚本元素
>将您想要“注入”的所有代码放入函数
>更改脚本的innerHTML以在窗口时加载所述函数
使用window.onload事件加载(也可以使用addEventListener).我使用toString()是为了方便,所以你不必连接一堆字符串. toString基本上将整个injectThis函数作为字符串返回.
>将脚本附加到新窗口的document.body,它实际上不会将它附加到加载的文档中,它会在加载之前附加它(到空体),这就是为什么你必须使用window.onload,以便您的脚本可以操作新文档.

使用window.addEventListener(‘load’,injectThis.toString())可能是个好主意;而不是window.onload,以防你的新页面中有一个使用window.onload事件的脚本(它会覆盖注入脚本).

请注意,您可以在injectThis函数内部执行任何操作:追加DIV,执行DOM查询,添加更多脚本等等…

另请注意,您可以使用此操作来处理theWindow.onload事件内的新窗口的DOM.

猜你在找的JavaScript相关文章