2012-08-15 3 views
4

Un peu d'arrière-plan:
Je développe une application mobile basée sur le Web en utilisant JavaScript. Le rendu HTML est basé sur Safari. La stratégie interdomaine est désactivée, donc je peux faire des appels à d'autres domaines en utilisant XmlHttpRequests. L'idée est d'analyser HTML externe et obtenir le contenu textuel de l'élément spécifique.
Dans le passé, j'analysais le texte ligne par ligne, trouvant la ligne dont j'avais besoin. Ensuite, récupérez le contenu de la balise qui est une sous-chaîne de cette ligne. Ceci est très gênant et nécessite beaucoup de maintenance chaque fois que le html cible change.
Maintenant, je veux analyser le texte html en DOM et exécuter des requêtes css ou xpath.
Il fonctionne bien:DOM analyse en JavaScript

$('<div></div>').append(htmlBody).find('#theElementToFind').text() 

Le seul problème est que lorsque j'utilise le navigateur pour charger le texte HTML dans l'élément DOM, il va essayer de charger toutes les ressources externes (images, fichiers js, etc.). Bien que cela ne cause pas de problème sérieux, j'aimerais éviter cela.

Maintenant la question:
Comment puis-je analyser le texte html sur DOM sans le navigateur de charger des ressources externes, ou exécuter des scripts js?
Quelques idées que j'ai pensé à:

  • créant un nouvel objet de document à l'aide appel createDocument (document.implementation.createDocument()), mais je ne suis pas sûr qu'il va sauter le chargement des ressources externes.
  • utilisation analyseur DOM tiers dans JS - le seul que je l'ai essayé était très mauvaise avec des erreurs de manipulation
  • utilisation iframe pour créer un nouveau document, afin que les ressources externes avec un chemin relatif ne jetteront pas une erreur dans la console

Répondre

4

il semble que le morceau de code suivant fonctionne très bien:

var doc = document.implementation.createHTMLDocument(""); 
doc.documentElement.innerHTML = htmlBody; 
var text = $(doc).find('#theElementToFind').text(); 

Les ressources externes ne sont pas chargées, les scripts ne sont pas en cours d'évaluation.

Je l'ai trouvé ici: https://stackoverflow.com/a/9251106/95624

Origine: https://developer.mozilla.org/en/DOMParser#DOMParser_HTML_extension_for_other_browsers

+0

Super, +1 et favorisé. Est-il garanti qu'il n'y a pas d'évaluation de chargement/script externe ou est-ce plutôt "ça marche" pour le moment? Si cela peut changer à tout moment dans le futur, cela peut ne pas être une solution très robuste. – pimvdb

+0

Cela est très bien, mais a un problème, il ne copie pas les attributs sur le nœud HTML, mais c'est mineur car il atteint la majeure partie des problèmes énumérés ci-dessus. – joseeight

1

Vous pouvez construire objet jQuery de toute chaîne html, sans ajouter au DOM:

$(htmlBody).find('#theElementToFind').text(); 
+0

Ce sera toujours exécuter JavaScript. – pimvdb

+0

Cela va en effet lancer js et charger les ressources externes (images, css, etc.) –