2010-08-20 5 views
5

J'essaie d'injecter JQuery dans un UIWebView d'une page que je ne peux pas contrôler, disons Google, par exemple. Lorsqu'un UITextField obtient le focus, j'exécute les lignes de code suivantes:Comment injecter JQuery dans une page existante dans un UIWebView?

NSString* scriptInject = @"var headElement = document.getElementsByTagName('head')[0]; var script = document.createElement('script'); 
    script.setAttribute('src','http://jquery.com/src/jquery-latest.js'); 
    script.setAttribute('type','text/javascript'); headElement.appendChild(script);"; 
    [myWebView stringByEvaluatingJavaScriptFromString:scriptInject];  
    [myWebView stringByEvaluatingJavaScriptFromString:@"$(document).ready(function() {$('body').css('background', '#FF0000');}"]; 

J'exécute le changement de fond pour valider que je suis en mesure d'exécuter un script JQuery. Je peux vérifier que la méthode Objective-C est appelée, et j'ai même planté un alert pour l'onload de la nouvelle balise <script>, donc je sais qu'elle est en cours d'exécution dans le UIWebView. Comment puis-je injecter correctement que je peux l'exécuter?

EDIT:

J'ai essayé événement cette après avoir appelé la fonction pour changer la couleur:

[myWebView stringByEvaluatingJavaScriptFromString:@"alert($('body').css());"]; 

Pas d'alerte montre.

Répondre

4

Si jQuery n'est pas déjà dans le DOM, vous pouvez utiliser stringByEvaluatingJavaScriptFromString: pour l'injecter. J'ai eu un problème similaire, j'ai écrit un article de blog à ce sujet: HTML parsing/screen scraping in iOS.

+1

Je trouve que mon code fonctionne bien, mais pas de manière fiable. Après avoir lu votre article, il se peut que le DOM ne soit pas encore prêt. Après avoir parcouru votre article, effectuer un sélecteur retardé peut être l'astuce pour attendre d'exécuter le changement en utilisant jQuery jusqu'à ce que le DOM soit prêt. Je vais essayer quand j'ai une chance. –

+0

votre blog a disparu du web :( –

+0

@Hamutsi.Correction! J'ai changé de moteur de blog et a cassé tous mes liens –

7

Cela a fonctionné pour moi:

NSString *jqueryCDN = @"http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"; 
NSData *jquery = [NSData dataWithContentsOfURL:[NSURL URLWithString:jqueryCDN]]; 
NSString *jqueryString = [[NSMutableString alloc] initWithData:jquery encoding:NSUTF8StringEncoding]; 
[webView stringByEvaluatingJavaScriptFromString:jqueryString]; 

[webView stringByEvaluatingJavaScriptFromString:/*jquery commands here*/]; 

Taken de this article.

+0

Je sais que c'est un ancien thread, mais ce code et le code de l'article source font un mauvais usage de dataWithContentsOfURL: La bibliothèque jQuery finit par être téléchargée depuis googleapis.com en bloquant le thread principal –

+0

Cette réponse est ici à titre indicatif seulement , ce n'est pas l'approche recommandée, bien sûr. – Stunner

Questions connexes