Загрузка javascript в UIWebView из ресурсов

Мне нужно загрузить файлы javascript из папки ресурсов приложений. На данный момент он действительно читает изображения из ресурсов просто отлично, но по какой-то причине он не читает javascripts.

Мне удалось отобразить html-документы, которые ссылаются на эти javascripts, если сами файлы html записываются в ресурсы, но я хотел бы отобразить html/js, установив html UIWebView, чтобы он мог быть динамическим.

Вот что я делаю:

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

Теперь, если я изменяю базовый url на свой сервер, который также имеет необходимые файлы, он действительно загружается. Было бы здорово не требовать подключения к Интернету. Любая помощь приветствуется!!!;)

Я нашел, что это полезно для отображения изображений: iPhone Dev: UIWebView baseUrl для ресурсов в папке "Документы" , а не в комплекте приложений

Edit:

Вместо того, чтобы выполнять замену строки и кодировку URL, я смог получить образы, просто вызвав resourceURL на mainBundle, но все равно не выполнив 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]];

ИЗМЕНИТЬ

Если вы хотите помочь сделать это, я упростил вам создание проекта!

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

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

Ответ 1

Здесь мы переходим к простой настройке.

Создайте следующую структуру папок в папке Ресурсы.

Обратите внимание, что в синих папках указаны ссылки

enter image description here

Css - это просто конфета:) В lib.js находится код javascript, который вы хотите использовать.

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

Загрузка содержимого в веб-просмотр

Примечание: webView - это свойство, представление, созданное с помощью построителя экземпляров

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

И это должны быть результаты:

enter image description hereenter image description here

EDIT:

snowman4415 отметил, что iOS 7 не любит теги, закрывающие теги script, поэтому, если что-то не работает на iOS 7, вам может понадобиться закрыть тег </script>

Ответ 2

Вот еще один способ вставить локальный файл javascript в DOM веб-представления. Вы загружаете содержимое файла JS в строку, а затем используйте 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];
    // ...
}

Это особенно полезно, если вы не являетесь владельцем *.html/xhtml файлов, которые вы показываете (например, ePub reader или агрегатор новостей). Это помогает вам не беспокоиться об относительных путях из вашего xhtml файла в файл js.

Ответ 3

Вот как я использовал Webview и локальную JS. Введя несколько снимков здесь пример проекта здесь

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

    }
}

Ответ 4

В swift 3.x мы можем использовать loadHTMLString(_ string: String, baseURL: URL?) функция, которая используется для отображения script в 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)
     }
    }

Примечание. - Мы можем установить высоту UIWebView, как указано выше в Метод webViewDidFinishLoad

Ответ 5

строгий текст Мы можем запустить пользовательский JavaScript в UIWebView с помощью метода stringByEvaluatingJavaScriptFromString(). Этот метод возвращает результат выполнения сценария JavaScript, переданного в параметре сценария, или nil в случае сбоя сценария.

Swift

Загрузить скрипт из строки

webview.stringByEvaluatingJavaScriptFromString('alert(‘This is JavaScript!);') 

Загрузить скрипт из локального файла

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

Objective-C

Загрузить скрипт из строки

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

Загрузить скрипт из локального файла


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

Примечание stringByEvaluatingJavaScriptFromString: метод синхронно ожидает завершения оценки JavaScript. Если вы загружаете веб-контент, чей код JavaScript вы не проверяли, вызов этого метода может привести к зависанию вашего приложения. Лучше всего принять класс WKWebView и использовать вместо него его defineJavaScript: завершение и метод:. Но WKWebView доступен с iOS 8.0 и выше.