tag - Carga de javascript en UIWebView desde recursos
title tag html5 (4)
Aquí hay otra forma de insertar un archivo javascript local en el DOM de una vista web. stringByEvalutatingJavaScriptFromString
el contenido del archivo JS en una cadena y luego utilizas stringByEvalutatingJavaScriptFromString
:
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSString *jsFile = @"jquery-1.8.2.min.js";
NSString *jsFilePath = [[NSBundle mainBundle] pathForResource:jsFile ofType:nil];
NSURL *jsURL = [NSURL fileURLWithPath:jsFilePath];
NSString *javascriptCode = [NSString stringWithContentsOfFile:jsURL.path encoding:NSUTF8StringEncoding error:nil];
[webView stringByEvaluatingJavaScriptFromString:javascriptCode];
// ...
}
Esto es especialmente útil cuando no posee los archivos * .html / xhtml que está mostrando (es decir, el lector de ePub o el agregador de noticias). Ayuda para que no tenga que preocuparse por las rutas relativas de su archivo xhtml a su archivo js.
Necesito cargar archivos javascript desde la carpeta de recursos de mi aplicación. A partir de ahora, lee imágenes de los recursos muy bien, pero no está leyendo javascripts por alguna razón.
Pude renderizar documentos html que hacen referencia a estos javascripts si los archivos html están escritos en los recursos, pero me gustaría renderizar html / js configurando el html de un UIWebView para que pueda ser dinámico.
Esto es lo que estoy haciendo:
NSString * html = @"<!DOCTYPE html><html><head><title>MathJax</title></head><body><script type=/"text/x-mathjax-config/">MathJax.Hub.Config({tex2jax: {inlineMath: [[/"$/",/"$/"],[/"//(/",/"//)/"]]}});</script><script type=/"text/javascript/" src=/"/MathJax/MathJax.js/"></script>$$//int_x^y f(x) dx$$<img src=/"coffee.png/"></body></html>";
NSString * path = [[NSBundle mainBundle] resourcePath];
path = [path stringByReplacingOccurrencesOfString:@"/" withString:@"//"];
path = [path stringByReplacingOccurrencesOfString:@" " withString:@"%20"];
NSString * resourcesPath = [[NSString alloc] initWithFormat:@"file://%@/", path];
[webview loadHTMLString:html baseURL:[NSURL URLWithString:resourcesPath]];
Ahora, si cambio la url base a mi servidor que también tiene los archivos necesarios, se carga correctamente. Sería genial no requerir una conexión a Internet. ¡Cualquier ayuda es apreciada! ;)
Me pareció útil para obtener imágenes para mostrar: iPhone Dev: UIWebView baseUrl a los recursos en la carpeta Documentos, no paquete de aplicaciones
Editar:
En lugar de hacer la sustitución de cadenas y la codificación URL, pude obtener imágenes simplemente llamando a resourceURL en mainBundle, pero todavía no hay ejecución de javascript.
NSString * setHtml = @"<!DOCTYPE html><html><head><title>MathJax</title></head><body><script type=/"text/x-mathjax-config/">MathJax.Hub.Config({tex2jax: {inlineMath: [[/"$/",/"$/"],[/"//(/",/"//)/"]]}});</script><script type=/"text/javascript/" src=/"/MathJax/MathJax.js/"></script>$$//int_x^y f(x) dx$$<img src=/"images/test.png/"></body></html>";
[webview loadHTMLString:setHtml baseURL:[[NSBundle mainBundle] resourceURL]];
EDITAR
Si quiere ayudar a probar esto, ¡lo he hecho más fácil al crear un proyecto de ejemplo!
https://github.com/pyramation/math-test
git clone [email protected]:pyramation/math-test.git
Aquí vamos con una configuración simple.
Crea la siguiente estructura de carpetas en tu carpeta de Recursos.
Tenga en cuenta que las carpetas azules son referencias
El CSS es simplemente un caramelo :) En lib.js reside su código de JavaScript que le gustaría usar.
index.html
<html>
<head>
<link rel="stylesheet" type="text/css" href="css/standard.css">
<script src="js/lib.js" type="text/javascript" />
</head>
<body>
<h2>Local Javascript</h2>
<a href="javascript:alert(''Works!'')">Test Javascript Alert</a>
<br/>
<br/>
<a href="javascript:alertMeWithMyCustomFunction(''I am'');">External js test</a>
</body>
</html>
lib.js
function alertMeWithMyCustomFunction(text) {
alert(text+'' -> in lib.js'');
}
Carga del contenido en la vista web
Nota: webView es una propiedad, vista creada con el generador de instancias
- (void)viewDidLoad
{
NSString *htmlPath = [[NSBundle mainBundle] pathForResource:@"index"
ofType:@"html"
inDirectory:@"/htdocs" ];
NSString *html = [NSString stringWithContentsOfFile:htmlPath
encoding:NSUTF8StringEncoding
error:nil];
[webView loadHTMLString:html
baseURL:[NSURL fileURLWithPath:
[NSString stringWithFormat:@"%@/htdocs/",
[[NSBundle mainBundle] bundlePath]]]];
}
Y este debería ser el resultado:
EDITAR:
snowman4415 mencionó que a iOS 7 no le gustan las etiquetas de secuencia de comandos de cierre automático, por lo que si algo no funciona en iOS 7, es posible que deba cerrar la etiqueta con </script>
Así es como lo hice usando Webview y JS local. Poniendo algunas instantáneas aquí un ejemplo de proyecto here
// Get the path for index.html, where in which index.html has reference to the js files, since we are loading from the proper resource path, the JS files also gets picked up properly from the resource path.
func loadWebView(){
if let resourceUrl = Bundle.main.url(forResource: "index", withExtension: "html", subdirectory: "WebDocs2"){
let urlRequest = URLRequest.init(url: resourceUrl)
myWebView.loadRequest(urlRequest)
}
}
// Load the JS from resources
func jsScriptText() -> String? {
guard let jsPath = Bundle.main.path(forResource: "hello", ofType: "js", inDirectory: "WebDocs2/scripts") else {
return nil
}
do
{
let jsScript = try String(contentsOfFile: jsPath, encoding: String.Encoding.utf8)
return jsScript
}catch{
print("Error")
return nil
}
}
// Run the java script
func runJS(){
if let jsScript = jsScriptText(){
let jsContext = JSContext()
_ = jsContext?.evaluateScript(jsScript)
let helloJSCore = jsContext?.objectForKeyedSubscript("helloJSCore")
let result = helloJSCore?.call(withArguments: [])
print(result?.toString() ?? "Error")
}
}
En swift 3.x podemos usar la función loadHTMLString(_ string: String, baseURL: URL?)
Que se usa para visualizar script en UIWebview
@IBOutlet weak var webView : UIWebView!
class ViewController: UIViewController,UIWebViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
webView.delegate = self
}
func loadWebView() {
webView.loadHTMLString("<p>Hello, How are you doing?.</p>" , baseURL: nil)
}
func webViewDidFinishLoad(_ webView: UIWebView) {
webView.frame.size.height = 1
webView.frame.size = webView.sizeThatFits(.zero)
}
}
Nota: - Podemos establecer la altura de UIWebView como mencioné anteriormente en el método webViewDidFinishLoad