Загрузка 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 here]()
![enter 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 и выше.