【问题标题】:Disable a WebKit WebView禁用 WebKit WebView
【发布时间】:2010-12-25 02:20:41
【问题描述】:

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

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

【问题讨论】:

  • 当您希望“禁用所有用户交互”时,webview 是否足以忽略单击导航链接等?或者您是否真的希望光标在悬停在链接上时也不会改变?如果前者没问题,请实现适当的 WebView 委托方法以忽略导航尝试。
  • 现代网页的问题在于,各种东西都可以通过点击来改变,而不仅仅是链接跟踪。我实际上想禁用用户与页面的交互,除了查看它。

标签: cocoa webkit webview


【解决方案1】:

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

您也可以将 WebView 子类化并拦截点击以拒绝某些操作,但我对此没有任何经验,我想很难将某些操作(例如选择)与其他操作区分开来(尤其是上下文菜单)。

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

【讨论】:

    【解决方案2】:

    您可以通过页面上的 javascript(遍历所有链接、表单等)执行此操作并使用 -[UIWebView stringByEvaluatingJavaScriptFromString:] 停用它们。

    【讨论】:

    • 不幸的是,这对我来说不可行,因为我正在关注链接,而是通过 Webkit Obj-C DOM 界面而不是用户交互。
    • 好吧,您可以在加载时将 userInteractionEnabled 设置为 false,然后在加载后运行脚本以禁用所有内容并将其 userinteraction 设置为 on。
    【解决方案3】:

    您可以继承 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
    

    【讨论】:

    • 是的,就是这样。我省略了 NSScrollWheel 以便用户仍然可以在页面上滚动,这会在更改光标时引入一些奇怪的行为,但否则这正是我所需要的。非常感谢!
    • 您总是可以在return; 语句之前添加一个[[NSCursor arrowCursor] set];,这样只要鼠标移动光标就会重置。
    • 这对于除键盘按键之外的所有内容都非常有效(我见过的最佳答案)。如果 WebView 在该页面上,我仍然可以在 Google 搜索框中输入并使用返回键进行搜索。我已经尝试为 NSKeyDown 和 NSKeyUp 添加案例。有人知道如何调整吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2013-06-20
    • 1970-01-01
    相关资源
    最近更新 更多