我在我的OSX应用程序中加载WebView
,并希望在用户单击WebView
中的某个元素时在我的应用中收到通知。 (WebView
正在加载一个属于我的web应用程序的网页。)我的Cocoa应用程序如何在WebView中通知onClick事件?
这可能吗?
我可以想办法做到这一点(轮询一个在click
事件上设置的javascript值),但我希望有一个更明智的方法!
我在我的OSX应用程序中加载WebView
,并希望在用户单击WebView
中的某个元素时在我的应用中收到通知。 (WebView
正在加载一个属于我的web应用程序的网页。)我的Cocoa应用程序如何在WebView中通知onClick事件?
这可能吗?
我可以想办法做到这一点(轮询一个在click
事件上设置的javascript值),但我希望有一个更明智的方法!
我认为这个委托方法应该是有用的。 从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
由于网页是你的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和抓老鼠下来这实际上是一个WebHTMLView web视图事件:
@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
然后通过监视鼠标悬停在元素委托方法上,您可以跟踪哪个元素被点击。
看起来很有希望,我会看看它。你知道这是否适用于不适用于导航到另一个页面的锚点单击事件(即使用JavaScript处理)?我想知道是否只是通过改变'window.location'触发。 – nfm 2011-05-22 03:02:47
该死的,这个委托方法只被调用导航事件 - 不是用JavaScript处理锚点的点击。 – nfm 2011-05-24 03:52:40
是的,如果你想这样做,你应该考虑检查JavascriptCore。您可以在Obj-C中创建自己的JavaScript函数,然后从WebView中调用它。 – 2011-05-24 22:33:12