Невозможно проанализировать xmlHttpRequest responseText в расширении Firefox - PullRequest
0 голосов
/ 01 июня 2011

Я создаю расширение Firefox, и в этом расширении я делаю ajax-запрос, который возвращает мне responseText, теперь я хочу проанализировать responseText в js, но я не могу разобрать этот запрос.

Обратите внимание, что если я запускаю тот же код на своем веб-сервере, он работает отлично.Ниже приведен код

var myHTML = XHR.responseText;
var tempDiv = document.createElement('div');

tempDiv.innerHTML = myHTML;
tempDiv.childNodes;
tempDiv.getElementsByTagName('a'); // etc. etc.

Если я использую этот код на своем веб-сервере, я могу анализировать childNodes и получать их значения, но если я использую этот же код в своем расширении Firefox, то я неЯ могу получить доступ к дочерним узлам, даже если я вижу ответный текст, когда я использую его в расширении Firefox.

Я немного озадачен этим безразличным поведением того же кода, пожалуйста, помогите мне.

Ответы [ 2 ]

1 голос
/ 06 июня 2011

Лучше не вставлять HTML-код, полученный с удаленного сервера, прямо в ваш привилегированный документ - это уязвимость безопасности.Даже если вы контролируете сервер и абсолютно уверены, что сервер никогда не будет взломан, данные могли быть изменены в пути.Используя innerHTML, вы можете запускать код JavaScript, который был отправлен вместе с кодом HTML, и этот код JavaScript будет выполняться с привилегиями ваших расширений (что означает, что он может выполнять практически все).

Вы должны создать <iframe> и убедитесь, что между вашим документом и этим фреймом есть граница безопасности (это делает type = "content").Примерно так:

var myHTML = XHR.responseText;
var tempFrame = document.createElement("iframe");
tempFrame.setAttribute("type", "content");
tempFrame.setAttribute("src", "data:text/html;charset=utf-8," + encodeURIComponent());
document.documentElement.appendChild(tempFrame);
tempFrame.contentWindow.addEventListener("load", function()
{
    tempFrame.contentDocument.documentElement;
    tempFrame.contentDocument.getElementsByTagName('a');
    ...
    tempFrame.parentNode.removeChild(tempFrame);
}, false);

Конечно, все будет проще, если у вас хорошо сформированный XML.Затем анализ выполняется просто:

var doc = new DOMParser().parseFromString(XHR.responseText, "text/xml");
doc.documentElement;
doc.getElementsByTagName('a');

Редактировать : все изменилось после того, как я написал это - начиная с Firefox 10 вы также можете использовать DOMParser() для HTML-кода, который не 'т хорошо сформирован.Поэтому, если вам просто нужно извлечь некоторые данные из фрагмента HTML-кода, вам не следует использовать фреймы, а скорее parseFromString(..., "text/html").

0 голосов
/ 01 июня 2011

Поведение установщика innerHTML зависит от типа документа. Firefox Chrome является документом XML, поэтому строка myHTML будет проанализирована как XML в приведенном выше фрагменте.На веб-странице вы, вероятно, писали HTML, а не XML, и, следовательно, получали разбор HTML.Является ли ваша строка нормальным HTML, но не правильно сформированным XML?

...