2010-09-17 3 views
2

У меня есть список SELECT, который я заполняю на основе результатов вызова ajax, затем выберите один из вариантов, основанный на ранее заданной переменной. Это отлично работает на IE8, но на IE6 это не так.Список вариантов выбора jQuery не обновляется достаточно быстро в IE6

Вот исходная функция:

function LoadCategories(jdata) 
{ 
    var options = ''; 
    for (var i = 0; i < jdata.length; i++) 
    { 
     options += '<option value="' + jdata[i].CategoryName + '">' + jdata[i].CategoryName + '</option>'; 
    }; 
    $("select#categorySelect").html(options); 
    $("select#categorySelect").val(currentPatientCategory).attr('selected',true); 
}; 

На IE6, как это порождает ошибки: «Не удалось установить выбранное свойство Неизвестная ошибка.»

Если я изменяю последнее заявление:

setTimeout('$("select#categorySelect option[value=" + currentPatientCategory + "]").attr("selected", true)', 1000); 

Это похоже на работу. Я также попытался изменить .html(), чтобы использовать .append(), .appendTo(), используя соответствующий синтаксис для них. Я также попытался использовать переменную для выбранного элемента без sucess. Опять же, они работают на IE8, но не на IE6. Также работает установка предупреждения() до выбранного значения. Кажется, что параметры не помещаются в список достаточно быстро, чтобы следующий оператор действительно нашел их, если я не откладываю выбор в некотором роде.

Любой способ заставить эту работу работать без какого-либо «обходного пути», такого как setTimeout, или перемещать выбор в другом месте, эффектно задерживая его выполнение на бит?

Примечание: если я изменю 1000 на 100 в setTimeout, он будет работать частично и во времени, поэтому я не полностью доверяю этому решению.

Использование JQuery 1.4.2

Примечание: Клиентская база диктует IE6 поддерживается за счет старых компьютеров и правил обновления/задач в очень строгих условиях.

EDIT: Обратите внимание, что я, наконец, дошел до конца. Было условие гонки, которое существовало между генерацией некоторых данных через ajax и использованием, которое проявилось в IE6. Я решил, перемещая некоторые утверждения в моем коде, чтобы дать доказательство решения против неразрешенных объектов данных, сгенерированных как таковые. Большое спасибо плакатам, поскольку он указал мне в жизнеспособном направлении, чтобы разрешить это.

ответ

1

Я не могу даже поверить, что это сработало бы с использованием .html() вместо .append() или .appendTo(). То, что вы в основном делаете, - это переписать html-код из самого select element.
Вы действительно должны использовать .append().

Еще более странные звуки setTimeout() вещь.

Я предполагаю, что вы ищете, чтобы заменить эту строку:

$("select#categorySelect").val(currentPatientCategory).attr('selected',true); 

с этим:

$("select#categorySelect").find('option').eq(currentPatientCategory).attr('selected', 'selected'); 

..и не забудьте использовать .append() ..

ссылка: .append(), .eq()

+0

Как я отметил. append или .appendTo не решает проблему и не работает над IE8 (также делает .html), пробовав их все в разных формах. Я дам вашему выбору выстрел! –

+0

Принимая этот ответ как тот, который помог мне больше всего. Редактирование моего вопроса, чтобы показать разрешение. –

0
$("select#categorySelect").val(currentPatientCategory).attr('selected',true); 

val(currentPatientCategory) устанавливает выбранный параметр к одному, значение которого соответствует currentPatientCategory. Это нормально, как есть, вам не нужно искать правильный элемент option, чтобы установить selected.

Я понятия не имею, что такое цепной звонок .attr. A <select> не имеет selected. Я думаю, это то, что ошибка пытается вам сказать.

Это опасно. Вы включаете текст в HTML-разметку без HTML-экранирования. Если в этом тексте есть знак <, & или ", ваша разметка будет разорвана, и если текст будет отправлен пользователю, у вас будет проблема безопасности межсайтового скриптинга.

Если вы создаете HTML, включая текстовые строки, вы необходимо HTML-избежать этих персонажей &lt;, &amp; и &quot; соответственно. Но это, как правило, проще в использовании свойств устанавливающих метод, чтобы установить их вместо отвода вокруг с разметкой:

$('#categorySelect').empty(); 
for (var i= 0; i<jdata.length; i++) { 
    var option= $('<option/>', {text: jdata[i].CategoryName, val: jdata[i].CategoryName}); 
    $('#categorySelect').append(option); 
} 

Однако еще проще это старая школа DOM путь:

var options= $('#categorySelect')[0].options; 
options.length= 0; 
for (var i= 0; i<jdata.length; i++) 
    options[i]= new Option(jdata[i].CategoryName); 
+0

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

+0

ссылка: http://www.w3.org/TR/html401/interact/forms.html#h-17.6.1 относительно «выбранного» атрибута. –

Смежные вопросы