web-dev-qa-db-fra.com

Chargement de javascript dans une UIWebView à partir de ressources

Je dois charger des fichiers javascript depuis le dossier de ressources de mes applications. Pour le moment, il lit très bien les images des ressources, mais il ne lit pas les javascripts pour une raison quelconque.

J'ai pu rendre des documents html qui référencent 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'un 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^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]];

Maintenant, si je change l'URL de base sur mon serveur qui contient également les fichiers requis, il se charge correctement. Ce serait formidable de ne pas avoir besoin d'une 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 du dossier Documents et non du bundle App

Modifier:

Au lieu de faire le remplacement de chaîne et le codage d'URL, j'ai pu obtenir des images en appelant simplement resourceURL sur le mainBundle, mais toujours pas d'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^y f(x) dx$$<img src=\"images/test.png\"></body></html>";
    [webview loadHTMLString:setHtml baseURL:[[NSBundle mainBundle] resourceURL]];

[~ # ~] modifier [~ # ~]

Si vous voulez aider à donner un coup de feu à cela, je vous ai facilité la tâche en créant un exemple de projet!

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

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

Ici, nous allons 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

enter image description here

Le CSS est juste un bonbon :) Dans lib.js réside 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 vue Web

Remarque: webView est une propriété, vue créée avec le générateur d'instance

- (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 cela devrait être le résultat:

enter image description hereenter image description here

MODIFIER:

snowman4415 mentionne que iOS 7 n'aime pas les balises de script à fermeture automatique, donc si quelque chose ne fonctionne pas sur iOS 7, vous devrez peut-être fermer la balise avec </script>

50
Nick Weaver

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];
    // ...
}

Cela est particulièrement utile lorsque vous ne possédez pas les fichiers * .html/xhtml que vous affichez (par exemple, lecteur ePub ou agrégateur de nouvelles). Cela vous aide à ne pas avoir à vous soucier des chemins relatifs de votre fichier xhtml à votre fichier js.

15
TPoschel

Voici comment j'ai utilisé Webview et JS local. Mettre quelques instantanés ici un exemple de projet ici

Resources

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

    }
}
3
anoop4real

Dans Swift 3.x nous pouvons utiliser la fonction loadHTMLString(_ string: String, baseURL: URL?) qui 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

0
Jack

texte fort Nous pouvons exécuter du JavaScript personnalisé sur une UIWebView à l'aide de la méthode stringByEvaluatingJavaScriptFromString (). Cette méthode renvoie le résultat de l'exécution du script JavaScript passé dans le paramètre de script , ou nil si le script échoue.

Rapide

Charger le script à partir de la chaîne

webview.stringByEvaluatingJavaScriptFromString(“alert(‘This is JavaScript!’);”) 

Charger le script à partir du fichier local

//Suppose you have javascript file named "JavaScript.js" in project.
let filePath = NSBundle.mainBundle().pathForResource("JavaScript", ofType: "js")
        do {
let jsContent = try String.init(contentsOfFile: filePath!, encoding:
NSUTF8StringEncoding)
webview.stringByEvaluatingJavaScriptFromString(jsContent)
        }
catch let error as NSError{
            print(error.debugDescription)
}

Objectif-C

Charger le script à partir de la chaîne

[webview stringByEvaluatingJavaScriptFromString:@”alert(‘This is JavaScript!’);”];

Charger le script à partir du fichier local


//Suppose you have javascript file named "JavaScript.js" in project.
NSString *filePath = [[NSBundle mainBundle] pathForResource:@”JavaScript” ofType:@”js”];
NSString *jsContent = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
[webview stringByEvaluatingJavaScriptFromString:jsContent];

enter image description here

Remarque La méthode stringByEvaluatingJavaScriptFromString: attend de manière synchrone la fin de l'évaluation JavaScript. Si vous chargez du contenu Web dont vous n'avez pas vérifié le code JavaScript, l'invocation de cette méthode pourrait bloquer votre application. La meilleure pratique consiste à adopter la classe WKWebView et à utiliser à la place sa méthode assessJavaScript: complétementHandler :. Mais WKWebView est disponible à partir d'iOS 8.0 et versions ultérieures.

0
Mr.Javed Multani