打开另一个页面时运行javascript

时间:2013-04-14 08:45:11

标签: javascript

我想从javascript打开另一个网页(如默认导航,而不是全屏iframe或window.open)并在加载时运行一些javascript代码。

步骤:

  1. 定义javascript函数
  2. 导航到另一页
  3. 浏览器在新页面上下文中运行功能
  4. 有没有办法实现这个目标?我记得的唯一方法是通过使用ajax加载页面并替换document.body.innerHtml然后运行该函数来模拟这个,但这不会改变location.href,例如后退按钮或书签不起作用。还有相关链接必须在加载等时重写......

    PS:我知道这将是一些丑陋的XSS,但是在编写加载页面并自动填写表单的bookmarklet时需要它。

4 个答案:

答案 0 :(得分:2)

不,你不能这样做。这将允许你做一些事情,比如在幕后偷取会话劫持的cookie,所以没有任何浏览器允许你这样做。

答案 1 :(得分:1)

虽然可能存在一些合法用例,但出于安全原因,除非新页面位于同一域中,否则无法执行此操作。

如果目标浏览器具有扩展支持,您可以做的是编写浏览器扩展,

或告诉用户打开目标页面,并在该上下文中使用您的书签。

答案 2 :(得分:1)

如果您从自己的服务器加载其他页面,则可以执行所有这些操作:

假设您要在网站http://other.com中加载http://mine.org 你写了一个小的服务器端脚本,你可以像这样调用: http://mine.org/load.php?site1(包含您所有网站的网址 想要加载load.php或某些数据库中列出的内容)

但现在您的网站存在安全问题:嵌入了javascript http://other.com在您的网站上下文中运行。

答案 3 :(得分:0)

好的,研究结果:

不可能的方法:

  • 使用一些持久性函数在新页面上运行(就像我在问题中建议的那样)
  • 使用iframe替换整个页面(丑陋且被大多数浏览器禁止)

矫枉过正方法:

  • 编写浏览器插件
  • 让远程页面所有者接受一些GET参数并为你做这些事

剩余方法1,需要用户互动:

(function(){
  if(self.location.href!=targetlocation){
    window.alert("Please run this bookmarklet again upon loading the page.");
    self.location.href=targetlocation;
  }else{
    doSomething();
  }
  return false;
})();

剩下的方法2,做一些讨厌的代理:

  • 写一些php / etc脚本来“代理”目标页面
  • 现在你可以:
    • 使用iframe,因为它不再是跨站点
    • 在发送到浏览器之前重写页面服务器端(自己做“overkill方法:GET参数”)

示例:

<?php //USAGE: ?uri=http://www.google.com&search[0]=L2dvb2dsZS8K&replace[0]=dGVzdAo=
  $page=file_get_contents($_GET["uri"]);
  $count = min(count($_GET["search"]),count($_GET["replace"]),100);
  for ($i = 0; $i < $count; $i++) {
    $page=preg_replace(base64_decode($_GET["search"][$i]),
                       base64_decode($_GET["replace"][$i]), $page);
  }
  echo $page;
?>