如何使用JavaScript从父窗口获取子窗口的URL

4


我正在打开一个带有窗口引用名称的子窗口。我想在每次其URL更改时捕获子窗口的URL。

    var winRef;
    var url='http://www.google.com';
    if(winRef == null || winRef.closed) 
    { 
      winRef = window.open(url, "mywindow");
      winRef.focus();
      alert(winRef.location.href); 
    }
    winRef.captureEvents(Event.CHANGE);  
    winRef.onchange=function(){
      alert('change event triggered');
      console.log(winRef.location.href);
    }


我已经尝试使用LOAD和CHANGE事件来捕获窗口位置的更改。但是,LOAD和CHANGE事件仅触发一次。

我不想使用setInterval来检查window.location.href的更改,因为这可能会导致性能问题。

有没有其他方法可以获取子窗口的URL?


你不能从另一个窗口这样做,你必须使用ajax将信息通过服务器发送到服务器或其他窗口,从子窗口本身发送。 - CME64
Phonegap的InAppBrowser有loadstart、loadstop等事件,可以捕获每次单击链接时的URL。我认为我们可以从我们的javascript window.open概念中实现相同的功能。 - Saranya Sukumar
@CME64 我也有同样的问题。所以子窗口必须将消息发送到服务器,然后服务器必须将此信息发送到父窗口?我的理解是正确的吗? - Dinesh
@SaranyaSukumar 我也有同样的问题。你能解决这个问题吗? - Dinesh
@Dinesh 是的,Windows 无法通过浏览器进行通信,因此您必须使用它们之间唯一的链接——服务器。您可以使用 ajax 轮询功能(例如每隔 10 秒轮询一次 url)设置父页面,并将子窗口中的信息发布到服务器,以在下一次调用时进行轮询...如果您想捕获子窗口的 url 并将其提供给父窗口。 - CME64
即使您使用 setInterval 对 window.location.href 进行轮询,只有当子窗口打开相同域名的 URL 而非跨域时才能这样做。因此,在您尝试打开 google.com 的示例中,您将无法读取 location.href。这是出于安全原因。 - gaurav5430
1个回答

1
你无法精确检测事件,但可以通过变通方法每隔X毫秒检查URL来实现。
var self = this

var detectsUrl = setInterval(function(){
    var a = winRef.document.createElement('a');
    a.href = winRef.document.URL;
    if (a.hostname == "www.myURL.com") {
        winRef.close();
        clearInterval(detectsUrl);
        self.callback();
    };
}, 1000); // Here we check every seconds

2
尽管我喜欢这个想法,但在许多情况下,除非您的子窗口页面来自于父窗口相同的域,否则当您尝试使用 winRef.document.url 时,将会出现跨站点安全性违规异常,因此这不是一个可行的解决方案。 - jcairney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接