Как заставить IE6 распознавать вставленные элементы DOM через jQuery insertAfter () - PullRequest
1 голос
/ 10 февраля 2010

У меня есть функция jquery ajax, которая опрашивает сервер базы данных, чтобы узнать, есть ли новые записи.Если это так, он вставляет новые записи (с уникальными идентификаторами) в верхнюю часть списка записей, используя следующее:

$(new_records).insertAfter('#div_at_top_of_page');

Это отлично работает, даже в IE6.

Однако у каждой вставленной записи есть дополнительная функция ajax, позволяющая получить более подробную информацию об этой записи и вставить ее в элемент внутри вставленного элемента.

Это прекрасно работает во всех браузерах , кроме IE6.IE6 выполняет вторичную функцию ajax (я это подтвердил), но затем не вставляет содержимое.Это происходит молча, без каких-либо ошибок.

Я предполагаю, что это потому, что IE6 не видит вставленные элементы в DOM;но в любом случае я был бы благодарен за любые идеи о том, как решить эту проблему.

Изменить 2 - код, который я добавил в моем первом редактировании ниже, кажется, работает нормально,Проблема в том, что IE6 не знает, что существует $('#inserted_data_' + log_id).Это элемент, который был вставлен с использованием метода .insertAfter(), описанного выше.

Редактировать - код, используемый для вставки вторичных данных:

$('.printout').live('click', function(ev) {
    ev.preventDefault();
    var ajaxUrl = $(this).attr('href');
    $.ajax({
        url: ajaxUrl,
        cache: true,
        dataType: 'json',
        success: function(j, textStatus) {
            var printout = j.printout;
            alert(printout); // sanity check
            var log_id = ajaxUrl.replace('/api/fetch_data/printout/', '');
            $('#inserted_data_' + log_id).html(printout); // problematic line
        }
    });
    return false;  
});

Как я уже отмечалэта функция выполняется правильно, что подтверждается // sanity check, но строка, отмеченная выше с комментарием // problematic line, фактически не записывает данные в элемент '#inserted_data_' + log_id.

Ответы [ 6 ]

1 голос
/ 10 февраля 2010

Бьюсь об заклад, проблема в вашей log_id переменной. Я предполагаю, что ваш replace ведет себя не так, как ожидалось. Поставьте еще пару проверок на здоровье и дайте мне знать, если они укажут вам правильное направление ...

var log_id = ajaxUrl.replace('/api/fetch_data/printout/', ''); 
alert(log_id);  // Show the log_id variable

var el = $('#inserted_data_' + log_id);
alert("Element found: " + (el.length > 0)); // Did it find the element?

el.html(printout); // problematic line 
1 голос
/ 10 февраля 2010

Как долго ваш результирующий набор, потому что IE задыхается от больших объемов данных ..
ссылка

Также убедитесь, что ваши данные json не имеют имен переменных, идентичных идентификаторам на вашей html-странице.
ссылка

0 голосов
/ 10 февраля 2010

Вы можете попробовать это: http://code.google.com/p/ie7-js/ - довольно забавно

0 голосов
/ 10 февраля 2010

Пара предложений, поскольку я не могу по-настоящему повторить ситуацию, это всего лишь догадки, но я бы попытался обернуть строку $('#inserted_data_' + log_id).html(printout); в $(document).ready(function() { $('#inserted_data_' + log_id).html(printout); });. Я думаю, что, возможно, DOM не готов на секунду, пока IE6 не завершит добавление предыдущего элемента.

Если нет, я бы попытался использовать тайм-аут в этой строке setTimeout(function() { $('#inserted_data_' + log_id).html(printout); },10); Я знаю, что это немного уродливо, но если это сработает, вы можете добавить if, чтобы сделать это только для IE6.

Кроме того, вместо alert(printout); // sanity check проверьте alert(document.getElementById(inserted_data_'+log_id));, чтобы убедиться, что элемент уже существует с правильным идентификатором (возможно, IE6 не вставил элемент с правильными атрибутами, видимо, проблема с атрибутом имени довольно немного времени)

0 голосов
/ 10 февраля 2010

не должны

$('#inserted_data_' + log_id).html('printout'); // problematic line

быть

$('#inserted_data_' + log_id).html(printout); // problematic line

0 голосов
/ 10 февраля 2010

По некоторым причинам, вызов jQuery ajax () молча завершается ошибкой, когда он не может оценить JSON (я сталкивался с таким поведением несколько раз), и функция обратного вызова не выполняется. Убедитесь, что IE6 может проанализировать строку JSON, которую возвращает ваш сервер.

Обновление Чтобы проверить это, попробуйте вставить эти предупреждения в строку 3724 (jQuery 1.3.2)

if ( type == "json" ) {
    alert('a');
    data = window["eval"]("(" + data + ")");
    alert('b');
}

Если моя гипотеза верна, вы увидите предупреждение «а», но не предупреждение «б».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...