2010-08-20 20 views
5

Estoy tratando de inyectar JQuery en un UIWebView de una página que no puedo controlar, digamos Google, por ejemplo. Cuando un UITextField obtiene foco, Estoy ejecutando las siguientes líneas de código:¿Cómo inyectar JQuery en una página existente dentro de 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');}"]; 

Estoy ejecutando el cambio de fondo para validar que soy capaz de ejecutar un script de jQuery. Puedo verificar que se está llamando al método Objective-C, e incluso planté un alert para la carga de la etiqueta <script> recién creada, así que sé que se está ejecutando en el UIWebView. ¿Cómo lo inyecté correctamente para poder ejecutarlo?

EDIT:

Tengo evento trató esto después de llamar a la función para cambiar el color:

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

Si no se presenta de alerta.

Respuesta

4

Si jQuery no está en el DOM ya puede usar stringByEvaluatingJavaScriptFromString: para inyectarlo. Tuve un problema similar, escribí una publicación en el blog al respecto: HTML parsing/screen scraping in iOS.

+1

Me parece que mi código realmente funciona, pero no de manera confiable. Después de leer su artículo, puede ser porque el DOM aún no está listo. Después de revisar su artículo, realizar un selector retrasado puede ser el truco para esperar a ejecutar el cambio usando jQuery hasta que el DOM esté listo. Lo probaré cuando tenga oportunidad. –

+0

su blogpost desapareció de la web :( –

+0

@Hamutsi. Solucionado! Cambié el motor del blog y rompí todos mis enlaces. –

7

Esto ha funcionado para mí:

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*/]; 

Tomado de this article.

+0

Sé que esto es un hilo antiguo, pero tanto este código como el código en el artículo de origen hacen un uso deficiente de dataWithContentsOfURL: la biblioteca de jQuery termina descargándose de googleapis.com mientras bloquea el hilo principal. –

+0

de acuerdo! Esta respuesta es solo para fines de demostración , este no es el enfoque recomendado, por supuesto. – Stunner

Cuestiones relacionadas