2009-12-10 11 views
5

¿Es posible deshabilitar toda la interacción del usuario con un WebView, además de desplazarse? Quiero que el usuario pueda ver la página (y posiblemente seleccionar cosas), pero no hacer clic en los enlaces/campos de formulario de clic derecho/actualizar/enfocar/desencadenar eventos de UI DOM (onclick, etc.).Deshabilitar WebKit WebView

Veo en this question Puedo deshabilitar el clic derecho y la selección, pero eso no ayuda con los elementos del formulario y la navegación enviando eventos DOM.

+0

Cuando se desea "desactivar toda la interacción del usuario", ¿es suficiente para la vista web ignorar simplemente haciendo clic en un vínculo de navegación ¿y así? ¿O realmente quiere que el cursor no cambie al pasar el ratón sobre el enlace también? Si el primero es correcto, implemente los métodos apropiados de delegado de WebView para ignorar los intentos de navegación. –

+0

El problema con las páginas web modernas es que todo tipo de cosas se pueden modificar con clics, no solo con seguir enlaces. De hecho, quiero desactivar la interacción del usuario con la página, excepto para verla. –

Respuesta

6

Podría subclase NSWindow y establecer su subclase como la ventana de WebView. A continuación, puede controlar qué eventos se envían a WebView detectando qué tipo de control se ve afectado por el evento del mouse.

Esto es bastante fuerza bruta, pero se desactivará totalmente cualquier eventos de ratón, incluyendo vuelcos etc:

@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

Creo que esto puede funcionar. Voy a darle una oportunidad. –

+0

Sí, esto es todo. Dejé NSScrollWheel para que el usuario pueda desplazarse por la página, lo que introduce un comportamiento extraño al cambiar el cursor, pero de lo contrario, esto hace exactamente lo que necesito. ¡Muchas gracias! –

+0

Siempre se puede agregar un conjunto '[[NSCursor arrowCursor] set];' justo antes de la declaración 'return;' para que tan pronto como el mouse se mueva, el cursor se restablezca. –

0

Una opción (no es realmente la mejor ...) sería envolver WebView dentro de un ScrollView que usted mismo crea, y luego desactivar por completo la interacción del usuario con la vista web. Imagino que ajustaría el marco de la vista web para que toda la página estuviera visible y luego la convertiría en la vista de contenido de una vista de desplazamiento.

También es posible que pueda subclasificar WebView e interceptar clics para rechazar ciertas acciones, pero no tengo ninguna experiencia con esto, y me imagino que sería difícil diferenciar algunas acciones, como la selección, de otras (especialmente el menú contextual).

Espero que ayude - ¡buena suerte!

0

Probablemente podría hacer esto a través de javascript (iterar a través de todos los enlaces, formularios, etc.) en la página y desactivarlos, utilizando - [UIWebView stringByEvaluatingJavaScriptFromString:].

+0

Lamentablemente, esto no es viable para mí, ya que estoy siguiendo los enlaces, pero a través de la interfaz DOM de Webkit Obj-C no la interacción del usuario. –

+0

bien, podría establecer el userInteractionEnabled en falso mientras se está cargando, luego, una vez que esté cargado, ejecute un script para deshabilitar todo y active su interacción con el usuario. –

Cuestiones relacionadas