【问题标题】:Call a JavaScript function across browser tabs跨浏览器选项卡调用 JavaScript 函数
【发布时间】:2011-02-06 13:21:00
【问题描述】:

我有两个浏览器选项卡,tab1 和 tab2。

我在 tab1 中有一个名为 execute 的函数,我想从 tab2 中的页面调用它。

这可能吗?如果可以,怎么做?

【问题讨论】:

  • 您现在可以使用 localStorage 存储事件或使用该事件的库来执行此操作。

标签: javascript


【解决方案1】:

JavaScript不能在浏览器中执行跨表脚本(这是一个安全风险)。

如果第二个标签页是通过window.open() 调用打开的,并且浏览器设置已设置为在新标签页中打开新的弹出窗口 - - 然后是的,“tab1”可以与“tab2”对话。

第一个选项卡/窗口称为opener,因此新选项卡可以使用以下格式调用开启器上的函数:

opener.doSomething();

同样,开启者可以在新标签/弹出窗口上调用函数,通过使用它在创建弹出窗口时创建的变量。

var myPopup = window.open(url, name, features);
myPopup.doStuffOnPopup();

【讨论】:

    【解决方案2】:

    有一个很小的开源组件可以同步/锁定/调用多个选项卡中的代码,允许您在选项卡之间发送消息(免责声明:我是贡献者之一!)

    https://github.com/jitbit/TabUtils

    可以这样称呼:

    TabUtils.BroadcastMessageToAllTabs("messageName", data);
    

    然后在另一个选项卡中:

    TabUtils.OnBroadcastMessage("messageName", function (data) {
        //do something
    });
    

    它是基于onstorage事件,你可以简单地修改你需要的代码,非常简单。

    【讨论】:

    • 它支持哪些网络浏览器(包括版本)?
    • @PeterMortensen 任何支持 localStorage 的浏览器
    【解决方案3】:

    你应该首先显示你的 HTML,但我假设你的标签有一个链接,你可以这样做:

    <a href="some-path" id="tab2">Tab 2</a>
    

    jQuery:

    $('#tab2').click(function(){
      // Your function code here
    
      // Prevent the default action
      return false;
    })
    

    【讨论】:

    • 我认为他的意思是真正的标签,而不是伪标签
    【解决方案4】:

    您可以将 JavaScript 函数引用作为参数传递给其他函数(注意对象执行上下文)。

    所以在初始化“tab2”时,可以将“tab1”的execute函数引用发送到“tab2”。

    【讨论】:

    • 我的基本问题是如何在其他窗口或其他选项卡中调用函数?
    • 我不知道有什么方法可以做到这一点! javascript 窗口对象不是我们可以使用的最父对象吗?你怎么能在另一个窗口中访问代码?! (据我了解,这违反了浏览器的工作原理)您能否再解释一下您的需求,我可能会提出一种解决方法。
    猜你喜欢
    • 2012-03-22
    • 2022-06-27
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多