2009-12-10 43 views
5

除了滚动之外,是否可以禁用与WebView的所有用户交互?我希望用户能够看到页面(并可能选择东西),但不要单击链接/右键单击/刷新/聚焦表单域/触发UI DOM事件(onclick等)。禁用WebKit WebView

我在this question上看到我可以禁用右键单击和选择,但这并不能帮助表单元素和导航发送DOM事件。

+0

当你想“禁止所有用户交互”是不够的的WebView简单地忽略点击导航链接等等?或者你是否真的希望光标在链接上悬停时不要改变?如果前者正常,则实施适当的WebView委托方法以忽略导航尝试。 – 2009-12-10 11:46:57

+0

现代网页的问题是,各种东西都可以通过点击来改变,而不仅仅是链接跟随。我实际上想要禁用用户与页面的交互,除了查看它。 – 2009-12-10 17:06:15

回答

6

您可以继承NSWindow并将您的子类设置为WebView的窗口。然后,您可以通过检测鼠标事件影响哪种控件来控制哪些事件发送到WebView。

这是非常强力,但将完全禁用所有鼠标事件,包括翻车等:

@interface WebViewEventKillingWindow : NSWindow 
{ 
    IBOutlet WebView* myWebView; 
} 
@end 

@implementation WebViewEventKillingWindow 
- (void)sendEvent:(NSEvent*)event 
{ 
    NSView* hitView; 
    switch([event type]) 
    { 
     case NSScrollWheel: 
     case NSLeftMouseDown: 
     case NSLeftMouseUp: 
     case NSLeftMouseDragged: 
     case NSMouseMoved: 
     case NSRightMouseDown: 
     case NSRightMouseUp: 
     case NSRightMouseDragged: 
      hitView = [myWebView hitTest:[event locationInWindow]]; 
      if([hitView isDescendantOf:myWebView] && 
         !([hitView isKindOfClass:[NSScroller class]] || 
          [hitView isKindOfClass:[NSScrollView class]])) 
      { 
       return; 
      } 
      break; 
     default: 
      break; 
    } 
    [super sendEvent:event]; 
} 
@end 
+0

我认为这可能有效。我会放弃它。 – 2009-12-10 17:04:13

+0

是的,这是它。我忽略了NSScrollWheel,这样用户仍然可以在页面上滚动,这会在更改光标时引入一些奇怪的行为,但除此之外,这只是我所需要的。非常感谢! – 2009-12-10 17:17:31

+0

您可以随时在'return;'语句之前添加一个[[NSCursor arrowCursor] set];这样,只要鼠标移动,光标就会重置。 – 2009-12-10 23:51:46

0

一个选项(不是最好的......)是将WebView封装在自己创建的ScrollView中,然后完全禁用所有与Web视图的用户交互。我想你会调整Web视图的框架,以便整个页面可见,然后使其成为滚动视图的内容视图。

您也许可以对WebView进行子类化并拦截点击以拒绝某些操作,但我对此没有任何经验,并且我认为很难区分某些操作(如选择)与其他操作(特别是上下文菜单)。

希望有所帮助 - 祝你好运!

0

你可能可以通过javascript(遍历所有链接,表单等)在页面上做到这一点,并停用它们,使用 - [UIWebView stringByEvaluatingJavaScriptFromString:]。

+0

不幸的是,这对我来说不可行,因为我正在关注链接,但是通过Webkit Obj-C DOM接口而不是用户交互。 – 2009-12-10 17:05:12

+0

好吧,您可以在加载时将userInteractionEnabled设置为false,然后在加载后运行脚本以禁用所有内容并将其用户交互设置为打开。 – 2009-12-10 20:07:43