Chrome扩展:在弹出窗口中从iframe创建选项卡

3
在我的弹出页面中,有一个 iframe 标签,在其中有一个按钮。当点击该按钮时,会调用包含在 iframe 脚本中的函数。该函数包含对 chrome.tabs.create({ url: "..."}); 的调用,但是我一直收到 "Uncaught TypeError: Cannot call method 'create' of undefined". 的错误信息。我猜原因是我在 iframe 中,而不是在弹出页面本身。
是否有办法在 iframe 中创建一个新选项卡来克服这个障碍? 编辑 以下是我的代码。
以下内容加载到弹出页面的 iframe 中:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <link rel="stylesheet" type="text/css" href="style/frame_style.css" media="screen" />
  <script src='jquery-1.8.3.js'></script>
  <script src='scripts/frame_functions.js'></script>
</head>

<body>
  <div>
    <button value="Click to open Google in a new tab" class='new_tab_bt'></button>
  </div>
</body>
</html>

frame_functions.js:

$(document).on("click", '.new_tab_bt', function(){
  openNewTab(); 
});

function openNewTab()
{
chrome.tabs.create({ url: "https://www.google.com" });
}

你是如何在iframe中添加onclick代码到按钮的?你能分享一下iframe和相关的点击代码吗? - Sudarshan
感谢您的评论。已内联添加。 - Subway
1个回答

0

您的代码没有任何更改就可以正常工作,我已经添加了一个可供参考的工作代码;您的目标源HTML页面在哪里使用了iframe,您是如何从浏览器操作弹出窗口引用它的?如果这没有解决问题,请分享您是如何从浏览器操作弹出窗口引用您的iframe

工作版本

manifest.json

简单的代码,注册了浏览器操作

{
    "name": "Iframe Holder",
    "description": "https://dev59.com/u23Xa4cB1Zd3GeqPenGG",
    "version": "1",
    "manifest_version": 2,
    "browser_action": {
        "default_popup": "popup.html",
        "default_title": "Iframe."
    }
}

popup.html

在浏览器操作的弹出窗口中包含了目标页面。

<html>

    <body>
        <iframe width="300" height="300" src="iframe.html"></iframe>
    </body>

</html>

iframe.html

使用了您的代码,并删除了不相关的CSS文件等

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <script src='jquery.js'></script>
        <script src='iframe.js'></script>
    </head>

    <body>
        <div>
            <button value="Click to open Google in a new tab" class='new_tab_bt'></button>
        </div>
    </body>

</html>

iframe.js

没有进行任何修改,直接使用了您的代码

$(document).on("click", '.new_tab_bt', function () {
    openNewTab();
});

function openNewTab() {
    chrome.tabs.create({
        url: "https://www.google.com"
    });
}

2
非常感谢。这可能适用于您,因为您的iframe.html成为扩展的一部分,因为它位于扩展目录中并包含在popup.html中。但是我正在尝试从远程服务器加载iframe以及iframe.js(如果将iframe.js留在扩展目录中可以解决问题,但我没有找到使其工作的方法)。 - Subway
@Subway:你认为将文件放置在同一目录下会有什么问题吗? - Sudarshan
不,这与相同的目录无关。 iframe中的按钮是根据放置在远程服务器上的数据创建(或未创建)。 您是正确的,我可以重新设计整个系统,以便仅从服务器发送数据,并根据发送的数据在本地创建iframe,但我正在寻找一种方法来保留当前设计,其中iframe的内容在服务器上创建并显示在弹出窗口中。 当包含在iframe中的按钮被点击时,是否可能触发选项卡的创建? - Subway

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