0

変更時に送信する必要がある入力フィールドがフォームにいくつかあります。それらが提出されると、私は焦点を失います。自分のインプットに集中したい。私はそれを使いたかった:

Event.observe(document, 'dom:loaded', $('" + focusedFieldId + "').focus());

ここで、focusedFieldId は変更された要素の ID です。正常に動作することもありますが、入力に null 値が含まれることもあります。focusdFieldId を他のフィールド ID に変更すると、正常に動作します (値を設定してからフィールドにフォーカスします)。問題は、同じ入力にフォーカスを戻そうとしたときだけです。1 つの重要な問題: 値の変更後、いくつかの JavaScript が起動されます (http://www.devbridge.com/projects/autocomplete/prototype/)。この JavaScript フォームが送信された後、フォーカスを元に戻したいと思います。dom がロードされると、送信が終了し、ページがリロードされ、フォーカスを戻す準備ができたことを意味すると思いました。どこで間違えますか?

4

1 に答える 1

0

ここである種の競合状態に陥っていると思います。2 つの主な異なる「onLoad」イベントが、prototype.js で観察できます。

それらの 1 つは、ここで使用したものです。

document.observe("dom:loaded", function() { ... });

もう一つは

Event.observe(window, "load", function() { ... });

1つ目はDOM (読み方: HTML) がブラウザーによって読み込まれるとすぐに実行され、 2 つ目はすべてが読み込まれたときに実行されます。

focusedFieldId上記のスクリプトで設定する場合は、2 番目のイベント オブザーバーを使用することを強くお勧めします。速度は遅くなりますが、以前のスクリプトが確実に解析されます。

ただし、これはまだ設計上の欠陥です。すべてのスクリーン コントローラー ロジック (変数の割り当てを含む) を最初の onLoad イベント内に配置して実行を高速化し、このような潜在的な競合状態を回避することを強くお勧めします。

于 2013-05-03T21:28:23.173 に答える