激活WebView键盘事件
我在一个简单/普通的 NSWindow 中有一个 webview。
当我在 WebView 中加载一个网址(例如“http://google.com”)时,我无法与文本字段进行交互,选择所有字符(cmd+a)、剪切/粘贴(cmd+cv)等。
如何激活默认浏览器行为? 我的 mac 发出经典的 NSBeep() 代替。
我尝试添加 UIDelegate wich 调用,
- (BOOL)webView:(WebView *)webView shouldPerformAction:(SEL)action fromSender:(id)sender`
但该操作从未被调用。
I have a webview inside a simple/plain NSWindow.
When i load a url inside the WebView like "http://google.com" i can't interact with textfield selecting all characters (cmd+a), cutting/pasting (cmd+cv) and so on.
How can i activate the default browser behaviors?
My mac emit the classic NSBeep() instead.
I tried adding a UIDelegate wich call
- (BOOL)webView:(WebView *)webView shouldPerformAction:(SEL)action fromSender:(id)sender`
but the action is never called.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您必须对 WebView 或视图层次结构中上面的任何视图进行子类化,其中您的 WebView 是子视图并重写 NSView 的 NSResponder 方法;
特别是acceptFirstResponder: 和canBecomeFirstResponder:。然后实现 keyUp: 或 keyDown: 或您感兴趣的 NSResponder 的任何事件方法。
这至少应该省略 NSBeep。
为了拦截 WebView 内部更深处的事件(用于剪切/粘贴等),WebView 本身还提供了一些方法来重写,尽管我认为必须采取额外的步骤来相应地拦截事件。抱歉在这里含糊其辞。
您提到的 webView:shouldPerformAction:fromSender 并不是您所期望的那样。 WebUIDelegate 协议表示此方法“返回一个布尔值,指示是否应执行指定对象发送的操作。” - 但是 WebUIDelegationProtocol 方法将仅“作为处理 JavaScript 或其他插件内容的结果而调用”。这意味着 shouldPerformAction: 仅在由网站本身(JS 或插件)触发时才会被调用,而在 NSResponder 事件发生时则不会被调用。
You have to subclass WebView or any view above in the view hierarchy, where your WebView is a subview and override the NSResponder methods of NSView;
in particular acceptFirstResponder: and canBecomeFirstResponder:. Then implement the keyUp: or keyDown: or whatever event method of NSResponder you're interested in.
This should at least omit the NSBeep.
To intercept events deeper inside WebView (for cut/paste/etc), WebView itself also provides a couple of methods to override, though I think there must be additional steps taken to intercept events accordingly. Sorry for being vague here.
The webView:shouldPerformAction:fromSender you mention is not what you'd expect it to be. The WebUIDelegate Protocol says that this method "Returns a Boolean value that indicates whether the action sent by the specified object should be performed." - But the WebUIDelegationProtocol methods will only be "invoked as a result of handling JavaScript or other plug-in content". That means shouldPerformAction: will only be called if triggered by the website itself (JS or plugins) and not if an NSResponder Event occurs.