使用SWIFT从HTML页面获取值

时间:2019-06-12 08:32:23

标签: javascript swift wkwebview

我必须从以下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语言检索表单内所有值的帮助。

3 个答案:

答案 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 }

    })