使用脚本

时间:2015-04-28 03:46:13

标签: javascript window

This question要求使用window.open打开新窗口,然后用脚本注入它。由于跨域安全问题,这是不可能的。

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

请注意,.write无法解决此问题,因为它会首先从页面中删除所有html。

3 个答案:

答案 0 :(得分:10)

您可以执行以下操作:

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事件的脚本(&#1} 39; d覆盖注入脚本)。

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

另请注意,您可以使用theWindow.onload操纵this事件内的新窗口的DOM。

答案 1 :(得分:0)

...是

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    // Return the number of sections.
    return 1   
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    // Return the number of rows in the section.

       return 3
}

答案 2 :(得分:0)

这是我使用的技巧,它使用查询字符串,并且是客户端。不完美但有效:

在发送页面上,执行:

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'] ?>));