2009-12-10 3 views
5

Можно ли отключить все взаимодействие с пользователем через WebView, кроме прокрутки? Я хочу, чтобы пользователь мог видеть страницу (и, возможно, выбирать вещи), но не нажимал ссылки/править клик/обновлять/фокусировать поля формы/запускать пользовательские объекты DOM (onclick и т. Д.).Отключить WebKit WebView

Я вижу на this question Я могу отключить правый щелчок и выбор, но это не помогает с элементами формы и навигации, отправляющими события DOM.

+0

Если вы хотите, чтобы «отключить все взаимодействия с пользователем» это достаточно для WebView, чтобы просто игнорировать, нажав навигационную ссылку и так далее? Или вы действительно хотите, чтобы курсор не изменялся при наведении курсора на ссылку? Если первое верно, выполните соответствующие методы делегата WebView, чтобы игнорировать попытки навигации. –

+0

Проблема с современными веб-страницами заключается в том, что всевозможные вещи могут быть изменены с помощью кликов, а не только для ссылки. Я действительно хочу отключить взаимодействие пользователя со страницей, за исключением просмотра. –

ответ

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

Я думаю, что это может сработать. Я отдам его. –

+0

Да, это все. Я оставил NSScrollWheel, чтобы пользователь мог еще прокручивать страницу, что вводит какое-то странное поведение при изменении курсора, но в остальном это делает именно то, что мне нужно. Большое спасибо! –

+0

Вы всегда можете добавить '[[NSCursor arrowCursor] set];' непосредственно перед оператором 'return;', чтобы как только мышь двигалась, курсор сбрасывается. –

0

Один вариант (не самый лучший ...) - это обернуть WebView внутри созданного вами ScrollView, а затем полностью отключить все пользовательское взаимодействие с веб-представлением. Я предполагаю, что вы настроите рамку веб-представления так, чтобы вся страница была видна, а затем сделайте ее вид содержимого прокрутки.

Вы также можете подклассифицировать WebView и перехватывать клики, чтобы отклонить определенные действия, но у меня нет опыта с этим, и я думаю, что было бы трудно отличить некоторые действия, такие как отбор, от других (особенно контекстное меню).

Надеюсь, что это поможет - удачи!

0

Возможно, вы можете сделать это через javascript (итерацию по всем ссылкам, формам и т. Д.) На странице и дезактивировать их, используя - [UIWebView stringByEvaluatingJavaScriptFromString:].

+0

К сожалению, это нежизнеспособно для меня, поскольку я следую ссылкам, но через интерфейс веб-интерфейса Webkit Obj-C не взаимодействует с пользователем. –

+0

ну, вы можете установить userInteractionEnabled в false во время загрузки, затем, после его загрузки, запустите скрипт, чтобы отключить все и включить его userinteraction. –

Смежные вопросы