繁体   English   中英

如何在WebView中通知我的Cocoa应用程序onClick事件?

[英]How can my Cocoa application be notified of onClick events in a WebView?

我正在我的OSX应用程序中加载WebView ,并希望在用户单击WebView的元素时在我的应用程序中收到通知。 WebView正在加载一个属于我的Web应用程序的网页。)

这可能吗?

我可以想出一种方法(调查在click事件上设置的javascript值),但我希望有一种更明智的方法!

由于网页是您的Web应用程序,因此我假设您可以控制html。

使用WebScript

这是一个小小的演示:

Objective-C的:

- (void)windowDidLoad{
    [[webView windowScriptObject] setValue:self forKey:@"objcConnector"];
    ....
}
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)aSelector{
    if (aSelector == @selector(elementClicked:)) return NO;
    return YES;
}
-(void)elementClicked:(id)object{
    //object is the id of the element
}

HTML:

<button id="example" onClick="window.objcConnector.elementClicked_(this.id)">Click me</button>

子类NSWindow并在WebView上捕获鼠标按下事件,这实际上是一个WebHTMLView:

@interface MyWindow : NSWindow
@end

@implementation MyWindow

- (void)sendEvent:(NSEvent *)event
{

    if ([event type] == NSLeftMouseDown || [event type] == NSRightMouseDown)
    {
        NSView *deepView = [[self contentView] hitTest:[event locationInWindow]];
        if([[deepView className] isEqualToString:@"WebHTMLView"]){
            return;
        }
    }
    [super sendEvent:event];

}

@end

然后通过监视鼠标在元素委托方法上,您可以跟踪单击了哪个元素。

我认为这种委托方法应该是有用的。 从WebView打开一个链接会调用此方法,因此您可以弄清楚如何处理它。

- (void)webView:(WebView *)sender
        decidePolicyForNavigationAction:(NSDictionary *)actionInformation
        request:(NSURLRequest *)request frame:(WebFrame *)frame
        decisionListener:(id<WebPolicyDecisionListener>)listener

或者您可以收听WebView框架更改URL:

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame 

Malhal的解决方案在Mac OS中对我不起作用。 Mac OS中的WebView很奇怪,而且wkWebView不完整。

将第一个响应者设置为webView后,这个响应者做了:

- (void)sendEvent:(NSEvent *)event
{

if ([event type] == NSLeftMouseDown || [event type] == NSRightMouseDown)
{

    if([[self.firstResponder className] isEqualToString:@"WebHTMLView"])
    {
        NSLog(@"MouseDown at: %f, %f",event.locationInWindow.x,event.locationInWindow.y);
        return;
    }
}
[super sendEvent:event];

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM