我正在学习如何创建Chrome扩展程序.我刚开始开发一个来捕捉YouTube活动.我想将它与YouTube Flash播放器一起使用(稍后我将尝试使其与HTML5兼容).
manifest.json的:
{
"name": "MyExtension",
"version": "1.0",
"description": "Gotta catch Youtube events!",
"permissions": ["tabs", "http://*/*"],
"content_scripts" : [{
"matches" : [ "www.youtube.com/*"],
"js" : ["myScript.js"]
}]
}
Run Code Online (Sandbox Code Playgroud)
myScript.js:
function state() { console.log("State Changed!"); }
var player = document.getElementById("movie_player");
player.addEventListener("onStateChange", "state");
console.log("Started!");
Run Code Online (Sandbox Code Playgroud)
问题是控制台给了我"开始!" ,但没有"状态改变!" 当我播放/暂停YouTube视频时.
将此代码放入控制台时,它可以正常工作.我究竟做错了什么?
javascript google-chrome youtube-api google-chrome-extension content-script
我试图让我的Chrome扩展程序在init()
加载新页面时运行该功能,但我无法理解如何执行此操作.根据我的理解,我需要在background.html中执行以下操作:
chrome.tabs.onUpdated.addListener()
来检查时,页面变更chrome.tabs.executeScript
运行的脚本.这是我的代码:
//background.html
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
chrome.tabs.executeScript(null, {code:"init();"});
});
//script.js
function init() {
alert("It works!");
}
Run Code Online (Sandbox Code Playgroud)
我也想知道init()函数是否可以访问其他JS文件中的其他函数?
我正在做一个插件来对界面进行一些转换.我一直在unsafe javascript attempt to access frame with url.... Domains, protocols and ports must match
(典型的跨站点问题)
但作为扩展程序,它应该可以访问iframe的内容http://code.google.com/chrome/extensions/content_scripts.html ...
没有人知道如何访问它的内容,以便它们可以被捕获吗?
我想制作一个Chrome扩展程序,在其中提供一个新对象window
.当在加载了扩展名的浏览器中查看网页时,我希望window.mything
通过Javascript提供.该window.mything
对象将具有我将在扩展中定义的一些函数,并且console.log
当在启用了扩展的浏览器中查看页面时,这些函数应该可以从任何Javascript文件调用.
我能够使用内容脚本成功地将Javascript文件注入页面:
var s = document.createElement("script");
s.src = chrome.extension.getURL("mything.js");
document.getElementsByTagName("head")[0].appendChild(s);
Run Code Online (Sandbox Code Playgroud)
mything.js看起来像这样:
window.mything = {thing: true};
console.log(window);
Run Code Online (Sandbox Code Playgroud)
每当页面加载时,我都会看到整个window
对象,因为我希望它在控制台中.但是,我无法window.mything
从控制台与对象进行交互.似乎注入的脚本没有真正修改全局window
对象.
如何window
从Chrome扩展程序修改全局对象?
我有一个Chrome扩展程序,如果window.my_variable_name
存在变量,它会尝试查找每个浏览过的网址(以及每个浏览器网址的每个iframe).
所以我写了一小段内容脚本:
function detectVariable(){
if(window.my_variable_name || typeof my_variable_name !== "undefined") return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
在尝试太久之后,似乎Content Scripts在一些沙箱中运行.
有没有办法window
从Chrome内容脚本访问该元素?
有一个谷歌Chrome扩展用content script
,处理发生在所有选项卡页面JS错误.但问题是没有一种常见的获取错误堆栈跟踪的方法不起作用.
例如,content script
Chrome扩展程序中有一段代码:
window.addEventListener('error', function(event) {
console.log(event.error.stack); // event.error will be null
}, false);
Run Code Online (Sandbox Code Playgroud)
如果我在网页中调用此代码,那么event.error
将包含Error
具有stack
属性的对象.
使用以下方法尝试获取堆栈跟踪的问题相同:
console.log((new Error()).stack));
Run Code Online (Sandbox Code Playgroud)
有没有人知道一些工作问题,以获得content script
Chrome扩展内的错误堆栈跟踪?
错误堆栈跟踪必须作为string
或接收Array
,并不意味着通过调用JS控制台中的某些输出console.trace()
.
如何重现:
jzen.zip
到某个/jsen
文件夹chrome://extensions
在您的Google Chrome中打开,启用Developer mode
http://i.imgur.com/5x5D6NP.pngLoad unpacked extension
按钮并选择/jsen
文件夹的路径/jsen/content.js
文件并添加console.log('JSEN', e.error.stack);
到里面window.addEventListener('error', function(e) {
我有一个带有popup.html和注入内容脚本的chrome扩展.使用注入的内容脚本我试图访问youtube的javascript API函数,除了一个:addEventListener之外它一切正常.
Youtube的javascript API的事件监听器监听要更改的视频的状态.因此,如果到达视频结尾,则状态变为0.
var currentVideo = document.getElementById('movie_player');
currentVideo.addEventListener("onStateChange", "onytplayerStateChange");
function onytplayerStateChange() {
console.log("The state of the player has changed");
}
Run Code Online (Sandbox Code Playgroud)
这段代码在正常环境中工作正常,但它无法在内容脚本中工作.为什么我不能在内容脚本中捕获更改事件?有任何想法吗?
javascript google-chrome google-chrome-extension youtube-javascript-api
我在.js文件中定义了一个全局对象.例如,file1.js包含全局对象SomeObject.此文件在background.html中加载.
由于file1.js包含在background.html中,因此我可以访问此页面中的全局对象.所以这里没有问题.
当执行诸如单击扩展按钮之类的事件时,我正在使用chrome.tabs.executeScript(null, {file: "contentscript.js"});
api 运行内容脚本.
在这种情况下,如何访问脚本中的SomeObject?
任何人都可以发布用于访问chrome扩展中的窗口变量的代码.当我点击chrome扩展按钮时,我需要访问窗口变量.我正在获取窗口对象,但没有加载所有变量.我知道我们可以通过注入脚本来创建它.但我没有得到如何实现它.目前我正在尝试以下代码来获取当前活动选项卡的页面源.
chrome.tabs.executeScript({code:
"document.getElementsByTagName('html')[0].innerHTML"
}, function(result) {
var value = result[0];
console.log(value);
chrome.tabs.query({currentWindow: true, active: true}, function(tabs) {
callback({
url: tabs[0].url,
title: tabs[0].title,
jsonValue: value
});
});
});
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题.非常感谢.
有一个名为Blipshot 的优秀扩展,它可以截取页面屏幕截图。我需要使用页面级 JavaScript 调用扩展,而不是单击其图标。这可能吗?
这是来自我的contentScript.js 的代码:
function loadScript(script_url)
{
var head= document.getElementsByTagName('head')[0];
var script= document.createElement('script');
script.type= 'text/javascript';
script.src= chrome.extension.getURL('mySuperScript.js');
head.appendChild(script);
someFunctionFromMySuperScript(request.widgetFrame);// ReferenceError: someFunctionFromMySuperScript is not defined
}
Run Code Online (Sandbox Code Playgroud)
但是从注入的脚本调用函数时出现错误:
ReferenceError: someFunctionFromMySuperScript 未定义
有没有办法在不修改mySuperScript.js 的情况下调用这个函数?