1

Web サイトと Google Chrome 拡張機能の間に pub/sub パターンを実装しようとしています。これまでの私の実験のほとんどは、強力なバインド/トリガー構文のために jQuery を使用してきましたが、ほとんど運がありませんでした。

背景: 私は、オープン ソースの Ruby/Rails ベースの Pomodoro Technique 実装に取り​​組んでいます。jQuery の $.trigger 構文を使用してアクティビティを公開するようにサイトのコードを変更し、タイマー セッションの開始とタイマー セッションの終了に関する監視可能なイベントを公開しました。これらのトリガーは、実行を jQuery イベント コードにトレースできる限り機能します。したがって、このサイトはいくつかの関連イベントの発行者です。

jquery をロードし、.bind() 構文を使用して、サイトによって公開されているカスタム イベントにバインドすることにより、トランザクションのリスナー/サブスクライバー エンドを Google Chrome 拡張機能に実装しました。サイトの拡張機能が読み込まれており、サイトの URL 内のすべてのパスに対して権限が設定されています。

パブリケーション側からは、 $.event.trigger() と $(document).trigger() の両方を可能な限り一般的にしようとしました。サブスクライバー側では、いくつかの関連要素にバインドしようとしましたが、最も一般的なものは$(ドキュメント).バインド()

拡張機能のバインド呼び出しが実行された後に実行を一時停止してカスタム イベント バインディングを観察すると、console.dir($(document).data('events')); の結果が分析されます。サブスクライブしようとしているカスタム イベントがリストに表示されます。

ただし、 console.dir($(document).data('events')); の結果を分析すると Web サイト側でカスタム イベントをトリガーする直前に、必要なイベント ハンドラーがリストに表示されません。

これがどのように機能するかについて明らかな何かが欠けていますか?

ps変更をトリガーする要素の「クリック」イベントに直接バインドすると、拡張コードは完全に機能しますが、実行中にサイトのDOMが変更されるため、バインドがすぐに壊れるので、それを望んでいましたある種の pub-sub メカニズムの方が賢明かもしれません。

編集

@ChrisNZL の回答に対する私の回答で述べたように、.bind() の代わりに .live() を試してみましたが、同じ動作が見られました。

4

2 に答える 2

0

jQuery を見たことがあります.live()か? のように動作しますが、「現在および将来において.bind()、現在のセレクターに一致するすべての要素のイベントにハンドラーをアタッチします」。つまり、バインディングが壊れてはなりません。

于 2011-09-17T06:58:24.580 に答える
0

サイトと拡張機能の間でどのようにやり取りしていますか?

拡張 API を介して挿入したコンテンツ スクリプトは、メイン ページの JavaScript にアクセスできないため、jQuery コードでエクスポートしたカスタム イベントを取得する方法がないことに注意してください。

これに対する回避策は、通常のグローバル スコープ スクリプト インジェクションを使用することです (つまり、スクリプト タグを本体に追加します)。これを試してみましたか?

于 2011-09-21T14:44:50.683 に答える