Javascript 新窗口是在单击时创建的,而不是在页面加载时创建的

Javascript 新窗口是在单击时创建的,而不是在页面加载时创建的,javascript,jquery,google-chrome-extension,Javascript,Jquery,Google Chrome Extension,我是chrome扩展开发的新手。试着把手放在我的第一只手上 我正在尝试编写一个扩展,在每次加载页面时执行特定的操作 每次加载页面时都需要发送post请求。我使用ajax请求来实现这一点。成功发送请求后,我想打开一个弹出/新建窗口 这是我的清单文件 { "manifest_version": 2, "name": "Coupons", "version": "1.0", "description": "Yay! Coupons", "icons": { "1

我是chrome扩展开发的新手。试着把手放在我的第一只手上

我正在尝试编写一个扩展,在每次加载页面时执行特定的操作

每次加载页面时都需要发送post请求。我使用ajax请求来实现这一点。成功发送请求后,我想打开一个弹出/新建窗口

这是我的清单文件

{
    "manifest_version": 2,
    "name": "Coupons",
    "version": "1.0",
    "description": "Yay! Coupons",
    "icons": { "16": "images/carbs16.png",
               "48": "images/carbs48.png",
               "128": "images/carbs128.png" },
               "browser_action": {
               "default_title": "Coupons ! Yay",
    "default_icon": "images/carbs48.png",
    "default_popup":"start.html"
},
"permissions":
    ["https://example.com/"],
    "content_security_policy": "script-src 'self' https://ajax.googleapis.com; object-src 'self'",
    "content_scripts": 
    [
        {
            "matches": ["*://*/*"], 
            "js": ["jquery-2.1.3.min.js","myscript.js"],
            "run_at": "document_end"  
        }
    ]
}
这是我的myscript.js文件

$.post("https://example.com",
{
    product_name: url,
    desc:"Yo",
    price: "22"
},
function(data){
    //alert("yay")
    chrome.windows.create({'url':'void.html','type':'popup'},function(window){  

    })  
});
这是我的start.html文件:

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
<script src="myscript.js"></script>
</head>
<body>
</body>
</html>

我面临的问题如下:

当我在浏览器中单击我的chrome扩展的图标时,请求被成功发送,并创建了一个新窗口

然而,其目的正是为了在每次页面加载时实现这一点。但在这种情况下,请求会在页面加载时发送(这意味着文件会执行)。但是,我要创建的新窗口没有显示


任何关于为什么会发生这种情况的想法都会非常有用。谢谢

问题在于内容脚本中未定义
chrome.windows
。如果您在控制台中查看,您应该会在加载新选项卡时看到一个错误

它第一次起作用是因为您正在从浏览器操作弹出窗口运行
myscript.js
,该弹出窗口可以访问
chrome.windows

如果您只想在加载页面时执行此操作,则只需内容脚本即可完成此操作。您不需要
start.html
,而且
browser\u操作
对象可以从
manifest.json
中删除

此外,您需要修改内容脚本以使用
window.open
而不是
chrome.windows

添加@abrahams评论:


window.open
如果不是由用户操作触发的,则可能会被弹出窗口阻止程序阻止。解决方案可能是将消息发布到后台脚本,然后从那里使用chrome.windows。

是否有理由
myscript.js
同时出现在
start.html
context\u脚本中?第一种情况是图标单击,第二种情况是单个选项卡。@peterdotjs是,我把它放在这两个文件中,只是为了分析为什么它在单击和单击时表现不同loading@peterdotjs另外,您能告诉我在我的内容脚本中,我应该在哪里添加window.open或chrome.windows我猜
window.open如果不是由用户操作触发的,将被弹出窗口阻止程序阻止。解决方案可能是将消息发布到后台脚本中,然后在那里使用
chrome.windows
。@abraham您能告诉我如何使用后台脚本来实现这一点吗?我对javascript和制作一个extension@shahharsh2603退房