OSX上的Swift:WebView stringByEvaluatingJavaScriptFromString不起作用

时间:2016-01-23 19:31:01

标签: javascript xcode swift macos webview

这是我多年来作为网络开发人员尝试使用Xcode和Swift(最新)编写OSX应用程序的第一个问题。

我尝试做的是在网页上执行JavaScript,我正在加载Webkit / WebView。 我尝试了很多方法(互联网上有很多答案 - 主要是针对iOS)但是对于OSX + Swift + WebView(不是UIWebview或WkWebView)来说很少。

我的最新方法是ViewController.swift:

import Cocoa
import WebKit

class ViewController: NSViewController, WebFrameLoadDelegate {
    var myWebView:WebView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        myWebView = WebView(frame: self.view.frame)
        myWebView.frameLoadDelegate = self

        //Load URL
        let url = NSURL(string: "http://google.com");
        let request = NSURLRequest(URL: url!);

        myWebView.mainFrame.loadRequest(request)
        self.view.addSubview(myWebView)

        //Insert JS
        myWebView.stringByEvaluatingJavaScriptFromString("alert('test');");

        let script = "document";
        if let returnedString = myWebView.stringByEvaluatingJavaScriptFromString(script) {
            print("the result is \(returnedString)");
        }

    }

   /*
    * Page ready 
    */

    func webViewDidFinishLoad(myWebView : WebView) {
        print("WvFinished")
    }

    func webViewDidStartLoad(myWebView : WebView) {
        print("WvStarted")
    }

}

JS-Alert和html文档的返回都不起作用。

PS:" webViewDidFinishLoad"也不是" webViewDidStartLoad"似乎已被执行。

我真的很感激任何帮助。我想我几乎在整个网络上搜索了所有提示 - 但没有任何方法可以帮助我。

提前谢谢!

最好,

亚历

2 个答案:

答案 0 :(得分:0)

关于myWebView.windowScriptObject.evaluateWebScript("alert('test'‌);");,您还应执行此操作webView(_:runJavaScriptAlertPanelWithMessage:initiatedBy:),然后您可以打印message,您将收到提醒信息。如果你想弹出警告框,你需要自己动手。

答案 1 :(得分:0)

快捷键4 WebView已过时。请改用WebKit

import WebKit
//---

let webConfiguration = WKWebViewConfiguration()
let preferences = WKPreferences()
preferences.javaScriptEnabled = true

webConfiguration.preferences = preferences

webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.translatesAutoresizingMaskIntoConstraints = false

self.webView.evaluateJavaScript("document.getElementById('name').value='\(self.nameTextField.text)';", completionHandler:{ [weak self] _, error in
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
        if error != nil {
            // Do something
            return
        }
    }
})