我在我的OSX应用程序中加载WebView
,并希望在用户点击WebView
中的元素时在我的应用中收到通知。 (WebView
正在加载一个属于我的Web应用程序的网页。)
这可能吗?
我可以想出一种方法(调查在click
事件中设置的javascript值),但我希望有更明智的方法!
答案 0 :(得分:5)
由于网页是您的网络应用程序,因此我假设您可以控制HTML。
使用WebScript。
这是一个小小的演示:
目标-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>
答案 1 :(得分:1)
我认为这种委托方法应该是有用的。 从WebView打开一个链接会调用这个方法,这样你就可以弄清楚如何处理它。
- (void)webView:(WebView *)sender
decidePolicyForNavigationAction:(NSDictionary *)actionInformation
request:(NSURLRequest *)request frame:(WebFrame *)frame
decisionListener:(id<WebPolicyDecisionListener>)listener
或者您可以收听WebView框架更改网址:
- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
答案 2 :(得分:1)
子类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
然后通过监视鼠标在元素委托方法上,您可以跟踪单击的元素。
答案 3 :(得分:0)
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];
}