0

やあみんな、

このサイトに投稿するのはこれが初めてであり、これから提起しようとしている問題は、そこに到達するために必要な一連の変数のために明確にするのが困難です。私が使用しているフレームワークについて簡単に説明します。

jQuery、jQuery-ui、Backboneを使用してChrome拡張機能を構築しています

拡張機能のJSスイート全体はCoffeeScriptで記述されており、Railsとアセットパイプラインを利用してすべてを管理しています。これは、拡張コードをデプロイするときにrake assets:precompile、結果の圧縮されたJSを実行して拡張ディレクトリにコピーすることを意味します。

このアプローチの良いところは、ライブラリを含めることで、Railsアプリ内から拡張jsを実際に実行できることです。これは基本的に、jsをコンテンツスクリプトとして挿入する私の拡張機能background.jsファイルと同じです。

とにかく、私が最近遭遇した問題は、私の仲間のサイトwhiskeynotes.comで自分の拡張機能をテストしようとしたときでした。

私が気付いたのは、私のバックボーンモデルがそれぞれのコレクションに追加されたときに壊れていたということです。だから何かのような

this.collection.add(new SomeModel)

私のモデルのナンセンスバージョンを作成しました。

このコードは最終的にBackboneの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;
},

さて、私が拡張機能をテストしたほとんどのサイトでは、結果は正常ですが、私の仲間のサイト!(model instance Model)では、実際には正しいクラスのインスタンスであるにもかかわらず、評価はtrueと評価されます。その結果、モデルの属性がモデルコレクションへの参照であるモデルの非常に混乱したバージョンになります(奇妙なことですか?)。言うまでもなく、その後、あらゆる種類のクレイジーなことが起こっていました。

なぜこれが起こっているのかは私を超えています。ただし、この行(!(model instanceof Model))をに変更(!(model instanceof Backbone.Model))すると、問題が解決するようです。Flotライブラリ(jQueryグラフライブラリ)が独自のバージョンの「モデル」を作成することと関係があるのではないかと思いましたが、ソースを調べてもそのインスタンスは見つかりませんでした。なぜこれが起こるのか知りたいだけです。そして、この小さな変更をバックボーンソースに追加することは理にかなっていますか?

アップデート:

「修正」が実際には機能しないことに気づきました。また、バックボーンモデルがラッピングオブジェクトで名前空間化されているため、宣言は次のようになります。class SomeNamespace.SomeModel extends Backbone.Model

4

2 に答える 2

0

Chrome拡張機能マニフェストでは、コンテンツスクリプトがトップフレームでのみ実行されるように指定することもできます。コンテンツスクリプトでall_frames属性を指定するだけです。すなわち、

{
    "name": "My extension",
    ...
    "content_scripts": [
    {
        "matches": ["http://www.google.com/*"],
        "css": ["mystyles.css"],
        "js": ["jquery.js", "myscript.js"],
        "all_frames": false
    }
    ],
 ...
}

Chromeデベロッパードキュメントリファレンス

于 2012-07-09T21:12:56.560 に答える
0

紳士淑女私は問題を解決したとかなり確信しており、それは私の以前の仮説とは何の関係もありませんでした。Chrome拡張機能の開発に興味のある方は、今後もトラブルを回避できる可能性があるため、読み続けてください。

Chrome拡張機能で、ユーザーが最初に初期化したWebサイト内を移動するたびにコンテンツスクリプトを実行するようにしました(ブラウザーのアクション、つまりURLバーの横にある小さな拡張機能アイコンを使用)。この効果を達成するために、私はchromesapiを使用しましchrome.webNavigation.onDOMContentLoaded.addListener(function(details)た。

私が知らなかったのは、これが実際にWebページ、ツイートボタン、g +、Facebookのいいねなどにロードされたすべてのフレームで発生したことです。したがって、基本的に私のコンテンツスクリプトはこれらの各フレームにロードされ、あらゆる種類のフレームを引き起こしていました。オブジェクトとイベントで大混乱。のチェックを追加するとdetails.frameId === 0、問題が修正されました。ふぅ!聞いてくれてありがとう!

于 2012-05-18T18:30:06.583 に答える