3

ここでの基本的なモジュールの質問:モジュールパターンを放棄すると、グローバルハンドラーを正常に機能させることができますが、このテストコードは機能せず、理由を理解するのが非常に困難です。

var MyModule = (function($, my) {
  $(my).ajaxStart(function() { window.alert("ajax start"); });

  $(document).ready(function() {
    $.ajax(SOME_AJAX_SETTINGS_HERE);
  });

  return my;
}(jQuery, MyModule || {}));

インスタンスにアタッチされたハンドラーMyModuleは、ajax呼び出しの実行時に実行されることはありません。代わりにハンドラーをアタッチすると$(document)問題なく動作しますが、なぜそのグローバルイベントがモジュールオブジェクトに正しくバインドされていないように見えるのか不思議です。

編集:これはさらに簡単な例です:

var x = {};
$(x).ajaxStart(function() { window.alert("foo"); } );
$.ajax(SOME_AJAX_SETTINGS);

に置き換える$(x)と、機能します...非DOMオブジェクト(または他のグローバルajaxイベント)に$(document)バインドできないようです?ajaxStart


@ Nucleon、これは私には完全には正しくないようです。理由の例を次に示します。

var item = {foo: function() { window.alert("shorthand"); } };
$(item).bind("foo", function () { window.alert("longhand"); } );
window.alert("about to trigger (locally)");
$(item).trigger("foo");
window.alert("now we triggerHandler (locally)");
$(item).triggerHandler("foo");

ここで、(カスタム)イベント「foo」は2つのパターンを介してバインドされ、異なるトリガーメソッドはパターンの特異性を示します...「ロングハンド」アラートを2回、「ショートハンド」アラートを1回受け取ります。

これで、でグローバルイベントを発生させることもできます$.event.trigger("foo")(ただし、同等のグローバルtriggerHandlerは存在しません)。問題は、このコードを最後に追加した場合です。

window.alert("now we trigger (globally)");
$.event.trigger("foo");

このグローバルイベントトリガーでは、どちらのハンドラーも実行されません。

ただし、item上記で提案したように、いくつかのDOMタイプの要素に置き換えると、ローカルイベントとグローバルイベントの両方処理されますが、「省略形」ハンドラーは機能しなくなるという警告があります*。したがって、ローカル処理は非DOMオブジェクトで機能しますが、特にグローバル処理では機能しないようです。

-m

*短縮パターンは非DOMオブジェクトにのみ適用されるため、短縮ハンドラーは機能を停止します。個人的には、非DOMオブジェクトのこの「省略形」の動作をjQueryから削除する必要があると思います。それについて知っている人はごくわずかであり、グローバルなjQueryオブジェクトページに1つのあいまいな文でしか文書化されていません...その動作は、人々がおそらく気づいていない拘束力のあるステップを暗黙的に実行するため、気づいていない人を狂わせる可能性がありますの。


ああ、わかりました...$.event.trigger機能は公開されていませんが、基盤となるイベント起動メカニズムによって使用されています。私はそれを使うべきではないと思います。この動作は、jQuery開発者が正しく実装するのが困難であり、完全に放棄しているように見えます(または、「修正済み」とマークされたこのバグレポートから収集したものです:DEPRECATE AJAX "GLOBAL" EVENT BEHAVIOR)。

.triggerただし、次のアラートの1つだけが実行されるため、DOMオブジェクトまたは非DOMオブジェクトに対して同じように動作するものとして文書化されることについてはまだ少し混乱しています。

var plain = {foo: function() { window.alert("plain"); } };
var dom = $("<div></div>");
dom.foo = function() { window.alert("dom"); };
console.log(plain.foo); // make sure we see function foo on the plain object.
console.log(dom.foo); // now make sure we see function foo on the DOM object.
$(plain).trigger("foo"); // raises the "plain" window alert.
$(dom).trigger("foo"); // raises no alert.

fooこれは、設定されたプロパティが実際には従来の意味での「適切な」JSプロパティではないことを意味していると思いdomます(コンソールでオブジェクトを検査するときに正しく表示されますが)?

注:これはすべて知識のためです。上記のバグリンクの「修正」のアドバイスを参考にして、すべてのAJAX(およびその他のグローバル)イベントをに添付するだけですdocument。 jQuery1.9で強制される動作になります。しかし、私はすでに青いピルを飲んでいて、うさぎの穴から離れすぎて戻ってこないような気がします。

4

1 に答える 1

2

交換するだけ

var x = {};

var x = $("<div></div>");

JavaScript イベントは、(JavaScript オブジェクトだけでなく) 有効な DOM オブジェクトにバインドする必要があります。現在、DOM オブジェクトが実際にどこかにアタッチされている必要はありません。Javascript のイベント システムは、利用可能な関連する DOM オブジェクトの階層チェーンを上下にバブルするイベントに基づいています。単純な{}ものは資格がありません。

于 2012-09-24T05:01:48.100 に答える