标签: content-script

我注入的<script>在目标页面的javascript之后运行,尽管使用了run_at:document_start?

当我使用内容脚本将一些javascript注入HTML页面时,我遇到了javascript执行顺序的一些问题:

这是我用来测试的HTML页面,test.html:

<html><head>    
<title>Test Page</title></head>
  <body>
    <script>
      console.log("In page");
    </script>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)


这是我用来向HTML页面注入额外代码的javascript :injector.js:

var s = document.createElement("script");
s.src = chrome.extension.getURL("inject.js");
document.documentElement.appendChild(s);
console.log("Inject finished");
Run Code Online (Sandbox Code Playgroud)


这是注入脚本的内容,inject.js:

console.log("Inside inject.js");
Run Code Online (Sandbox Code Playgroud)


最后,这是我的manifest.json:

  "web_accessible_resources": [
    "inject.js"
  ],
  "content_scripts": [
    {
      "matches": ["<all_urls>"],
      "js": ["/injector.js"],
      "run_at": "document_start"
    }
  ]
Run Code Online (Sandbox Code Playgroud)


现在,当我打开test.html时,这就是我在控制台中得到的:

Inject finished
In page
Inside inject.js
Run Code Online (Sandbox Code Playgroud)


我的问题是,为什么In page之前打印出来Inside inject.js?是不是inject.js应该先运行,因为我设置run_atdocument_start

如果这是设计的,有什么方法可以确保inject.js中的内容在HTML页面内的脚本之前执行而不改变HTML页面内的任何内容

async属性设置为false …

javascript google-chrome-extension content-script

15
推荐指数
1
解决办法
6716
查看次数

在Chrome扩展程序内容脚本中包含Javascript文件

我正在编写一个Chrome扩展程序,并希望编写一个JS文件,该文件提供了一些不存在于另一个文件中的预期函数,然后加载其他文件.在传递当前模块本地和全局变量时,我的行为类似于requirePerl,#includeC或execfilePython中的行为,就像引用的文件直接插入当前脚本一样.

我能找到的大多数现有解决方案都提到嵌入这些"包含"内部脚本标签,但我不确定这是否适用(如果确实如此,请说明我的扩展名在当前页面中注入所有这些脚本标签的确切位置).

Update0

请注意,我正在编写内容脚本.至少在"用户"方面,我不提供原始的HTML文档.

javascript include google-chrome-extension content-script

13
推荐指数
1
解决办法
1万
查看次数

设置为`run_at``document_start`的Chrome扩展程序运行得太快了?

编辑:我的Chrome浏览器出现问题并与我的脚本产生冲突,无论问题来源是什么,都可以完全重新安装.如果我碰巧找出导致它的原因,我会把它包含在这里.

编辑2:只是为了让在2017年阅读此内容的人知道我没有忘记这一点,自从我之前的编辑以来我从未遇到过这个问题.

编辑3:这是2019年,到目前为止,我再也没遇到过这个问题.


我一直在学习如何创建一个简单的Chrome扩展程序,它是一个用户脚本端口.该脚本与Tampermonkey完美配合,设置run atdocument-start,所有需要从头开始捕获的必要事件都被捕获.

但是,当我在Chrome扩展程序中设置相同的设置时,我发现相同的运行设置比Tampermonkey更快,导致第一个函数失败:( Uncaught TypeError: Cannot call method 'appendChild' of null.)因为它尝试将一个脚本元素附加到该head部分,该部分不存在直到0.010秒之后.

到目前为止,我的脏解决方案是使用setInterval定时器设置为10 的函数来检查是否document.head存在,然后在条件为真时继续执行代码.

有没有什么方法可以让我正确地工作,而不必诉诸setInterval或可能复制Tampermonkey的grant none选项,似乎在网页上下文中运行用户脚本?

以下是我的manifest.json文件:

{
    "manifest_version": 2,
    "content_scripts": [ {
        "js":        [ "simpleuserscript.user.js" ],
        "matches":   [ "https://www.google.com/*"],
        "run_at":    "document_start"
    } ],
    "converted_from_user_script": true,
    "description":  "Chrome extension",
    "name":         "Testing",
    "version":      "1"
}
Run Code Online (Sandbox Code Playgroud)

如果Chrome将采用该afterscriptexecute事件,所有这一切都可以避免,但在此之前,我仍然坚持这一load事件.我提前感谢你提供的任何帮助.


编辑:我已经尝试了回复中的建议:使用不同的run at点,使用DOMContentLoaded和追加document.documentElement.所有都不成功,因为:1和2使脚本错过早期事件,3返回与尝试追加时相同的TypeError document.head.

脚本必须插入/运行时document.readyState = loading …

javascript google-chrome userscripts google-chrome-extension content-script

13
推荐指数
2
解决办法
2万
查看次数

在内容脚本中支持所有谷歌域名

我正在制作一个与谷歌搜索结果网页有关的内容脚本.

下面的行manifest.json无效.

"匹配":["https://www.google.*/*"]

manifest.json中由于以上行引起的错误是:

"content_scripts [0] .matches [0]"的值无效:主机通配符无效.

我想在各种域名上运行脚本,例如google.com,google.co.in,google.de等.我该如何做到这一点?

javascript manifest google-chrome-extension content-script

11
推荐指数
1
解决办法
3648
查看次数

YouTube上的浏览器导航未加载Chrome扩展程序

假设我有一个扩展程序,当你到达YouTube视频页面时加载.我注意到当使用Chrome按钮来回导航时,扩展程序很可能无法加载.

作为一个例子,我有2个文件,清单:

{
    "name": "back forth",
    "version": "0.1",
    "manifest_version": 2,
    "description": "back forth",
    "permissions": ["storage", "*://www.youtube.com/watch*"],
    "content_scripts": [
        {
            "matches": ["*://www.youtube.com/watch*"],
            "js": ["contentscript.js"]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

和内容

alert("loaded");
Run Code Online (Sandbox Code Playgroud)

在来回导航时,警报并不总是显示出来.我怎样才能克服这个问题,以便扩展每次加载?

youtube google-chrome-extension content-script

11
推荐指数
1
解决办法
4326
查看次数

剪贴板复制/粘贴内容脚本(Chrome扩展程序)

我正在使用内容脚本来操纵DOM中的数据.我一直在使用document.execCommand('copy'); 在弹出页面上成功完成.

我现在正在寻找一种方法使其适用于内容脚本.我已经检查内容脚本的限制在这里,但如果剪贴板控制是有限的或不是我不明白.我也在这里检查了答案 - 在stackoverflow中,但似乎大多数是不确定的,有些是几年前的,所以可能有变化.

即使它有限,是否可以采取某种解决方法?

谢谢!

我发布了我当前的脚本.

的manifest.json

{
  "name": "Page action by URL",
  "version": "1.0",
  "description": "???????? ?? ????????? ?? ??????? ?? ????.",
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "page_action" :
  {
    "default_icon" : "icon-19.png",
    "default_title" : "?????????? ?? ??? ?? PHP"
  },
  "permissions" : [
    "clipboardWrite",
    "clipboardRead",
    "declarativeContent",
    "activeTab",
    "tabs",
    "https://nbd.grao.government.bg/graoappshort/*"
  ],
  "icons" : {
    "48" : "icon-48.png",
    "128" : "icon-128.png"
  },
  "manifest_version": 2
}
Run Code Online (Sandbox Code Playgroud)

background.js

chrome.runtime.onInstalled.addListener(function() {
  // Replace all rules ... …
Run Code Online (Sandbox Code Playgroud)

google-chrome-extension content-script

11
推荐指数
1
解决办法
9516
查看次数

将@ font-face样式表规则添加到chrome扩展

通过chrome-extension添加@ font-face样式表规则的推荐方法是什么?问题是字体嵌入的url位于扩展内,所以我必须在javascript中使用才能使用chrome.extension.getURL.

我尝试document.styleSheets[0].addRule过内容脚本,但是没有用.为了澄清,我也有web_accessible_resources下列出的字体.

javascript css font-face google-chrome-extension content-script

10
推荐指数
2
解决办法
5284
查看次数

如何使用Chrome扩展程序中的给定char/keycode初始化键盘事件?

我正在开发一个Google Chrome扩展程序,用于模拟网页上的键盘事件.

我发现event.initKeyboardEvent()因为这个webkit bug 而无法正常工作,我也找到了一些解决方法,例如SO Question

但是,在事件对象上定义属性不起作用,因为扩展的内容脚本具有自己的"并行世界",因此内容脚本中定义的属性对于Web页脚本不可见.

我唯一也是最后希望DOM 4 Event Constructors在Google Chrome中运行,并且可以通过构造函数正确初始化键盘事件

var event = new KeyboardEvent("keypress", {key: 'U+0041', char: 'a', ... })
Run Code Online (Sandbox Code Playgroud)

不幸的是,它失败了:

TypeError: illegal constructor  
Run Code Online (Sandbox Code Playgroud)

我无法在Chrome中找到有关受支持的事件构造函数的任何文档.有人能指点我一些文档/源代码吗?

是否有其他方法可以在Google Chrome扩展程序中模拟键盘事件?

(注意,TextEvent,并将不会帮助,因为许多现实世界的控制听keydown/ keyup专)

javascript google-chrome google-chrome-extension dom-events content-script

10
推荐指数
3
解决办法
9340
查看次数

Chrome内容脚本无效:DOMContentLoaded侦听器无法执行

我正在尝试编码扩展,以纠正1个论坛上的拼写错误.

我正在尝试<p>使用内容脚本访问标记,但它不会更改任何内容(使用下面的代码):

document.addEventListener("DOMContentLoaded", function() {
    document.getElementsByTagName("P")[4].innerHTML = "correct_word"; 
}); 
Run Code Online (Sandbox Code Playgroud)

当作为扩展添加时它不会改变任何东西,显然如果我wget是页面,并将脚本放在那里,一切正常.有什么想法吗?

我的manifest.json文件:

{
    "manifest_version": 2,
    "name": "Extension",
    "description": "Description",
    "version": "1.0",
    "content_scripts": [{
        "run_at": "document_end",
        "matches": ["http://example.com/"],
        "js": ["script.js"]
    }],
    "web_accessible_resources": ["Filedeleted(really).html"]
}
Run Code Online (Sandbox Code Playgroud)

我知道内容脚本和WWW页面有不同的沙箱,也许内容脚本无法访问页面(和标签)?

javascript google-chrome google-chrome-extension content-script

10
推荐指数
1
解决办法
4456
查看次数

如何将消息发布到 iFrame 中?

我正在开发一个 Chrome 扩展程序以与我自己的 Web 应用程序一起使用,处理加载到iFrame我的应用程序主页上的网页(包括跨域页面)。所以我必须发送消息,包含要处理的页面的 URL,从我的主页面到内容脚本,注入目标iFrame以访问已处理页面的窗口。

我尝试实施这里描述的方法。以下是所有涉及的文件的基本部分:

index.html

...
<head>
    ...
    <script type="text/javascript" src="base.js"></script>
</head>
<body>
    <div>
        <input type="text" id="page_url">&nbsp;<input type="button" id="get_page" value="Get page">
    </div>
    <iframe id="cross_domain_page" src=""></iframe>
</body>
Run Code Online (Sandbox Code Playgroud)

base.js

(function() {
    "use strict";
    function pageProcessing() {
        let urlButton = window.document.getElementById("get_page");
        urlButton.addEventListener("click", () => {
            let url = window.document.getElementById("page_url").value;
            window.postMessage(
                {
                    sender: "get_page_button1",
                    message: url
                },
                "*"
            );
            window.postMessage(
                {
                    sender: "get_page_button2",
                    message: url
                },
                "*"
            );
        });
    }
    window.document.addEventListener('readystatechange', () => …
Run Code Online (Sandbox Code Playgroud)

javascript iframe postmessage google-chrome-extension content-script

10
推荐指数
1
解决办法
3万
查看次数