2

現在、IE8のみをサポートしています。

サーバーからデータを取得し、コンテナーdiv内のHTMLを応答に置き換えてから、応答に含まれる要素に焦点を合わせようとするajax呼び出しがあります。

[IEマジック]に依存しますか?このコードが機能する場合と機能しない場合があります。100%の時間で機能するものを見つける必要があります。console.logステートメントは、フォーカスが失敗した場合でも、100%の時間で正しいIDをログに記録します。

$.ajax({
    type: 'POST',
    url: that.Url,
    contentType: 'application/json; charset=utf-8',
    dataType: 'html',
    data: dataToSend,
    success: function (response) {
        $(container).html(response);
        that.initialize();

        var element = document.getElementById(elementId);
        setTimeout(function () {
            setTimeout(function () {
                setTimeout(function () {
                    setTimeout(function () {
                        setTimeout(function () {
                            setTimeout(function () {
                                console.log($(element).attr('id'));
                                element.focus();
                            }, 10);
                        }, 10);
                    }, 10);
                }, 10);
            }, 10);
        }, 10);
    }

ネストされたsetTimeoutsは、以前のタイムアウト中に何か他のものがスタックに置かれていたかどうかを確認するためにありました。単一のsetTimeoutを1000に設定して試してみましたが、それでもランダムな失敗が見られました。に置き換えてみまし$(container).html(response);たが$(container)[0].innerHTML = response;、それでも一貫して機能しません。に置き換えてみましdocument.getElementById(element)$(container).find('#' + elementId)var element = document.getElementById(elementId);また、setTimeoutに移動しようとしましたが、まだランダムな失敗が見られます。Firefoxを使用する場合、setTimeoutsを0個必要とし、コードは問題なく実行されますが、残念ながらそれはオプションではありません。に変更console.logするalertと問題は修正されますが、「OK」がクリックされるまでフォーカスが遅れるだけですが、マウスを余分にクリックすると使い勝手が悪くなります。

that.initialize()新しい要素にクラスを追加したり、イベントを追加したり、新しい要素の幅/高さを変更したりします。これらはすべて、100%の時間で機能します。

4

2 に答える 2

4

これは、古い IE の真のバグのようです。効果があると報告されている 1 つのトリックは.focus()、続けて 2 回呼び出すことです。

于 2012-06-27T14:49:24.010 に答える
1

$(element).focus()代わりにすべきではありませんelement.focus()か?focusjQuery オブジェクトで呼び出す必要がある jQuery メソッドです。

于 2012-06-26T23:12:00.923 に答える