9

jQueryイベントには、追加したイベントだけを簡単かつ安全にバインド解除するための名前空間の概念が組み込まれています。

ただし、これらの名前空間は、異なるプラグインが同じ基本イベントをトリガーする場合の衝突を防ぎません。たとえば、プラグインAがhide.fooイベントをトリガーし、プラグインBがイベントをトリガーする場合、名前空間を使用していてもhide.bar、イベントをリッスンしているハンドラーは2回呼び出されます。hide

これは、プラグインが、、、、、、などの過度に一般的な名前をトリガーするときに問題を引き起こす可能性がありますがopen、そこにある非常に多くのプラグイン(jQueryUIやブートストラップなどの大規模なライブラリからのものでさえ)は、第2レベルの名前空間なしでこれらの一般的なイベントをトリガーします。closeshowhidestartend

これが私の質問です。イベントを他のプラグインや標準のDOMイベントと区別するために、名前空間の2番目のレベルが賢明であるように思われます。規則は、標準のjQueryドット表記を使用する場合のようnamespace:eventNameなものにすることができます。namespace:eventName.secondaryNamespace

しかし、誰もこれをやっていないようですので、そうしないやむを得ない理由があるのではないかと思います。誰か知っていますか?

アップデート:

より具体的な例を提供するために、ユーザーが特定のテキストにカーソルを合わせると、ツールチップのイベントshowと イベントをトリガーするプラグインAを使用しているとします。イベントは伝播し、DOMは絶えず変化するため、すべてのツールチップからイベントをキャッチするためhideに、イベントリスナーを要素にバインドすることにしました。documentshowhide

次に、数週間後、プラグインBをアプリに追加します。これによりhide、ユーザーがアラートメッセージを閉じた後にもイベントがトリガーされます。ツールチッププラグインとアラートメッセージプラグインの両方が同じ名前のイベントをトリガーしているため、突然、ツールチップコードが必要以上に呼び出されるようになります。

4

1 に答える 1

1

私が具体的に言及した両方のライブラリ(jQueryUIとBootstrap)は、カスタムイベントのプレフィックスを付けるか、またはプレフィックスを付けることを計画していることがわかりました。

jQueryUIがカスタム_triggerメソッドで行うことは次のとおりです。

event.type = ( type === this.widgetEventPrefix ? type : this.widgetEventPrefix + type ).toLowerCase();

this.widgetEventPrefixこれにより、含まれているウィジェットまたはウィジェットファクトリで作成したウィジェットを介して独自のプレフィックスを定義できます。

Bootstrapはまだプレフィックスを実装していませんが、次のメジャーバージョン(3.0.0)で実装する予定です。

@fatがこのGithubの問題で言ったことは次のとおりです。

将来的には、すべてをブートストラップで名前空間化する予定です(data-attrsとevents-ただし、下位互換性が失われるため、3.0.0になります)

そして、これは私の質問に対する彼のツイートです。

-

私の場合、将来他のライブラリとの競合を回避するために、カスタムイベントに次のパターンのいずれかで名前を付けることにしました(コンテキストに応じて)。

prefix:event.namespace
appname:widgetname:event.namespace
libraryname:widgetname:event.namespace
于 2012-11-13T22:33:03.033 に答える