3

私はこれを機能させる方法を理解しようとして非常識になりました。コードはおおよそ次のようになります。

function onDropDownChanged() {
  $("#updatePanel").load(
    "myUrl",
    { id: $("#myDropDown option:selected").val() },
    onPanelLoaded
  );
}
function onPanelLoaded() {
  $("#theTextInput").focus();
}
$(document).ready(function() {
  $("#myDropDown").change(onDropDownChanged);
}

変更ハンドラーが最初に起動されると、ajax更新が実行され、テキストボックスがフォーカスされます。

ただし、その後の変更では、引き続きajaxの更新が行われますが、テキストボックスが再びフォーカスされることはありません。

onDropDownChangedで、ajax呼び出しの前に追加$("#updatePanel").empty()すると、テキストボックスが常にフォーカスされることがわかりました。それに関する問題は、フォーム全体が一瞬消えて、醜いフラッシュを引き起こすことです。ajaxはこのようなものを素晴らしいものにするはずなので、私が使用したい回避策ではありません。

4

2 に答える 2

6

動作するはずですが、コールバックが呼び出されるまでに DOM が更新されていないのだろうかと思います。遅延の導入が役立つかどうかを確認したい場合があります。

function onPanelLoaded() {
     setTimeout( function() { $("#theTextInput").focus(); }, 500 );
}

ページに HTML を含め、load() を介して返されるものを含めると、これが機能しない場合に役立ちます。

于 2009-04-20T02:29:37.470 に答える
4

IE6 と IE7 でも同様の問題がsetTimeout()ありましたが、信頼できる解決策ではありませんでした。うまくいくこともあれば、うまくいかないこともありました。一部のマシンではまったく機能せず、とにかく 500ms の値は完全に恣意的なものでした。もちろん、focus()関数は Firefox と Chrome の両方でタイムアウトなしで期待どおりに機能しました。

私の解決策は、IEをfocus() 2回呼び出すことでした:

function onPanelLoaded() {
    var panel = $('#theTextInput');
    panel.focus();
    panel.focus();
}

今、それは私が最初に意図したことをしました。

于 2010-01-30T01:14:36.173 に答える