4

イベント処理が制御不能になった多くの AJAX を含む大規模な Web アプリケーションに取り組んでいます。すべてを管理するイベント委任システムをセットアップしようとしていますが、IE の非バブル フォーム送信に対する回避策があるかどうか疑問に思っています (AJAX 経由で挿入/更新されるフォームがたくさんあります)。私が思いついた最善の方法は、AJAX 呼び出しから応答を受け取るたびに送信ハンドラーをリロードするために少しの JavaScript を実行することですが、これは醜いようです。何か案は?

また、IE のさまざまなバージョンでどのイベントが正しく伝播されないかについて、適切なリファレンスを持っている人はいますか? 良い情報を見つけるのに苦労しました(ただし、この他の質問には少しあります)。


サイトの実際の例: 一部のユーザー コンテンツのインプレース編集があります。イベントの委譲を行うと、body で送信イベントをリッスンし、イベントをトリガーした要素を確認して、それに応じて処理します。送信は IE ではバブルしないため、これは機能しません。$5 の解決策は、他のすべてのイベントに対してイベント委任を行い、Prototype で次のようなものを使用して送信を処理することです。

// call this onload:
$$('form').invoke('observe', 'submit', function(event) { /*delegate*/ });

しかし、これは動的に作成されたフォームでは機能しません (上記のようにハンドラーを毎回再インスタンス化する必要があります)。どこでも単純な委任を行うだけです(特別な場合などはありません)。

4

6 に答える 6

3

フォームが false を返すようにして、フォーム送信イベントの代わりに送信ボタンの CLICK イベントを探すことはできますか? 次に、AJAX 呼び出しを介してプログラムでフォームを送信します。

于 2008-12-12T18:06:03.603 に答える
2

Rails 3 rails.js は、ブラウザーが送信イベントのバブリングをサポートしているかどうかを検出することで、この問題を解決しました。サポートしていない場合は、フォームの最初のフォーカス イベントで onSubmit メソッドをハンドラーにバインドします。かなりきれい。

チェックアウト

http://github.com/rails/rails/commit/f61d923d284062b4e4864d81c603157020198d06

于 2010-06-30T01:05:52.363 に答える
1

試すことができる 1 つの手法は、「作業中」フォームと非表示の「送信中」フォームの 2 つのフォームのみを作成し、これら 2 つのフォームのみをページに配置することです。

「作業」フォームは、ユーザーに表示されるものです。これは単なるコンテナーであり、さまざまなフォームの要素を含めることができます。フォーム上のさまざまなボタンは実際には送信されませんが、JavaScript でフォーム ハンドラー/検証ルーチンを呼び出します。

ハンドラー/検証ルーチンは、「送信」フォームのアクションを動的に設定し、必要な要素をそのフォームに動的に追加して、送信できるようにします。

この方法では、タグ自体に追加したりタグを削除したりすることはなく、2 つの主要なタグの外観と動作を変更するだけなので、面倒なイベント操作をすべて回避できます。

于 2008-12-12T15:25:51.087 に答える
1

Matt Kantor さん、NWEvents をご覧になることを強くお勧めします。あなたが言ったように、実際にはIEでバブリングを強制し、クロスブラウザーの方法で他のイベントで「イベント委任」を利用できるようにします。

NWEvents のソース コードはGitHubにあります。

于 2010-11-06T20:02:41.013 に答える
1

考慮すべき別のオプションはreglibです。

最新のトランク バージョンには、送信の委任を可能にする実装があります。

于 2009-01-21T18:24:53.880 に答える
0

これまでに検討したオプション:

  • 質問自体に投稿したくだらない解決策。
  • Inline Cop-out - 常に動作することが保証されており、オーバーヘッドは比較的低いですが、非常に目立ちます。このアイデアを Prototype で動作するように適応させる必要があります (これはそれほど難しいことではありません。おそらく、イベントを停止してから再起動して楽しい方法で伝播する Event.fix(event) 関数を作成するだけです)。 )。
  • NWEvents - これをあまりいじる機会はありませんでしたが、おそらくこれにより、すべてのイベントが強制的にバブルされます。ソースを見ると、これが動的に作成された要素に対して実際に機能するかどうかはわかりません。私はそれでもう少し遊ぶ必要があります。
于 2008-12-11T23:33:09.227 に答える