通过Chrome扩展的Backbone.js(model instanceof model)
嘿,伙计们 这是我第一次在这个网站上发帖,我将要提出的问题很难清楚地表达出来,因为要达到这个目标需要一系列变量。让我快速解释一下我正在使用的框架 我正在使用jQuery、jQuery ui和主干构建一个Chrome扩展 扩展的整个JS套件都是用CoffeeScript编写的,我正在利用Rails和资产管道来管理它。这意味着,当我想要部署扩展代码时,我运行通过Chrome扩展的Backbone.js(model instanceof model),backbone.js,google-chrome-extension,coffeescript,Backbone.js,Google Chrome Extension,Coffeescript,嘿,伙计们 这是我第一次在这个网站上发帖,我将要提出的问题很难清楚地表达出来,因为要达到这个目标需要一系列变量。让我快速解释一下我正在使用的框架 我正在使用jQuery、jQuery ui和主干构建一个Chrome扩展 扩展的整个JS套件都是用CoffeeScript编写的,我正在利用Rails和资产管道来管理它。这意味着,当我想要部署扩展代码时,我运行rakeassets:precompile,并将得到的压缩JS复制到我的扩展目录中 这种方法的好处在于,我可以通过包含库从Rails应用程序内部
rakeassets:precompile
,并将得到的压缩JS复制到我的扩展目录中
这种方法的好处在于,我可以通过包含库从Rails应用程序内部运行扩展js。这与我的extensions background.js文件基本相同,它将js作为内容脚本注入
无论如何,我最近遇到的问题是,当我尝试在好友的网站上测试我的扩展时
我注意到的是,我的主干模型在添加到各自的集合中时被损坏了。大概是
this.collection.add(新建SomeModel)
创建了一些我的模型的无意义版本
此代码最终会运行到主干的prepareModel代码中
_prepareModel: function(model, options) {
options || (options = {});
if (!(model instanceof Model)) {
var attrs = model;
options.collection = this;
model = new this.model(attrs, options);
if (!model._validate(model.attributes, options)) model = false;
} else if (!model.collection) {
model.collection = this;
}
return model;
},
现在,在我测试扩展的大多数站点中,结果都是正常的,但是在我好友的站点上,!(模型实例模型)
计算结果为true,即使它实际上是正确类的实例。结果是模型的超级混乱版本,其中模型的属性是对模型集合的引用(奇怪吧?)。不用说,之后发生了各种疯狂的事情
我无法理解为什么会发生这种情况。但是,将此行(!(model instanceof model))
更改为(!(model instanceof Backbone.model))
似乎可以解决问题。我认为这可能与Flot库(jQuery图形库)创建了他们自己版本的“模型”有关,但是通过查看源代码没有得到任何实例。我只是好奇为什么会这样。在主干网源中添加这个小小的更改有意义吗
更新:
我刚刚意识到“修复”实际上不起作用。我还可以补充一点,我的主干模型是在包装对象中命名的,因此声明类似于
类SomeNamespace.SomeModel扩展主干。Model
女士们先生们,我相当肯定我已经解决了这个问题,它与我以前的任何假设都没有关系。对于那些对开发chrome扩展感兴趣的人,请继续阅读,因为这可以在将来为您节省一些麻烦
我想让我的chrome扩展在每次用户在最初初始化它的网站内导航时运行内容脚本(通过浏览器操作,也就是url栏旁边的小扩展图标)。为了达到这个效果,我使用了chromeschrome.webNavigation.onDOMContentLoaded.addListener(函数(细节)
api
我不知道的是,这个东西实际上会在网页、推特按钮、g+、facebook等中加载的每一个帧上触发。因此,基本上我的内容脚本会加载到这些帧中,并对对象和事件造成各种破坏。添加对
详细信息的检查。frameId==0
修复了我的问题。哇!感谢收听!在Chrome扩展清单中,您还可以指定内容脚本仅在顶部框架中运行。只需在内容脚本上指定“所有框架”属性即可。例如
{
"name": "My extension",
...
"content_scripts": [
{
"matches": ["http://www.google.com/*"],
"css": ["mystyles.css"],
"js": ["jquery.js", "myscript.js"],
"all_frames": false
}
],
...
}