Desative um WebKit WebView
Pergunta
É possível desativar toda a interação do usuário com um WebView, além de rolar? Quero que o usuário possa ver a página (e possivelmente selecionar as coisas), mas não clique em Links/clique com o botão direito do mouse/atualização/foco Formulário Campos/Trigger UI DOM Eventos (OnClick etc).
Eu vejo essa questão Posso desativar o clique e a seleção do botão direito, mas isso não ajuda com os elementos do formulário e a navegação enviando eventos DOM.
Solução
Você pode subclasse NSWIDOW e definir sua subclasse como a janela da WebView. Você pode controlar quais eventos são enviados para o WebView detectando que tipo de controle está sendo afetado pelo evento do mouse.
Isso é uma força bastante bruta, mas desativará totalmente quaisquer eventos do mouse, incluindo rollovers 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
Outras dicas
Uma opção (não é realmente a melhor ...) seria embrulhar o WebView dentro de uma exibição do ScrollView que você cria e, em seguida, desative toda a interação do usuário com a visualização da Web completamente. Eu imagino que você ajustaria o quadro da Web View para que a página inteira estivesse visível e, em seguida, o tornasse a visualização de conteúdo de uma visualização de rolagem.
Você também pode ser capaz de subclasse WebView e interceptar cliques para rejeitar certas ações, mas não tenho nenhuma experiência com isso, e imagino que seria difícil diferenciar algumas ações, como a seleção, de outros (especialmente o menu contextual ).
Espero que ajude, boa sorte!
Você provavelmente poderia fazer isso via JavaScript (iterar através de todos os links, formulários, etc.) na página e desativá -los, usando -[uiwebview stringbyByEvaluatingjavaScriptFromString:].