Загрузка JavaScript в UIWebView из ресурсов - PullRequest
24 голосов
/ 20 апреля 2011

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

Я смог отобразить html-документы, которые ссылаются на эти javascript-коды, если сами 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 для ресурсов в папке «Документы», а не в комплекте приложений

Редактировать:

Вместо замены строки и кодирования 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 git@github.com:pyramation/math-test.git

Ответы [ 4 ]

50 голосов
/ 28 апреля 2011

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

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

Обратите внимание, что на синие папки ссылаются

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 isсвойство, представление, созданное с помощью построителя экземпляров

- (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 here enter image description here

РЕДАКТИРОВАТЬ:

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

15 голосов
/ 20 ноября 2012

Вот еще один способ внедрить локальный файл 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 голосов
/ 04 марта 2017

Так я и использовал 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")

    }
}
0 голосов
/ 21 июля 2017

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

...