Swift on OSX: WebView stringByEvaluatingJavaScriptFromString

Swift on OSX: WebView stringByEvaluatingJavaScriptFromString doesn't work

本文关键字:WebView stringByEvaluatingJavaScriptFromString OSX on Swift      更新时间:2023-09-26
这是我在这里

的第一个问题,因为我多年来一直试图使用Xcode和Swift(最新)编写OSX应用程序。

正在尝试做的是在我用Webkit/WebView加载的网页上执行JavaScript。我尝试了很多方法(互联网上充满了答案 - 主要是针对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"。

我真的很感激任何帮助。我想我几乎已经在整个网络上搜索了所有提示 - 但没有任何效果。

提前谢谢你!

最好

亚历克斯

关于myWebView.windowScriptObject.evaluateWebScript("alert('test'‌);");,你也应该这样做webView(_:runJavaScriptAlertPanelWithMessage:initiatedBy:),然后你可以打印message,你会得到警报的消息。如果你想弹出一个警报框,你需要自己做。

Swift 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
        }
    }
})