Неправильно отформатированные HTML-несоответствия между DOM и тем, что отображается в плагине Firefox - PullRequest
0 голосов
/ 29 июня 2011

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

Я уменьшил ошибку, с которой я столкнулся, до краткого примера html (если это название подходит для такого ужаса, как этот):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Some title.</title>
    <!-- Oh yes ! -->
    <div style="visability:hidden;">
        <a href="//example.com"> </a>
    </div>

<!-- If meta are reduced, then the bug disapears ! -->
<meta name="description" content="Homepage of Company.com, Company's corporate Web site" />
<meta name="keywords" content="Company, Company & Co., Inc., blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla" />
<meta http-equiv="Content-Language" content="en-US" />
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>

</head>
<body class="homePage">

<div class="globalWrapper"><a href="/page.html">My gorgeous link !</a></div>

</body>

</html>

При открытии веб-страницы «Моя великолепная ссылка!»Если отображается и кликабелен.Тем не менее, когда я исследую DOM с Javascript в своем плагине, все ведет себя (DOM Исследование и свойство innerHTML), как код был таким:

<html>
<head>
<title>Some title.</title>
    <!-- Oh yes ! -->
    </head><body><div style="visability:hidden;">
        <a href="//example.com"> </a>
    </div>

<!-- If meta are reduced, then the bug disapears ! -->
<meta name="description" content="Homepage of Company.com, Company's corporate Web site">
<meta name="keywords" content="Company, Company &amp; Co., Inc., blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla, blablabla">
<meta http-equiv="Content-Language" content="en-US">
</body>
</html>

Итак, при исследовании DOM внутри плагинадокумент каким-то образом исправлен firefox.Но этот фиксированный DOM несовместим с тем, что находится на веб-странице.Таким образом, мой плагин работает не так, как ожидалось.

Я действительно озадачен этой проблемой.Проблема существует как в Firefox 3.6, так и в Firefox 4 (пока не тестировал Firefox 5).Например, уменьшение мета-значения решит проблему.

Откуда возникает это несоответствие?Как я могу справиться с этим?

РЕДАКТИРОВАТЬ: С ответом, который я получаю, я думаю, что я должен быть немного более точным.Я знаю, что делает firefow при изменении веб-страницы во втором фрагменте кода.Проблема заключается в следующем: «В фиксированном DOM, который я вставляю в свой плагин, великолепная ссылка нигде не появляется, но эта ссылка фактически видна на веб-странице и работает.Итак, DOM, которым я манипулирую, и DOM на веб-странице разные - они исправлены по-разному.»Так откуда же разница в поведении исправления, и как я могу справиться с этим, или, другими словами, как я могу знать, в моем плагине, о существовании великолепной ссылки?

NB:Изучение DOM с помощью firebug показывает, что DOM отличается от того, что я получаю в своем модуле.Оба DOM исправлены Firefox, но по-разному.Я получаю DOM следующим образом:

 var html = browser.contentDocument.documentElement;
 // Then, for example :
 html.getElementsByTagName('a'); // Returns only the a element in the header. On the webpage, only the a in the body appears.

Исследование DOM с помощью firebug показывает, что div и a в заголовке удалены, что является другим поведением.

EDIT²: код вмой плагин запускается после окончания загрузки страницы, по этому механизму:

gBrowser.addTabsProgressListener({
    onStateChange: function(aBrowser, aWebProgress, aRequest, aStateFlags, aStatus) {
        if( (aStateFlags & Components.interfaces.nsIWebProgressListener.STATE_STOP) ) {
            // Some operations including the DOM parsing here
        }
    }
});

Ответы [ 2 ]

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

Я попытался воспроизвести вашу проблему и потерпел неудачу - в Firefox 5 все работало нормально. Мои умственные способности говорят мне, что вы пытаетесь получить доступ к документу до его завершения загрузки.Вот почему вам нужен длинный метатег: тело документа загружается в два сетевых пакета, и вы просматриваете документ, когда был получен только первый пакет.Дождитесь события DOMContentLoaded, прежде чем получить доступ к документу.Или, если вы используете обработчик прогресса, дождитесь вызова onStateChanged с установленными флагами STATE_STOP и STATE_IS_DOCUMENT.

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

Откуда возникает это несоответствие?

Начальный и конечный теги для элементов <head> и <body> являются необязательными в HTML 4.

Хотявнутри <head>, если встречается что-то, что должно появиться в <body>, <head> автоматически завершается и <body> запускается.

</head><body> затем игнорируются как ошибки.

Как с этим справиться?

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

...