'clone ()' не работает в Internet Explorer 6


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

$(userListJId).clone().appendTo(tempOwnJString);

Где userListJId и tempOwnJString - идентификаторы элементов.

Приведенная выше строка кода прекрасно работает в Internet Explorer 7 и более поздних версиях, но, похоже, не работает в Internet Explorer 6.

Какова может быть возможная причина?

3 2

3 ответа:

Я использовал clone() на IE6, и поэтому это не должно быть проблемой.
Возможно, вы создаете недопустимый HTML и IE6, который менее разрешителен, чем IE7, жалуется на это.
Можете ли вы показать нам свой код, а также версию jQuery?

Забавно, что вы должны спросить об этом, потому что у меня была довольно похожая проблема (хотя она затронула IE7 и, вероятно, IE6).

Кроме того, не уверен, что вы сделали что-то особенное (например, определили переменные), но, возможно, вам следует ссылаться на объекты как на $('#userListJId'), а не только на имя элемента. Опять же, я не вижу остальную часть кода, поэтому вы, возможно, уже определили эти переменные вне документа.* масштаб.

В принципе, в IE некоторые атрибуты не могут быть изменены после создается объект, примером которого является атрибут ID.

Работа вокруг состоит в том, чтобы не клонировать объект, по крайней мере, до конца .clone (), но чтобы взять внешний HTML объекта, который вы хотите клонировать в виде строки и сделать регулярное выражение .замените () на атрибут id, а затем добавьте измененный HTML в tempOwnJString.

Еще одна готча в IE, это иногда (обычно?) когда он анализирует HTML, он не заключает кавычки вокруг значений атрибутов, если они содержат только буквенно-цифровые символы, поэтому помните об этом в вашем шаблоне регулярных выражений.

Вот пример кода, который я использовал.

    if ($.browser.msie === true)
        {
//unfortunately jQuery doesn't have an outerHTML function, so this is a hacky work around
                templateHTML =  $("#activityTemplate").clone().wrap('<div>').parent().html();

                newHTML = templateHTML.replace(/id\=\w+/ig, 'id='+jsonObj.ContactLogID); 
                $(newHTML).prependTo($("#activityContainer"));
// in case i need to refer to newly created object      
                clone = $("#"+jsonObj.ContactLogID); 
        }

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

Повторяя то, что сказал @Foxtrot, вам нужно убедиться, что вы установили идентификатор на клонированном элементе, или вы испугаете IE6. В конце концов, все браузеры следуют стандарту, что идентификаторы должны быть уникальными. Их поведение, когда вы нарушаете это, меняется. Вы испытываете вариации.

В качестве тривиального примера:

var clone = $(userListIJD).clone();
clone[0].id = 'somethingElse'; // use a formula here, as presumably this is run over and over
// proceed with appending the clone