Я сейчас разрабатываю плагин для 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 & 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
}
}
});