我尝试使用以下代码从swift调用Javascript函数但无法访问Javascript函数
这是我创建Javascript上下文对象的方式:
lazy var context: JSContext? = {
let context = JSContext()
guard let
JSPath = Bundle.main.path(forResource: "IAV", ofType: "html")
else {
print("Unable to read resource files.")
return nil
}
do {
let iav = try String(contentsOfFile: JSPath, encoding: String.Encoding.utf8)
_ = context?.evaluateScript(iav)
} catch (let error) {
print("Error while processing script file: \(error)")
}
return context
}()
//将值设置为js
func setToken(Token:String)
{
let jsmethod = context?.objectForKeyedSubscript("setIAVToken")
let passParameter = jsmethod?.call(withArguments: [Token])
}
html文件的内容是
样本IAV表格
</head> <body > <header> </header> <main> <h1>Registration Form</h1> <form id="myform" method="post"> <div id="mainContainer"> <input type="button" id="start" value="Add Bank"> </div>
var value =&#34; dhjhsd&#34 ;;
var setIAVToken = function(token) { value= token; } $('#start').click(function() { var iavToken = value; alert(iavToken) dwolla.configure('uat'); dwolla.iav.start('iavContainer', iavToken, function(err, res) { console.log('Error: ' + JSON.stringify(err) + ' -- Response: ' + JSON.stringify(res)); }); }); </script> </html>
答案 0 :(得分:1)
如果是客观c,请执行以下操作:
#import <JavaScriptCore/JavaScriptCore.h>
。
接下来在viewcontroller中使用此代码。
NSString *jsPath = [[NSBundle mainBundle]
pathForResource:@"JSFileName" ofType:@"js"];
NSString *scriptString = [NSString stringWithContentsOfFile:jsPath encoding:NSUTF8StringEncoding error:nil];
JSContext *context = [[JSContext alloc] init];
context = [[JSContext alloc] init];
[context evaluateScript:scriptString];
JSValue *function = context[@"setMessage"];
JSValue* result = [function callWithArguments:@[@"your custom string"]]; //pass the string whatever you want.
[result toString]; // This will give the value in string format.
答案 1 :(得分:0)
编辑html,使用
<input type="button" id="start" value="Add Bank" onClick="setMessage()">
代替<input type="button" id="start" value="Add Bank">
还在表单中添加<input type="hidden" id="token" value="Token value">
以传递令牌值。
在javascript方法中:
<script>
function setMessage() {
var iavToken = document.getElementById("token").value;
alert(iavToken)
dwolla.configure('uat');
dwolla.iav.start('iavContainer', iavToken, function(err, res) {
console.log('Error: ' + JSON.stringify(err) + ' -- Response: ' + JSON.stringify(res));
});
}
</script>
接下来使用以下目标c。
调用javascript函数NSString * jsCallBack = [NSString stringWithFormat:@"setMessage()"];
[webView stringByEvaluatingJavaScriptFromString:jsCallBack];
P.S:您需要在html中添加<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
(或者如果你有js文件在本地添加它。)以使用js。
答案 2 :(得分:0)
您可能应该使用WKWebView
(这是在iOS
中将Web内容加载到Web视图中的新方法,因为它使用WebKit并具有很多改进,例如比WebView更好的内存分配)。
在iOS的快速文件WebviewBridging.swift
中,您可能会遇到类似的情况
import UIKit
import WebKit
class WebviewBridging: UIViewController, WKNavigationDelegate {
var webView: WKWebView?
override func viewDidLoad() {
super.viewDidLoad()
// Create a WKWebView instance
webView = WKWebView (frame: self.view.frame, configuration: webConfig)
view.addSubview(webView!)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let url = Bundle.main.url(forResource: "index", withExtension: "html")!
webView!.loadFileURL(url, allowingReadAccessTo: url)
}
func callJSFunctionFromSwift(){
webView!.evaluateJavaScript("changeBackgroundColor('red')", completionHandler: nil)
}
}
在iOS项目文件夹中的index.html
文件中,您可能会看到类似的内容
<html>
<head>
</head>
<body>
<script>
function changeBackgroundColor(colorText) {
document.body.style.background = colorText;
}
</script>
</body>
</html>
每当您迅速调用callJSFunctionFromSwift()时,它将通过XPC通信与WKWebView进行通信,并评估将触发index.html中的javascript函数的javascript代码。