当我使用内容脚本将一些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_at到document_start?
如果这是设计的,有什么方法可以确保inject.js中的内容在HTML页面内的脚本之前执行而不改变HTML页面内的任何内容?
将async属性设置为false …
我正在编写一个Chrome扩展程序,并希望编写一个JS文件,该文件提供了一些不存在于另一个文件中的预期函数,然后加载其他文件.在传递当前模块本地和全局变量时,我的行为类似于requirePerl,#includeC或execfilePython中的行为,就像引用的文件直接插入当前脚本一样.
我能找到的大多数现有解决方案都提到嵌入这些"包含"内部脚本标签,但我不确定这是否适用(如果确实如此,请说明我的扩展名在当前页面中注入所有这些脚本标签的确切位置).
请注意,我正在编写内容脚本.至少在"用户"方面,我不提供原始的HTML文档.
编辑:我的Chrome浏览器出现问题并与我的脚本产生冲突,无论问题来源是什么,都可以完全重新安装.如果我碰巧找出导致它的原因,我会把它包含在这里.
编辑2:只是为了让在2017年阅读此内容的人知道我没有忘记这一点,自从我之前的编辑以来我从未遇到过这个问题.
编辑3:这是2019年,到目前为止,我再也没遇到过这个问题.
我一直在学习如何创建一个简单的Chrome扩展程序,它是一个用户脚本端口.该脚本与Tampermonkey完美配合,设置run at为document-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
我正在制作一个与谷歌搜索结果网页有关的内容脚本.
下面的行manifest.json无效.
"匹配":["https://www.google.*/*"]
manifest.json中由于以上行引起的错误是:
"content_scripts [0] .matches [0]"的值无效:主机通配符无效.
我想在各种域名上运行脚本,例如google.com,google.co.in,google.de等.我该如何做到这一点?
假设我有一个扩展程序,当你到达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)
在来回导航时,警报并不总是显示出来.我怎样才能克服这个问题,以便扩展每次加载?
我正在使用内容脚本来操纵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) 通过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
我正在开发一个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
我正在尝试编码扩展,以纠正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
我正在开发一个 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"> <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
content-script ×10
javascript ×8
css ×1
dom-events ×1
font-face ×1
iframe ×1
include ×1
manifest ×1
postmessage ×1
userscripts ×1
youtube ×1