2008-08-06 10 views
18

Je télécharge une page Web (tag soup HTML) avec XMLHttpRequest et je veux prendre la sortie et la transformer en un objet DOM sur lequel je peux lancer des requêtes XPATH. Comment puis-je convertir d'une chaîne en objet DOM?Comment puis-je transformer une chaîne de HTML en un objet DOM dans une extension Firefox?

Il semble que la solution générale consiste à créer un cadre iFrame caché et à y insérer le contenu de la chaîne. Il y a eu talk de mise à jour DOMParser pour soutenir le texte/html mais à partir de Firefox 3.0.1 vous obtenez toujours un NS_ERROR_NOT_IMPLEMENTED si vous essayez.

Existe-t-il une option autre que l'utilisation de l'astuce cachée de l'iframe? Et sinon, quelle est la meilleure façon de faire l'affaire iframe afin que votre code fonctionne en dehors du contexte de tous les onglets actuellement ouverts (de sorte que les languettes de fermeture ne seront pas bousiller code, etc.)?

This est un exemple de pourquoi je suis à la recherche d'une solution autre que le hack iframe, si je dois écrire tous ce code pour avoir une solution robuste, alors je préfère continuer à chercher autre chose.

Répondre

4

Essayez ceci:

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; 
    } 
} 

Notez que le overrideMimeType et responseXML.
L'état readyState == 4 est 'terminé'.

+0

Cela ne fonctionne pas si la réponse n'est pas XML valide pour commencer. Si vous dites à Firefox d'attendre le XML, il sera strict sur ce qu'il va analyser. – thelsdj

1

Essayez de créer un div

document.createElement('div'); 

Et puis définissez la soupe tag HTML au innerHTML de la div. Le navigateur doit traiter cela en XML, que vous pouvez ensuite analyser.

La propriété innerHTML prend une chaîne qui spécifie une combinaison valide de texte et des éléments. Lorsque la propriété innerHTML est définie, la chaîne remplace complètement le contenu existant de l'objet. Si la chaîne contient des balises HTML, la chaîne est analysée et formatée comme elle est placée dans le document.

+0

Le problème avec ceci est que j'ai besoin de tout le document HTML, et tout ce que cela jetterait. J'essaye aussi de ne pas utiliser les fenêtres/onglets existants car mon code fonctionne en dehors de leur contexte et je veux résister à un utilisateur fermant aléatoirement une fenêtre ou une tabulation pour que mon code soit interrompu (en supposant que Firefox soit toujours en cours d'exécution) . – thelsdj

1

Vous souhaitez télécharger une page Web en tant qu'objet XML à l'aide de javascript, mais vous ne souhaitez pas utiliser de page Web? Puisque vous avez aucun contrôle sur ce que l'utilisateur fera (onglets fermeture ou fenêtres ou autres joyeusetés), vous devez faire cela dans comme un widget Dashboard OSX ou une application séparée. Une extension Firefox fonctionnerait également, à moins que vous n'ayez à vous soucier de la fermeture du navigateur par l'utilisateur.

+0

Oui, j'utilise une extension Firefox, mais la plupart des exemples iframe utilisent une fenêtre de navigateur arbitraire plutôt qu'un objet dans le processus principal pour résister à la fermeture du navigateur/onglet. – thelsdj

1

Existe-t-il une option autre que l'utilisation de l'astuce de l'iframe caché?

Malheureusement, non, pas maintenant. Sinon, le code microrésumés vous pointez sur l'utiliserait à la place.Et sinon, quelle est la meilleure façon de faire le truc iframe pour que votre code fonctionne en dehors du contexte des onglets actuellement ouverts (pour que les onglets de fermeture ne fassent pas de code, etc.)?

Le code que vous avez cité utilise la fenêtre du navigateur récent, la fermeture des onglets n'affectera donc pas l'analyse. Fermer cette fenêtre de navigateur annulera votre chargement, mais vous pouvez le gérer (détecter que le chargement est annulé et le redémarrer dans une autre fenêtre par exemple) et cela n'arrive pas très souvent.

Vous avez besoin d'une fenêtre DOM pour que l'iframe fonctionne correctement, donc il n'y a pas de solution propre pour le moment (si vous voulez utiliser l'analyseur mozilla).