Chargement de javascript dans une UIWebView à partir de ressources

J'ai besoin de charger des fichiers javascript dans mon dossier de ressources d'applications. À partir de maintenant, il lit les images à partir des ressources très bien, mais ce n'est pas la lecture de javascripts pour une raison quelconque.

J'ai pu rendre html docs qui font référence à ces javascripts si les fichiers html eux-mêmes sont écrits dans les ressources, mais je voudrais rendre html / js en définissant le html d'une UIWebView afin qu'il puisse être dynamique.

Voici ce que je fais:

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^yf(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]]; 

Maintenant, si je change l'URL de base de mon serveur qui possède également les fichiers requis, il se charge correctement. Il serait formidable de ne pas nécessiter de connexion Internet. Toute aide est appréciée !!! 😉

J'ai trouvé cela utile pour obtenir des images à afficher: iPhone Dev: UIWebView baseUrl vers les ressources dans le dossier Documents non le bundle de l'application

Modifier:

Au lieu de remplacer et de coder les URL, j'ai pu obtenir des images en appelant simplement resourceURL sur le MainBundle, mais sans aucune exécution 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^yf(x) dx$$<img src=\"images/test.png\"></body></html>"; [webview loadHTMLString:setHtml baseURL:[[NSBundle mainBundle] resourceURL]]; 

MODIFIER

Si vous souhaitez aider à donner un coup de main, je vous l'ai rendu plus facile en créant un exemple de projet!

Https://github.com/pyramation/math-test

 git clone [email protected]:pyramation/math-test.git 

Nous allons ici avec une configuration simple.

Créez la structure de dossiers suivante dans votre dossier Ressources.

Notez que les dossiers bleus sont référencés

Entrez la description de l'image ici

Le css est juste bonbon 🙂 Dans lib.js réside dans votre code javascript que vous souhaitez utiliser.

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'); } 

Chargement du contenu dans la visualisation web

Remarque: webView est une propriété, vue créée avec le constructeur d'instances

 - (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]]]]; } 

Et ce devrait être les résultats:

Entrez la description de l'image iciEntrez la description de l'image ici

MODIFIER:

Snowman4415 a mentionné que iOS 7 n'aime pas les étiquettes de script de fermeture automatique, donc si quelque chose ne fonctionne pas sur iOS 7, vous devrez peut-être fermer la balise avec </script>

Voici une autre façon d'injecter un fichier javascript local dans le DOM d'une vue web. Vous chargez le contenu du fichier JS dans une chaîne, puis utilisez 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]; // ... } 

Ceci est particulièrement utile lorsque vous ne possédez pas les fichiers * .html / xhtml que vous affichez (c'est-à-dire le lecteur ePub ou l'agrégateur de nouvelles). Cela vous aide à ne pas vous soucier des chemins relatifs de votre fichier xhtml à votre fichier js.

C'est ce que j'ai fait en utilisant Webview et JS local. Mettre quelques instantanés ici un exemple de projet ici

Ressources

 // 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") } } 

Dans swift 3.x, nous pouvons utiliser la fonction loadHTMLString(_ string: String, baseURL: URL?) est utilisée pour afficher le script dans 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) } } 

Remarque: – Nous pouvons définir la hauteur de UIWebView comme je l'ai mentionné ci-dessus dans la méthode webViewDidFinishLoad