我必须从以下HTML页面检索所有值,例如data0,data1,data2等,
self.Generatebtn.clicked.connect(self.setImage)
def setImage(self):
# ...
self.centralwidget.setObjectName("centralwidget")
#find a way to clear the widget here
self.viewer = QtSvg.QSvgWidget()
self.viewer.load('C:/Windows/Temp/tubesheetsvgpreview.svg')
self.viewer.setGeometry(QtCore.QRect(20,275,600,600))
lay = QtWidgets.QVBoxLayout(self.centralwidget)
lay.addWidget(self.viewer, alignment=QtCore.Qt.AlignCenter) # <---
MainWindow.setCentralWidget(self.centralwidget)
我正在使用以下快速代码来检索Form内的所有值,
</head><body onload="OnLoadEvent();">
<form name="form1" action="https://products.cs.co.in/demo/jsp/cs/HResult.jsp" method="post">
<input type="hidden" name="data0" value="7320851">
<input type="hidden" name="data1" value="449781">
<input type="hidden" name="data2" value="">
<input type="hidden" name="data3" value="ACEE6F7C7">
<input type="hidden" name="data4" value="">
<input type="hidden" name="ref" value="">
<input type="hidden" name="data5">
<input type="hidden" name="result" value="">
<input type="hidden" name="data6" value="">
</form>
<div align="center" class="text12">
<br><br>
Please do not refresh / close the window
<br><br>
</div>
</body>)
但是我从结果变量中收到零。请提供有关如何使用SWIFT语言检索表单内所有值的帮助。
答案 0 :(得分:0)
该表单没有值,您必须从子input
元素中检索它。
同样不是getElementsByName
返回NodeList
而不是单个元素。
val values = {};
Array.from(document.getElementsByName("form1")[0].children).forEach(input => {
values[input.getAttribute("name")] = input.value;
});
答案 1 :(得分:0)
您需要在HTML文件中添加一个javascript方法,该方法将在您的swift代码中传递表单值。您可以使用WKScriptMessageHandler进行此操作。
在HTML文件中,添加以下代码。我将其命名为 index.html 并放置在应用程序本地。
<head>
<script type="text/javascript">
function OnLoadEvent() {
var test = document.getElementsByName("form1")[0].children
var values = {};
Array.from(test).forEach(input => {
values[input.getAttribute("name")] = input.value;
});
window.webkit.messageHandlers.myApp.postMessage({values});
}
</script>
</head>
window.webkit.messageHandlers.myApp.postMessage({values});会将价值从javascript发送到swift。 myApp 是我在快速代码中添加的处理程序的名称。
这里是快速代码
class ViewController: UIViewController, WKScriptMessageHandler {
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
let body = message.body
if let dict = body as? Dictionary<String, AnyObject> {
let formData = dict["values"] as! [String: AnyObject]
for (fieldName, fieldValue) in formData {
print("fieldName: \(fieldName) fieldValue: \(fieldValue)")
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
let config = WKWebViewConfiguration()
config.userContentController.add(self, name: "myApp")
let wkWebView = WKWebView(frame: self.view.frame, configuration: config)
let url = Bundle.main.url(forResource: "index", withExtension: "html")!
wkWebView.loadFileURL(url, allowingReadAccessTo: url)
let request = URLRequest(url: url)
wkWebView.load(request)
self.view.addSubview(wkWebView)
}
}
答案 2 :(得分:0)
我使用以下代码获取所有表单值。效果很好。
let jsCode = "" + "function parseForm(form){" +
"var values='';" +
"console.log('RESULT 1='+form.elements);" +
"for(var i=0 ; i< form.elements.length; i++){" +
" values+=form.elements[i].name+'='+form.elements[i].value+'&'" +
"}" +
"return [values]" +
" }" +
"for(var i=0 ; i< document.forms.length ; i++){" +
" parseForm(document.forms[i]);" +
"};"
webView.evaluateJavaScript(jsCode, completionHandler: { (result, error) in
print(result as Any)
print(error as Any)
guard let resultArray = result as? [AnyObject] else { return }
})