【问题标题】:mouseDown: not firing in WebView subclassmouseDown:不在 WebView 子类中触发
【发布时间】:2011-07-17 12:15:26
【问题描述】:

我认为这应该很简单,但我无法让它工作。

我想检测 WebView 上的鼠标点击...

我已经将 WebView 子类化了,这里是代码

#import <AppKit/AppKit.h>
#import <Foundation/Foundation.h>
#import <WebKit/WebKit.h>

@interface ResultsWebView : WebView {
}
@end

#import "ResultsWebView.h"

@implementation ResultsWebView

- (void)mouseDown:(NSEvent *)theEvent {
    NSLog(@"%@", theEvent);
}

@end

在我的 xib 文件中,我添加了一个 WebView,然后将类更改为 ResultsWebView。

我在运行时检查过,对象是 ResultsWebView,但从未调用过 mouseDown 事件...

我错过了什么?

【问题讨论】:

    标签: objective-c cocoa macos


    【解决方案1】:

    也许这会有所帮助:

    [window setAcceptsMouseMovedEvents:YES];
    

    【讨论】:

    • 不,它没有...我将它添加到 applicationDidFinishLaunching: 应用程序委托方法,但它没有改变任何东西。但无论如何谢谢
    【解决方案2】:

    问题是消息没有发送到 WebView。相反,它被发送到 WebView 中的私有 WebHTMLView,它实际处理鼠标事件。

    http://trac.webkit.org/browser/trunk/Source/WebKit/mac/WebView/WebHTMLView.mm#L3555

    您可能只想研究在 WebView 中使用 javascript 将 onmousedown 事件发送回您的 Objective-c 类。

    【讨论】:

    • 另一种方法是覆盖 -hitTest: 并使用它将鼠标按下事件重定向到适合您的自定义视图。
    • 或者另一种类似的选择是简单地创建一个覆盖视图,记录事件并将其转发到您的 webView。
    【解决方案3】:

    WebUIDelegate 前来救援。

    假设你的 NSWindowController 中有一个 WebView 实例:

    WebView *aWebView;
    

    您可以将控制器设置为 UIDelegate,如下所示:

    [aWebView setUIDelegate:self];
    

    在您的控制器中实现以下方法,您将对鼠标单击事件进行控制:

    - (void)webView:(WebView *)sender mouseDidMoveOverElement:
    (NSDictionary *)elementInformation modifierFlags:(NSUInteger)
    modifierFlags
    {
    if ([[NSApp currentEvent] type] == NSLeftMouseUp)
      NSLog(@"mouseDown event occurred");
    }
    

    作为奖励,使用 elementInformation 字典,您可以获得有关发生点击事件的 DOM 元素的其他信息。

    【讨论】:

    • 不错的解决方案!就我而言,我使用 :[[NSApp currentEvent] type] == NSLeftMouseUp && [[NSApp currentEvent] clickCount == 2 ] 来拦截 doubleClick 事件
    猜你喜欢
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多