Cum pot transforma un șir de cod HTML într-un obiect DOM într-o extensie Firefox?

Încerc să descarcă o pagină web (tagged soup HTML) cu XMLHttpRequest și vreau să iau ieșirea și să o transform într-un obiect DOM pe care pot rula apoi interogări XPATH. Cum convertesc dintr-un șir în obiect DOM?

Se pare că soluția generală este de a crea o iframe ascunsă și de a arunca conținutul șirului în ea. A fost vorbiți despre actualizarea DOMParser pentru a suporta text / html, dar din Firefox 3.0.1 obțineți încă un NS_ERROR_NOT_IMPLEMENTED dacă încercați.

Există vreo opțiune pe lângă utilizarea trucului iframe ascuns? Și dacă nu, care este cel mai bun mod de a face trucul iframe, astfel încât codul dvs. să funcționeze în afara contextului oricăror tab-uri deschise (astfel încât filele de închidere nu vor șterge codul etc.)?

This is an example of why I'm looking for a solution other than the iframe hack, if I have to write all that code to have a robust solution, then I'd rather keep looking for something else.

0
fr hi bn

5 răspunsuri

Ajaxian avea de fapt un post despre inserarea / recuperarea html din un iframe astăzi. Probabil că puteți utiliza fragmentul de jurnal pe care l-au postat acolo.

În ceea ce privește manipularea închiderii unui browser / fila, puteți atașa pe onbeforeunload ( http://msdn.microsoft.com/en-us/library/ms536907 (VS.85) .aspx ) și faceți tot ce trebuie să faceți.

0
adăugat

Încercați acest lucru:

var request = new XMLHttpRequest();

request.overrideMimeType( 'text/xml' );
request.onreadystatechange = process;
request.open ( 'GET', url );
request.send( null );

function process() { 
    if ( request.readyState == 4 && request.status == 200 ) {
        var xml = request.responseXML;
    }
}

Observați overrideMimeType și responseXML .
readyState == 4 este "completat".

0
adăugat
Acest lucru nu funcționează dacă răspunsul nu este valabil xml pentru început. Dacă îi spui lui Firefox să aștepte XML, va fi strict cu privire la ceea ce va analiza.
adăugat autor thelsdj, sursa

Încercați să creați o div

document.createElement( 'div' );

Apoi setați tag-ul supa HTML în interiorul HTML al div. Browserul ar trebui să proceseze acest lucru în XML, pe care apoi îl puteți analiza.

Proprietatea innerHTML ia un șir   care specifică o combinație validă de   text și elemente. Atunci când interiorHTML   proprietatea este setată, șirul dat   înlocuiește complet existența   conținutul obiectului. Dacă șirul   conține etichete HTML, șirul este   analizat și formatat pe măsură ce este plasat   în document.

0
adăugat
Problema cu asta este că am nevoie de întregul document HTML, <head> și tot ceea ce ar arunca asta. De asemenea, încerc să nu folosesc ferestrele / filele existente, deoarece codul meu rulează în afara contextului acestora și vreau să fiu rezistent la închiderea aleatorie a unei ferestre sau a unei file, făcând ca codul meu să fie întrerupt (presupunând că Firefox încă rulează).
adăugat autor thelsdj, sursa

Deci, doriți să descărcați o pagină web ca obiect xml folosind javascript, dar nu doriți să utilizați o pagină Web? Deoarece nu aveți control asupra a ceea ce va face utilizatorul (închiderea filelor sau a ferestrelor sau a celor care nu sunt), trebuie să faceți acest lucru într-un widget OSX Dashboard sau într-o aplicație separată. O extensie Firefox ar funcționa, de asemenea, dacă nu trebuie să vă faceți griji cu privire la închiderea browserului.

0
adăugat
Da, folosesc o extensie Firefox, dar majoritatea exemplelor iframe utilizează o fereastră arbitrară a browserului, mai degrabă decât un obiect în procesul de bază, pentru a fi rezistent la închiderea browserului / fișierului.
adăugat autor thelsdj, sursa

Există vreo opțiune pe lângă utilizarea trucului iframe ascuns?

Din păcate, nu, nu acum. În caz contrar, codul microsumariei pe care îl indicați îl folosește în schimb.

Și dacă nu, care este cel mai bun mod de a face trucul iframe, astfel încât codul dvs. să funcționeze în afara contextului oricăror tab-uri deschise (astfel încât filele de închidere nu vor șterge codul etc.)?

Codul pe care l-ați citat folosește fereastra browserului recent, astfel că filele de închidere nu vor afecta parsarea. Închiderea acestei ferestre a browserului va întrerupe încărcarea, dar o puteți rezolva (detectați că încărcarea este întreruptă și reporniți-o într-o altă fereastră, de exemplu) și nu se întâmplă foarte des.

Aveți nevoie de o fereastră DOM pentru ca iframeul să funcționeze corect, deci nu există o soluție curată în acest moment (dacă sunteți interesat să utilizați parserul mozilla).

0
adăugat
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com