输入时出现WebView错误声音(Swift,Cocoa)

时间:2017-07-23 11:34:21

标签: html swift cocoa webview

我最近创建了一个简单的macOS应用程序,在 WebKit WebView (新的, not legacy )中从一个包中加载一个html页面,但我注意到当我在页面中键入一些键(不在输入框中,我的意思是使用javascript 处理 body keypress),播放错误声音。我想知道是否有解决这个问题的方法。

我也可以说html页面完美无缺如果我用Safari打开它并且内置检查器控制台没有错误以及没有播放错误声音(这可能会告诉我们)我们这个问题伴随着我在应用程序中遗漏的东西。)

这是我的Swift代码(App Delegate显然):

@IBOutlet weak var contentView: WebView!

func applicationDidFinishLaunching(_ aNotification: Notification) {

    let path = Bundle.main.path(forResource: "index", ofType: "html", inDirectory: "HTML_Content")
    let url = URL(fileURLWithPath: path!)
    let request = URLRequest(url: url)
    contentView.mainFrame.load(request)

}

我的HTML代码(效果很好)[index.html]:

<!DOCTYPE html>
<html>
    <head>
        <script type="text/javascript" src="js/jquery-1.12.0.js"></script>
        <script type="text/javascript" src="js/main.js"></script>
    </head>
    <body>
        <h2 id="text"></h2>
    </body>
</html>

我的JavaScript / jQuery代码[js / main.js]:

$(document).keypress(function(e) {

        var text = $('#text').text();

        if (e.which == 8) {
            if (text.length != 0) {
                text = text.slice(0, -1);
                $('#text').text(text);
            }
        } else if ('abcdefghijklmnopqrstuvwxyz1234567890 '.indexOf(
                    String.fromCharCode(e.which).toLowerCase()) != -1) {

            $('#text').text(text + String.fromCharCode(e.which));

        }

});

有人可以帮我解决吗?

1 个答案:

答案 0 :(得分:1)

我终于理解为什么应用程序给我错误声音了:

WebView 需要对其内容执行等效的密钥

默认情况下实际上无法执行此操作但是强制它使用带有此覆盖的自定义类,不包括快捷键(或者我无法使用使用它们):

Swift 4:

import WebKit

class WebViewController: WebView {

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        // Drawing code here.
    }

    override func performKeyEquivalent(with event: NSEvent) -> Bool {
        if event.modifierFlags.contains(.command) ||
           event.modifierFlags.contains(.control) ||
           event.modifierFlags.contains(.shift)   ||
           event.modifierFlags.contains(.option)  {
            return false
        }
        return true
    }

}

然后我使用元素检查器的自定义类属性将自定义类连接到 xib元素

enter image description here

最后,声音消失了。