将 javascript 从资源加载到 UIWebView
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/5733883/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Loading javascript into a UIWebView from resources
提问by pyramation
I need to load javascript files from my apps resources folder. As of right now, it does read images from the resources just fine, but it's not reading javascripts for some reason.
我需要从我的应用程序资源文件夹中加载 javascript 文件。截至目前,它确实可以很好地从资源中读取图像,但由于某种原因它没有读取 javascripts。
I have been able to render html docs that reference these javascripts if the html files themselves are written into the resources, but I would like to render html/js by setting the html of a UIWebView so it can be dynamic.
如果将 html 文件本身写入资源中,我已经能够呈现引用这些 javascript 的 html 文档,但我想通过设置 UIWebView 的 html 来呈现 html/js,以便它可以是动态的。
Here is what I am doing:
这是我在做什么:
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]];
Now, if I change the base url to my server which also has the required files, it does load correctly. It would be great to not require an internet connection. Any help is appreciated!!! ;)
现在,如果我将基本 url 更改为也有所需文件的服务器,它会正确加载。不需要互联网连接会很棒。任何帮助表示赞赏!;)
I found this useful in getting images to display: iPhone Dev: UIWebView baseUrl to resources in Documents folder not App bundle
我发现这对于显示图像很有用:iPhone Dev: UIWebView baseUrl to resources in Documents folder not App bundle
Edit:
编辑:
Instead of doing the string replacing and URL encoding, I was able to get images to by simply calling resourceURL on the mainBundle, but still no javascript execution.
我没有进行字符串替换和 URL 编码,而是通过简单地调用 mainBundle 上的 resourceURL 来获取图像,但仍然没有执行 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]];
EDIT
编辑
If you want to help give this a shot, I have made it easier for you by creating an example project!
如果您想尝试一下,我通过创建示例项目让您更轻松!
https://github.com/pyramation/math-test
https://github.com/pyramation/math-test
git clone [email protected]:pyramation/math-test.git
回答by Nick Weaver
Here we go with a simple setup.
在这里,我们进行一个简单的设置。
Create the following folder structure in your Resources folder.
在您的资源文件夹中创建以下文件夹结构。
Note that the blue folders are referenced ones
请注意,蓝色文件夹是引用的文件夹
The css is just candy :) In lib.js resides your javascript code which you'd like to use.
css 只是糖果 :) 在 lib.js 中存在您想要使用的 javascript 代码。
index.html
索引.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
库.js
function alertMeWithMyCustomFunction(text) {
alert(text+' -> in lib.js');
}
Loading of the content in the webview
在 webview 中加载内容
Note: webView is a property, view created with instance builder
注意: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]]]];
}
And this should be the results:
这应该是结果:
EDIT:
编辑:
snowman4415 mentioned that iOS 7 does not like self closing tags script tags, so if something is not working on iOS 7, you may need to close the tag with </script>
snowman4415 提到 iOS 7 不喜欢自关闭标签脚本标签,所以如果某些东西在 iOS 7 上不起作用,你可能需要关闭标签 </script>
回答by TPoschel
Here is another way to inject a local javascript file into the DOM of a web view. You load the contents of the JS file into a string and then use stringByEvalutatingJavaScriptFromString
:
这是将本地 javascript 文件注入 Web 视图的 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];
// ...
}
This is especially useful when you don't own the *.html/xhtml files you are displaying (i.e. ePub reader. or news aggregator). It helps so that you don't have to worry about the relative paths from your xhtml file to your js file.
当您不拥有正在显示的 *.html/xhtml 文件(即 ePub 阅读器或新闻聚合器)时,这尤其有用。它有助于您不必担心从 xhtml 文件到 js 文件的相对路径。
回答by anoop4real
This is how I did using Webview and local JS. Putting some snapshots here a sample project here
这就是我使用 Webview 和本地 JS 的方式。把一些快照放在这里 一个示例项目在这里
// 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")
}
}
回答by Hyman
In swift 3.x we can use loadHTMLString(_ string: String, baseURL: URL?)
function which is used for displaying script in UIWebview
在 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)
}
}
Note:- We can set height of UIWebView as i mentioned above in webViewDidFinishLoad method
注意:- 我们可以在 webViewDidFinishLoad 方法中设置 UIWebView 的高度,正如我上面提到的
回答by Mr.Javed Multani
strong textWe can run custom JavaScript on a UIWebView using the method stringByEvaluatingJavaScriptFromString().This method returns the result of running the JavaScript script passed in the script parameter, or nil if the script fails.
强文本我们可以使用 stringByEvaluatingJavaScriptFromString() 方法在 UIWebView 上运行自定义 JavaScript。此方法返回运行脚本参数中传递的 JavaScript 脚本的结果,如果脚本失败,则返回 nil。
Swift
迅速
Load script from String
从字符串加载脚本
webview.stringByEvaluatingJavaScriptFromString(“alert(‘This is JavaScript!');”)
Load script from Local file
从本地文件加载脚本
//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
目标-C
Load script from String
从字符串加载脚本
[webview stringByEvaluatingJavaScriptFromString:@”alert(‘This is JavaScript!');”];
Load script from Local file
从本地文件加载脚本
//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];
NoteThe stringByEvaluatingJavaScriptFromString: method waits synchronously for JavaScript evaluation to complete. If you load web content whose JavaScript code you have not vetted, invoking this method could hang your app. Best practice is to adopt the WKWebView class and use its evaluateJavaScript:completionHandler: method instead. But WKWebView is available from iOS 8.0 and later.
注意stringByEvaluatingJavaScriptFromString: 方法同步等待 JavaScript 评估完成。如果您加载的 Web 内容的 JavaScript 代码未经您,则调用此方法可能会挂起您的应用程序。最佳实践是采用 WKWebView 类并改用它的evaluateJavaScript:completionHandler: 方法。但是 WKWebView 在 iOS 8.0 及更高版本中可用。