2010-12-09 30 views
3

Je travaille sur un projet qui utilise un WebView pour afficher la majorité de son contenu. Le contenu est chargé à partir de fichiers HTML sur un disque que je n'ai pas écrit et dont je n'ai aucun contrôle. Je veux être en mesure d'appliquer un style CSS personnalisé à chaque page chargée dans la vue. Pour ce faire, j'ai mis l'extrait suivant dans -(void)webView:didFinishLoadForFrame:Ajout de nouveaux éléments au DOM d'un WebFrame à partir de Cocoa/Objective-C

DOMDocument *doc = [frame DOMDocument]; 
DOMElement *link = [doc createElement:@"link"]; 
[link setAttribute:@"rel" value:@"stylesheet"]; 
[link setAttribute:@"type" value:@"text/css"]; 
[link setAttribute:@"href" value:[cssPath path]]; 
DOMNodeList *heads = [doc getElementsByName:@"head"]; 
[[heads item:0] appendChild:link]; 

J'ai essayé la même séquence d'instructions dans un fichier JavaScript (JavaScript, non Objective-C bien sûr) et il a travaillé. Le code ci-dessus, cependant, ne fonctionne pas. Je l'ai parcouru avec le débogueur Xcode, et il semble que tout fonctionne (les variables sont initialisées correctement avec des données valides, etc.) mais je ne vois pas de changement dans le cadre. Qu'est-ce que je fais mal? Y a-t-il une meilleure façon de faire ce que j'essaie d'accomplir? Y at-il une raison pour que cela fonctionne en JavaScript mais pas en Objective-C?

Éditer: J'ai joué avec cela au cours des deux derniers jours. Je n'ai toujours pas été en mesure d'utiliser les objets DOM *, mais j'ai obtenu des résultats qui font ceci:

NSString *js = @"var link = document.createElement('link');"; 
js = [js stringByAppendingString:@"link.setAttribute('rel', 'stylesheet');"]; 
js = [js stringByAppendingString:@"link.setAttribute('type', 'text/css');"]; 
js = [js stringByAppendingFormat:@"link.setAttribute('href', '%@');", 
     [defaultCSSURL path]]; 
js = [js stringByAppendingString: 
     @"document.getElementsByTagName('head')[0].appendChild(link);"]; 
[[view windowScriptObject] evaluateWebScript:js]; 

Je ne suis pas particulièrement satisfait de cette solution, mais c'est la seule façon que je suis en mesure pour le faire fonctionner. Notez que defaultCSSURL est un NSURL statique pointant vers un fichier CSS dans le projet.

+0

Eh bien, vous n'avez aucun pointeur. Comment le code est-il même en train de compiler ?! –

+0

Oups! Bonne prise. Copier et coller l'erreur .... Je l'ai réparé ci-dessus. – ngephart

Répondre

2

Je ne sais pas pourquoi cet exemple particulier échoue, mais j'ai accompli cela en utilisant l'objet de script pour exécuter javascript sur la page (et jquery parce qu'il est tellement pratique):

[scriptobj evaluateWebScript:@"$('#my_div').append('my text');"]; 

Le script objet peut être obtenu en définissant l'objet en tant que délégué WebView (webView:windowScriptObjectAvailable)

Mais ce n'est qu'une approche. Je sais que j'ai eu beaucoup de problèmes avec l'objet DOMDocument lui-même.

+0

J'ai pensé à faire quelque chose comme ça, et je l'ai vu mentionné à un ou deux endroits. J'espérais pouvoir éviter d'avoir à faire beaucoup de choses JavaScript. On dirait que les objets DOM * sont un peu foutus dans Cocoa ... – ngephart