当前位置: 首页 > 知识库问答 >
问题:

在没有窗口引用的选项卡dom之间通信[duplicate]

拓拔玺
2023-03-14

我使用以下方法打开带有一些页面内容的new tab(在new process中),

var p = document.getElementById("myElement"); 
var a = document.createElement('a');
a.setAttribute('href',".../mypage.html");
a.setAttribute('rel',"noreferrer");
a.setAttribute('target',"_blank");
p.appendChild(a);
a.click();

http://news.softpedia.com/news/force-google-chrome-to-open-links-in-new-processes-128962.shtml

这起作用了,新的选项卡打开了mypage.html内容。

假设这是myPage(只是示例...)我应该如何访问它?

<!DOCTYPE html>
<html>
<body>

<h1> Heading</h1>
<p> paragraph.</p>
 <button type="button">Click Me!</button>

</body>
</html>

现在让我们进入棘手的/高级:)部分...

当您使用window.open(我不能使用)时,这非常简单,因为您可以使用各种技术。

 1. using window object
 2. post message
 https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
 3. cookies 
 4. localStorage

但在这里,我打开了这个新页面,没有使用window.open获得的引用

我的问题是:

如果我想更改某些内容,如何访问这个新选项卡dom

共有2个答案

桑成荫
2023-03-14

父页JavaScript:

var lastMessage;
setInterval(function() {
  var message = localStorage.getItem('message-to-parent');
  if (message && message !== lastMessage) {
    lastMessage = message;
    // your code here
    alert('There is a new message for you: ' + message);
  }
}, 100);

子页JavaScript:

localStorage.setItem('message-to-parent', 'hello, my parent!');

如果您有很多动画和其他巨大的JS代码,我建议增加计时器间隔,或者更好地用window来解决这个问题。

方弘
2023-03-14

我遇到了一个类似的问题,并构建了一个小型库,使通过带有paramter的localStorage进行函数调用成为可能。你可以在这里找到。当前并非所有浏览器都支持Service worker。

下面是一个如何使用它的示例:

//Register a function: 
RegisterLocalStorageFunction("test", function(param){ 
    return param+param; 
});

//Call a function: 
let str = "testing"; 
CallLocalStorageFunction("test",str,function(para){ 
    console.log(para); 
});

在您的上下文中:

RegisterLocalStorageFunction("CallAlert", function(param){ 
    alert(param);
    return "Success"; 
});
var p = document.getElementById("myElement");
var a = document.createElement('a');
a.setAttribute('href',".../mypage.html");
a.setAttribute('rel',"noreferrer");
a.setAttribute('target',"_blank");
p.appendChild(a);
a.click();

在另一个窗口中:

<!DOCTYPE html>
<html>
<body>
<h1> Heading</h1>
<p> paragraph.</p>
<button type="button" onclick="btnClick()">Click Me!</button>
<script>
    function btnclick(){
        CallLocalStorageFunction("CallAlert","Hello from the other tab",function(para){ 
            console.log("para"); 
        });
}
</script>
</body>
</html>

双方必须位于同一域上,否则它们无法访问相同的本地存储。 <罢工> 使用github上的当前代码,我使用setInterval循环访问存储。 存在一个存储事件,该事件对所有其他选项卡和窗口激发,但不对同一选项卡激发。 <罢工> 我将重写lib以使用更干净的方法处理事件,但现在这应该起作用。

更新

在存储库中可以找到communicator2,它基于“storage”事件。

更新

下面是一个工作示例。请记住允许弹出窗口。

 类似资料:
  • 我正在寻找一种方法,如何在浏览器中的多个选项卡或窗口之间进行通信(在同一个域上,而不是CORS上)而不留下痕迹。有几种解决办法: 使用窗口对象 邮件后传 Cookies 本地存储 第一种可能是最糟糕的解决方案--你需要从你当前的窗口打开一个窗口,然后你只能在保持窗口打开的情况下进行交流。如果您在任何窗口中重新加载该页,则很可能会丢失通信。 第二种方法,使用postMessage,可能可以实现跨源通

  • 问题内容: 我有两个窗口:窗口A和窗口B。 窗口A和窗口B具有相同的域 窗口A和窗口B没有任何父窗口。 问题: 窗口A是否可以获得窗口B的引用? 使窗口A通知窗口B的最优雅方法是什么? (包括新的HTML5规范) 我知道这样做的两种方式: 服务器发送消息:窗口B经常询问服务器,窗口A是否已通知某些内容 通过本地数据(HTML5)进行消息传递:当窗口A要通知其更改本地数据的内容时,窗口B会定期检查本

  • 我已经搜索了很多关于如何使用SlidengTablayout在片段之间进行通信的内容,但还没有找到一个好的答案。我知道使用ActionBar,但我想要的是androidLollipop使用SlidingTabLayout的新方式。我试过了-

  • 我正在学习本教程中的示例。根据教程,我想在两个选项卡之间拖动选项卡。到目前为止,我设法创建了这段代码,但我需要一些帮助才能完成代码。 来源 将选项卡的内容作为对象插入的正确方法是什么?简单的文本被转移到教程中。我必须如何修改这行< code>content.put(DataFormat。PLAIN_TEXT,tab pane);? 拖动选项卡后插入选项卡的正确方法是什么: 目的地 我想这个转移可以

  • 问题内容: 我有一个表单,当我单击它时会在新选项卡中打开。当我尝试导航到该新选项卡时,我不断收到NoSuchWindowException。代码非常简单。“ myframe”是新标签中最终将被插入信息的框架。我应该再等吗? 问题答案: 感谢Debanjan(并为以后的回复表示歉意-刚回到办公室)。我能够通过使用解决此问题 我没有意识到,当我单击打开表单时,另一个窗口在后台非常短暂地打开,然后关闭。

  • 我试着用: 但是Selenium Webdriver的焦点停留在第一个选项卡上,因为我认为它没有为新选项卡创建新句柄。 还有,试过这个: 任何帮助都很感激。谢了。