Здравствуйте!
Есть боевая задача - расширение должно по нажатию кнопки идти на некоторый урл, выдирать оттуда некоторые данные и предоставлять их.
Хотелось бы работать с DOM.
Проблема в том, что получать данные надо, не открывая нового окна/таба и не в текущем - то есть невидимо для пользователя.
Получить данные у меня получилось только с помощью XMLHttpRequest. Но из него содержимое можно извлечь только responseText, так как responseXML возвращает null. А со строкой работать с DOM не удается.
Подскажите, пожалуйста гуманное решение.
Я вижу два варианта - получать таки объект Document (но не знаю как) или из строки (целиком html файл) его создавать (опять же не знаю, как). И, конечно, хотелось бы это делать максимально просто.
Спасибо.
ЗЫЖ Или посоветуйте, где еще об этом спросить. Языком наиболее вероятного противника владею слабо.
из строки (целиком html файл) его создавать
Через innerHTML. Сталкивался с такой же проблемой, но других вариантов не нашел.
Но:
...при этом проявляется очень существенный недостаток - подгружаются все картинки, внешние css-стили, js-скрипты, и другие встроенные в документ файлы - идет совершенно ненужный трафик.
Поэтому:
...перед тем, как сделать innerHTML ... -- пройтись регулярками и поменять все import/src/data/href/.. (например, на _import/_src/_data/_href/_..)
Отсутствует
из строки (целиком html файл) его создавать
Через innerHTML. Сталкивался с такой же проблемой, но других вариантов не нашел.
Но:
...при этом проявляется очень существенный недостаток - подгружаются все картинки, внешние css-стили, js-скрипты, и другие встроенные в документ файлы - идет совершенно ненужный трафик.
Поэтому:
...перед тем, как сделать innerHTML ... -- пройтись регулярками и поменять все import/src/data/href/.. (например, на _import/_src/_data/_href/_..)
Спасибо, но мне надо несколько более экзотическое :-)
Мне надо не загружать ничего в видимые места броузера.
Чтобы пользователь просто нажал кнопочку на тулбаре, покурил пару минут и все. При этом окно броузера должно оставаться тем, где он был до нажатия кнопки (никак не меняться) , а новых окон/табов не открывать. Короче - чтобы все операции происходили незаметно для пользователя. Можно такое или я слишком многого хочу?
Нашел свой давний черновик:
function parseText(text){ var iframe=document.createElement('iframe'); iframe.style.visibility='hidden'; iframe.style.width="0"; iframe.style.height="0"; document.documentElement.appendChild(iframe); var doc=iframe.contentDocument; document.documentElement.removeChild(iframe); doc.documentElement.innerHTML=text.replace(/\bhref=/g,'_href=').replace(/\bsrc=/g,'_src=').replace(/\bHREF=/g,'_href=').replace(/\bSRC=/g,'_src='); return doc; } var url="http://ya.ru"; var xrequest=new XMLHttpRequest(); xrequest.open("GET",url,true); xrequest.onreadystatechange = function () { if (xrequest.readyState==4){ var result=xrequest.responseText; var doc=parseText(result); //doc - готовое DOM-дерево var ar=doc.getElementsByTagName('DIV'); //тестируем alert(ar[0].innerHTML); //тестируем } }; xrequest.send('');
Криво, но работает.
Отсутствует
Вообще можно. Но innerHTML всё равно надо куда-то применять. Например, через DOM создать невидимый iframe, и вставить туда innerHTML.
Потом приведу примерный код.
Как в примере http://www.xulplanet.com/tutorials/mozsdk/xmlparse.php - просто создать документ, а не лепить невидимый ифрейм. Только там XML документ создается, а создать пустой HTMLDocument аналогичным образом у меня никак не получилось. Вот пустой документ HTML, свободно болтающийся в памяти, - совсем нелья? XML-то можно...
Потому ка с ифреймом и правда не больно красиво.
Спасибо за код.
Hypper
Только там XML документ создается, а создать пустой HTMLDocument аналогичным образом у меня никак не получилось.
Вот у меня тоже что-то не получалось, вот я и iframe создал.
Т.е. создать-то по-моему получилось, но при вставке innerHTML DOM-дерево вроде не строилось, точно не помню. Да, и если создавать iframe, но не цеплять его к документу, то опять-таки DOM-дерево не строится..
Отсутствует
Воспользуйся технологией AJAX