2009-04-20 2 views
3

Я сошел с ума, пытаясь выяснить, как это сделать. Код выглядит примерно так:Невозможно сфокусировать поле ввода в DOM, загруженном с помощью ajax-вызова

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

В первый раз обработчик изменений увольняют, он делает обновление AJAX, и текстовое поле находится в фокусе.

Однако при последующих изменениях он продолжает обновлять ajax, но текстовое поле больше не фокусируется.

Я обнаружил, что если в onDropDownChanged, я добавил $("#updatePanel").empty() перед вызовом ajax, текстовое поле всегда будет сфокусировано. Проблема в том, что вся форма исчезает на секунду, вызывая уродливую вспышку. Предполагается, что ajax делает такие вещи такими же приятными, это не обходной путь, который я хочу использовать.

+1

Не могли бы вы разместить бит HTML, на котором вы действуете, а также то, что HTML загружается при вызове ajax? –

ответ

6

Кажется, что он должен работать, но мне интересно, не обновляется ли DOM к моменту вызова обратного вызова. Возможно, вам захочется узнать, помогает ли введение задержки.

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

В том числе HTML на странице и то, что возвращается через load(), было бы полезно, если это не сработает.

+0

Это была моя догадка ... хотя это не то, что содержится в документации. Видеть HTML, безусловно, поможет разобраться. –

+0

Настройка задержки должна работать, даже если задержка равна 0. Иногда требуется только «отложить» вызов, чтобы содержимое, введенное через 'innerHTML', было доступно для DOM. – savetheclocktower

4

У меня была аналогичная проблема с IE6 и IE7, но setTimeout() не было надежным решением. Иногда это сработало, иногда это не так. Он вообще не работал на некоторых машинах, и значение 500 мс было абсолютно произвольным. Конечно, функция focus() работала точно так, как ожидалось, без какого-либо тайм-аута как в Firefox, так и в Chrome.

Мое решение было называть focus()дважды для IE:

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

Теперь, когда сделал то, что я намеревался в первую очередь.

+0

это действительно работает для меня .. спасибо bro –

+0

Мужчина, ты сделал мой день: D –