在Chrome扩展程序中,内容脚本不会影响iframe内部?

时间:2011-07-10 14:42:49

标签: google-chrome-extension

在manifest.json文件中,我声明我想要注入一些脚本,如:

{
    "name": "my extension",

    "version": "1.0",

    "background_page": "background.html",

    "permissions": ["contextMenus", "tabs", "http://*.example.com/*"],

    "content_scripts": [
        {
            "matches":
                [
                "http://*.taobao.com/*",
                "http://*.yintai.com/*"
                ],
            "run_at": "document_idle",
            "js": ["jquery-1.5.1.min.js","jquery-ui-1.8.13.custom.min.js", "contentscript.js"],
            "all_frames": true
        }
    ]
}

在内容脚本中,我创建了一个iframe等。它到目前为止工作正常。像这样:

$('<div id="my_notifier"></div>').appendTo($('body')).html('<iframe src="http://example.com"></iframe>');

问题是,在iframe内部,它不会从内容脚本继承任何内容。如果我想使用jQuery,我必须使用<script src=...将其再次包含在iframe中。

我不想再次包含jQuery,因为我已将它放在扩展名中。我不希望用户在扩展程序需要运行的每个页面上一次又一次地下载jQuery。

我已经尝试了属性"all_frames": true,但它不起作用。

请指教。感谢。

编辑:我将example.com添加到matches属性中,如下所示:

"content_scripts": [
    {
        "matches":
            [
            "http://*.taobao.com/*",
            "http://*.yintai.com/*", 
            "http://*.example.com/*"
            ],
        "run_at": "document_idle",
        "js": ["jquery-1.5.1.min.js","jquery-ui-1.8.13.custom.min.js", "contentscript.js"],
        "all_frames": true
    }
]

但它不起作用。

更清楚的是,iframe(example.com)的内容是:

<!DOCTYPE HTML>

<html>
<head>
    <title>Untitled</title>
</head>

<body>

<div></div>

<script type="text/javascript">
    $('div').html('hi');  

</script>

</body>
</html>

会出现错误:$未定义

为了使其有效,我必须使用:

<!DOCTYPE HTML>

<html>
<head>
    <title>Untitled</title>
</head>

<body>

<div></div>

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">
    $('div').html('hi');  

</script>

</body>
</html>

3 个答案:

答案 0 :(得分:5)

您需要将iframe的网址http://example.com添加到列表中,并指定要注入的内容脚本:

 "content_scripts": [
        {
            "matches":
                [
                "http://*.taobao.com/*",
                "http://*.yintai.com/*"
                ],
            "run_at": "document_idle",
            "js": ["jquery-1.5.1.min.js","jquery-ui-1.8.13.custom.min.js", "contentscript.js"]
        },{
            "matches":["http://example.com/*"],
            "run_at": "document_idle",
            "js": ["jquery-1.5.1.min.js"],
            "all_frames": true
        }
    ]

答案 1 :(得分:0)

答案很简单:

  • 检查新标签是否已更新
  • 是你的网址吗?
  • 执行您想要的脚本

dynamically deploying content scripts in chrome extensions

答案 2 :(得分:-1)

如果性能对您很重要,如果我建议您使用纯javascript而不是jQuery,那么对于包含多个iFrame的重页,性能差异会很明显;特别是如果你使用jquery函数,如追加过滤器复杂选择器