在Webview iOS中注入JavaScript代码
Inject a JavaScript code in Webview iOS
我用swift语言代码创建了一个iOS网络浏览器。并添加一个额外的按钮在该网页上注入脚本,但当我尝试这个时,它总是崩溃:
webView!.evaluateJavaScript("document.body.style.background = 'red';", nil)
知道怎么解决这个问题吗?以及如何从文件中读取JavaScript代码,然后将其注入该webview元素。
我使用代码样式作为示例,但使用WKWebView:https://github.com/rshankras/WebViewDemo
如果你能解决这个问题,我需要一个基本的工作代码作为答案。以及如何从文件加载JavaScript的解决方案。并将该代码注入WKWebView元素中
我在当前UIWebView API文档中看不到您正在使用的方法(评估JavaScript),但它在WKWebView文档中。也许您使用了错误的API?也许可以尝试使用字符串ByEvaluatingJavaScriptFromString(_:):
let script = "document.body.style.background = 'red'"
if let result = webView.stringByEvaluatingJavaScriptFromString(script) {
println("result is '(result)")
}
此外,我不确定是否需要"!"(直觉告诉我不需要),因为代码周围没有上下文。所以也许可以同时尝试两种版本。
从文件中获取字符串类似于:
let path = NSBundle.mainBundle().pathForResource("jsFileName", ofType: "js")
if let content = String.stringWithContentsOfFile(path, encoding: NSUTF8StringEncoding, error: nil) {
println("js content is '(content)")
}
从磁盘加载有很多关于文件复制和存储方式的变量,因此您必须做一些工作来将path
变量适应您的结构。
这将适用于WKWebView。不要忘记在类定义的顶部添加WebKit框架
var webView: WKWebView!
func loadWebViewWithCustomJavaScript {
//Create Preferences
let preferences = WKPreferences()
preferences.javaScriptEnabled = true
//Initialise javascript file with user content controller and configuration
let configuration = WKWebViewConfiguration()
let scriptURL = NSBundle.mainBundle().pathForResource("Your File Name", ofType: "js")
var scriptContent = ""
do {
scriptContent = try String(contentsOfFile: scriptURL!, encoding: NSUTF8StringEncoding)
} catch{
print("Cannot Load File")
}
let script = WKUserScript(source: scriptContent, injectionTime: .AtDocumentStart, forMainFrameOnly: true)
configuration.userContentController.addUserScript(script)
configuration.preferences = preferences
//Create WebView instance
webView = WKWebView(frame: CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height), configuration: configuration)
view.addSubview(webView)
//Finally load the url
let url = NSURL(string:"your URL")
let urlRequest = NSURLRequest(URL: url!)
webView.loadRequest(urlRequest)
}
用于注入的示例JavaScript代码
//Hides name of "background1" element on the page
var styleTag = document.createElement("style");
styleTag.textContent = 'div#background1, .after-post.widget-area {display:none;}';
document.documentElement.appendChild(styleTag);
使用以下方法使其正常工作。使用String而不是NSString来使用本机swift 2。要注入的Javascript代码必须在hidessections.js文件中
let jsPath = NSBundle.mainBundle().pathForResource("hidesections", ofType: "js");
let jsContent: String?
do
{
jsContent = try String(contentsOfFile: jsPath!, encoding: NSUTF8StringEncoding)
}
catch _
{
jsContent = nil
}
webView.stringByEvaluatingJavaScriptFromString(jsContent!)
如果您正在使用WKWebView
,这里有一个解决方案。
if let scriptFile = NSBundle.mainBundle().pathForResource("script", ofType: "js") {
var error: NSError?
let scriptString = NSString(contentsOfFile: scriptFile, encoding: NSUTF8StringEncoding, error: &error)
if let error = error {
println("Error: Could not load script file => '(error)")
} else {
if let scriptString = scriptString {
let script = WKUserScript(source: scriptString, injectionTime: .AtDocumentEnd, forMainFrameOnly: true)
let controller = WKUserContentController()
controller.addUserScript(script)
let configuration = WKWebViewConfiguration()
configuration.userContentController = controller
let webView = WKWebView(frame: self.view.bounds, configuration: configuration)
self.webView = webView
self.view.addSubview(webView)
}
}
}
相关文章:
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 面向对象的Javascript代码在IE7中不起作用
- 通过命令行/批处理文件打开页面时,将javascript代码注入Google Chrome
- JavaScript代码问题:我正在将对象转换为数组
- Javascript阻止其他Javascript代码
- JavaScript代码未正确检查ajax请求
- 如何调试Javascript代码或函数
- 为什么我在这个javaScript代码中使用NaN
- 将javascript代码转换为jquery代码时出错
- 如何从Objective-C代码中调用javascript代码
- 有什么工具可以轻松读取javascript代码吗
- 这个javascript代码是如何编写的
- 如何解密此javascript代码
- SIMPLE Javascript代码,用于显示谷歌电子表格中单个字段的数据
- HTML标记,包含带引号的JavaScript代码中的引号
- 如何在Win8Metro应用程序的Javascript代码中捕获自己的C#事件
- addEventListener的Javascript代码不工作!?(单击时打开放大的img)
- JavaScript代码无法在表单上呈现部分
- 以下 JavaScript 代码与 Facebook 相关
- 使用解析为javascript源的.php,如何使用条件语句将javascript代码封装在php括号之间