JavaScript: замена для XMLSerializer.serializeToString ()? - PullRequest
12 голосов
/ 07 февраля 2011

Я занимаюсь разработкой веб-сайта с использованием фреймворка Seam и библиотеки RichFaces AJAX (на самом деле это не так уж важно для рассматриваемой проблемы - просто некоторые сведения).

Кажется, я обнаружилоднако в RichFaces имеется ошибка, которая в некоторых случаях приводит к сбою обновления на основе AJAX в IE8 (дополнительную информацию см. здесь: http://community.jboss.org/message/585737).

Ниже приведен код, в котором происходит исключение:

   var anchor = oldnode.parentNode;

   if(!window.opera 
       && !A4J.AJAX.isWebkitBreakingAmps() 
       && oldnode.outerHTML 
       && !oldnode.tagName.match( /(tbody|thead|tfoot|tr|th|td)/i ) ) {
         LOG.debug("Replace content of node by outerHTML()");
         if (!Sarissa._SARISSA_IS_IE || oldnode.tagName.toLowerCase()!="table") {
         try {
           oldnode.innerHTML = "";
         } catch(e){    
           LOG.error("Error to clear node content by innerHTML "+e.message);
           Sarissa.clearChildNodes(oldnode);
         }
       }
           oldnode.outerHTML = new XMLSerializer().serializeToString(newnode);
   }

В последней строке (строка с XMLSerializer) происходит исключение в IE. Мне было интересно, если кто-нибудь знает о каком-либо методе замены / библиотеке / и т. Д., Который я мог бы использовать там (хорошо только в IEСпасибо.

РЕДАКТИРОВАТЬ: После некоторых дальнейших исследований, кажется, что исключение не вызвано тем, что XMLSerializer не был определен, скорее это происходит, когда я пытаюсь назначить вывод из XMLSerializer дляexternalHTML свойство oldnode.

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

Может кто-нибудь придумать какую-либо причину относительно того, когда вывод XMLSerializer (который, как показывает отладчик, выглядит вполне допустимым HTML) нельзя присвоить свойству externalHTML элемента ?

Самое странное, что если бы я клонировал элемент (используя cloneNode(true)), а затем установил externalHTML, он, похоже, работает.

Ответы [ 4 ]

17 голосов
/ 07 февраля 2011

В IE вы можете просто использовать свойство xml узла XML, при условии, что newnode действительно является узлом XML, а не узлом HTML:

function serializeXmlNode(xmlNode) {
    if (typeof window.XMLSerializer != "undefined") {
        return (new window.XMLSerializer()).serializeToString(xmlNode);
    } else if (typeof xmlNode.xml != "undefined") {
        return xmlNode.xml;
    }
    return "";
}

oldnode.outerHTML = serializeXmlNode(newnode);

Обновить следующий вопрос обновление

Я бы не использовал outerHTML для замены элемента. Это не универсально поддерживается. Вместо этого вы можете использовать сочетание innerHTML и стандартных методов DOM следующим образом:

var tempEl = document.createElement("div");
tempEl.innerHTML = serializeXmlNode(newnode);
oldnode.parentNode.replaceChild(oldnode, tempEl.firstChild);
2 голосов
/ 18 февраля 2011

Я с тех пор обнаружил причину (некоторое время назад на самом деле). Оказывается, что IE полу-проверяет (он будет блокировать некоторые ошибки, но игнорировать другие) вставленный HTML. Он выдавал какую-то «неизвестную ошибку» или что-то подобное, что было совершенно бесполезно, поскольку не давало указаний на то, что пошло не так - просто что-то пошло не так.

В моем случае это было потому, что

вставлялся с родителем. Если у вас возникают похожие проблемы, возможно, вы захотите убедиться, что вы не слишком умны со своим HTML.
1 голос
/ 25 октября 2012

Ответ в крайнем случае (в основном, чтобы я смог найти его позже):

Отправка HTML-документа в виде строки в API для создания PDF-файлов.

Для всех, кому необходимо преобразовать document.bodyстрока и они отправляют ее через POST в службу для преобразования документа в PDF - IE8 не поддерживает XMLSerializer.При этом вы можете использовать: $(document.body).html(); для IE8.

/**
 * Decides the method by which to turn the document.body into a string that we can post to the PDF Api.
 * Most browsers support XMLSerializer, for others (ie8) use jquery's html method to generate a string.
 * @param xmldom - document.body
 * @return - string representation of the document body
 */
function serializeXml(xmldom){
    if (typeof XMLSerializer != "undefined"){
        return (new XMLSerializer()).serializeToString(xmldom);
    } else {
        return $(xmldom).html();
    }
}

Позвоните по номеру: var dom = serializeXml(document.body);

0 голосов
/ 08 сентября 2011

Предлагаемое решение не работает для меня. Вот мое решение этой проблемы.

Я заменил строку:

oldnode.outerHTML = new XMLSerializer().serializeToString(newnode);

этим:

if(navigator.appName.indexOf('Internet Explorer')>0){
    oldnode.outerHTML = newnode.xml
}else{
    oldnode.outerHTML = new XMLSerializer().serializeToString(newnode); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...