我正在学习如何创建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
很多时候,我编写的 JavaScript 与其他脚本一起运行或者可能包含其他脚本。有时,这些脚本可能会更改我可能在代码中使用的原始对象的原型。
有没有一种方法可以在 JavaScript 中声明我的原始数据类型,以便在原型被修改时重置原型?或者让我的脚本可以在一个单独的范围内运行,其中原语的原型不会被修改?
// evil script code modify primative on prototype
Boolean.prototype.toString = function() {
return true;
}
let flag = false;
console.log(flag.toString());
// I would expect false to be printed, but because the prototype of the primative if overridden
// the primative value would be wrapped with the Boolean object
// and call the modified toString method and would output true.Run Code Online (Sandbox Code Playgroud)
有什么方法可以确保我的代码在单独的范围内运行,或者有什么方法可以声明我的变量或重置原型以避免这些类型的问题?