Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Chrome扩展的Backbone.js(model instanceof model)_Backbone.js_Google Chrome Extension_Coffeescript - Fatal编程技术网

通过Chrome扩展的Backbone.js(model instanceof model)

通过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应用程序内部

嘿,伙计们

这是我第一次在这个网站上发帖,我将要提出的问题很难清楚地表达出来,因为要达到这个目标需要一系列变量。让我快速解释一下我正在使用的框架

我正在使用jQuery、jQuery ui和主干构建一个Chrome扩展

扩展的整个JS套件都是用CoffeeScript编写的,我正在利用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栏旁边的小扩展图标)。为了达到这个效果,我使用了chromes
chrome.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
    }
    ],
 ...
}