【问题标题】:WKWebview: Disable interaction and clicks on linksWKWebview:禁用交互和点击链接
【发布时间】:2017-04-12 10:26:09
【问题描述】:

有没有办法在 webview 上禁用交互? 这样用户就不能比加载的 webview 更进一步?

编辑: 禁用 UserInteractions 不是解决方案,因为网站仍然必须是可滚动的。

【问题讨论】:

标签: ios objective-c wkwebview


【解决方案1】:

实现WKNavigationDelegate 协议:

@interface ViewController () <WKNavigationDelegate>

设置您的WKWebViewnavigationDelegate 属性:

self.wkWebView.navigationDelegate = self;

然后为您要限制的 URL 实施策略:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {

    if ([navigationAction.request.URL.absoluteString containsString:@"somedomain.com/url/here"]) {
        decisionHandler(WKNavigationActionPolicyAllow);
    }
    else {
        decisionHandler(WKNavigationActionPolicyCancel);
    }
}

【讨论】:

  • 这里的问题是,当我得到一个像 google.com 这样的 url 时,它不应该打开 google.com/"something" 它不适用于 containsString,但由于滚动,我无法禁用 userInteractions。
  • 在这种情况下,您可以使用 isEqualToString 或其他一些比较。
【解决方案2】:

WKNavigationDelegate 解决方案只会阻止用户点击链接。我也有我想阻止交互的表单控件,同时仍然允许滚动页面。最终我发现这可以通过禁用 web 视图的滚动视图的子视图来实现:

斯威夫特

self.webView.scrollView.subviews.forEach { $0.isUserInteractionEnabled = false }

Objective-C

for (UIView *subview in self.webView.scrollView.subviews)
{
    subview.userInteractionEnabled = NO;
}

【讨论】:

  • VinneyCoyne 的回答仍然允许显示菜单.. 但阻止与它的交互。但是这个答案是完美的。除了滚动 webview 之外没有交互,这是我想要的。谢谢!
  • 我正面临这个错误Value of type 'WKWebView' has no member 'scrollView'
  • @KrunalNagvadia 这很奇怪,它是该类的可公开访问的字段(请参阅developer.apple.com/documentation/webkit/wkwebview/…)。我假设您没有无意中定义了另一个名为WKWebView 的类型?也许是一些 Xcode 问题,可以通过重新启动来解决?
【解决方案3】:

首先,您必须将代理交给您的 webkit,然后添加以下代码。 斯威夫特 5.0

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
    Activity.stopAnimating()
    let javascriptStyle = "var css = '*{-webkit-touch-callout:none;-webkit-user-select:none}'; var head = document.head || document.getElementsByTagName('head')[0]; var style = document.createElement('style'); style.type = 'text/css'; style.appendChild(document.createTextNode(css)); head.appendChild(style);"
    webView.evaluateJavaScript(javascriptStyle, completionHandler: nil)
}

这段代码将做什么,我们以编程方式添加 css 将禁用 webview 中的交互

【讨论】:

    【解决方案4】:

    这些 javascript 行将通过覆盖 HTML 来禁用长按和链接触摸。嵌入的 youtube 视频等基于帧的内容仍然可以使用。

    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        webView.evaluateJavaScript("document.documentElement.style.webkitUserSelect='none'")
        webView.evaluateJavaScript("document.documentElement.style.webkitTouchCallout='none'")
        webView.evaluateJavaScript("var elems = document.getElementsByTagName('a'); for (var i = 0; i < elems.length; i++) { elems[i]['href'] = 'javascript:(void)'; }")
    }
    

    【讨论】:

      【解决方案5】:

      您可以按照以下方式进行。

      //-----------------------------------------------------------------------
      
      #pragma mark - UIWebView Methods
      
      //-----------------------------------------------------------------------
      
      - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
      
      
      
          return YES;
      }
      
      //----------------------------------------------------------------
      
      - (void)webViewDidStartLoad:(UIWebView *)webView {
      //disable user interaction 
      }
      
      //----------------------------------------------------------------
      
      - (void)webViewDidFinishLoad:(UIWebView *)webView{
      //enable user interaction
      }
      
      //----------------------------------------------------------------
      
      - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error{
          //enable user interaction
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-25
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        • 1970-01-01
        • 2011-09-19
        相关资源
        最近更新 更多