JQuery "события" является ошибкой null или не является объектом" при использовании empty() или html()

Я получаю следующую ошибку в IE:

'events' - null или не объект - jquery-latest.js? d = 1848173663, строка 113 символ 467

Я использую jQuery 1.4.2, я не в состоянии обновить его, поскольку мы находимся на более ранней версии пользовательского интерфейса jQuery и имеем слишком много ошибок, используя что-либо более новое, чем 1.4.2.

Я получаю следующую ошибку, когда я запускаю этот бит кода второй раз:

$.post("page/view.do?undoCache=" + Math.random(), {
 pageId: pId
}, function(xmlContent){
 console.log('1');//get this one
 $('#reloadCenterDiv').empty();
 console.log('2');//don't get this one unless line above is commented out, then will run til next line
 $('#reloadCenterDiv').html(xmlContent);
 console.log('3');//don't get this
});

Я уверен, что я ничего не делаю для #reloadCenterDiv между вызовами.

Google для событий ошибки "события" является нулевым или не является объектом "Я нашел это:

"Звучит как ссылка на событие обработчик все еще существует, когда сам обработчик уже ушел".

Это звучит логично. Любые другие идеи о том, почему и когда эта ошибка произошла?

Я нашел, где это происходит, но все подсказки для меня заканчиваются.

Как очистить вещи, чтобы снова вызвать пустую() или html() на #reloadCenterDiv?

Вот HTML для #reloadCenterDiv:

2 ответа

Не уверен, но кажется, что jQuery.cache перезаписывается.

Так как элемент DOM имеет (при необходимости) серийный номер, который сопоставляется с jQuery.cache, когда вы запускаете такую ​​функцию, как .empty(), jQuery предполагает наличие связанных данных, ищет данные для этого элемента и удаляет их.

Вместо вашего первого журнала сделайте следующее:

console.log(jQuery.cache);

И посмотри, что это тебе дает. Готов поспорить, что что-то переписывает. Возможно, вы дважды загружаете jQuery?

Вот пример, который намеренно удаляет jQuery.cache. Это дает аналогичную ошибку.

EDIT:

Резюме комментариев ниже. Во время .empty() (или фактически cleanData()) jQuery захватывает expando из всех элементов-потомков, чтобы удалить связанные данные.

Проблема заключается в том, что когда jQuery делает это, он предполагает, что данные были успешно расположены. В этом случае каким-то образом данные отделяются от элемента, поэтому получение данных с использованием значения expando возвращает undefined.

Поскольку jQuery не (или не в 1.4.2) проверяет, что данные были найдены, его попытка получить доступ к свойству events для данных вызывает ошибку, потому что снова data есть undefined.

Обновленные версии jQuery исправить его с помощью if ( data && data.events ) {, который проверяет, есть ли какой-либо объект, против которого требуется его свойство events.


Если вы не можете обновить jQuery, вы можете вместо этого установить HTML:

$("#divid").html("");

Это по сути делает то же самое.

licensed under cc by-sa 3.0 with attribution.