WKWebview:禁用交互和点击链接
WKWebview: Disable interaction and clicks on links
有没有办法禁用 webview 上的交互?
这样用户就不能比加载的 webview 更进一步?
编辑:
禁用 UserInteractions 不是解决方案,因为网站仍然必须是可滚动的。
您可以按照下面的方式进行。
//-----------------------------------------------------------------------
#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
}
实施 WKNavigationDelegate
协议:
@interface ViewController () <WKNavigationDelegate>
设置你的 WKWebView
的 navigationDelegate
属性:
self.wkWebView.navigationDelegate = self;
然后为您要限制的 URL(s) 实施政策:
- (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);
}
}
这些 javascript 行将通过覆盖 HTML 禁用长按和 link 触摸。基于框架的内容(例如嵌入式 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)'; }")
}
WKNavigationDelegate
解决方案仅阻止用户访问链接。我也有我想阻止交互的表单控件,同时仍允许滚动页面。最终我发现这可以通过禁用 web 视图的滚动视图的子视图来实现:
Swift
self.webView.scrollView.subviews.forEach { [=10=].isUserInteractionEnabled = false }
Objective-C
for (UIView *subview in self.webView.scrollView.subviews)
{
subview.userInteractionEnabled = NO;
}
首先,您必须将委托提供给您的 webkit,然后添加以下代码。
Swift5.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 中的交互
有没有办法禁用 webview 上的交互? 这样用户就不能比加载的 webview 更进一步?
编辑: 禁用 UserInteractions 不是解决方案,因为网站仍然必须是可滚动的。
您可以按照下面的方式进行。
//-----------------------------------------------------------------------
#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
}
实施 WKNavigationDelegate
协议:
@interface ViewController () <WKNavigationDelegate>
设置你的 WKWebView
的 navigationDelegate
属性:
self.wkWebView.navigationDelegate = self;
然后为您要限制的 URL(s) 实施政策:
- (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);
}
}
这些 javascript 行将通过覆盖 HTML 禁用长按和 link 触摸。基于框架的内容(例如嵌入式 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)'; }")
}
WKNavigationDelegate
解决方案仅阻止用户访问链接。我也有我想阻止交互的表单控件,同时仍允许滚动页面。最终我发现这可以通过禁用 web 视图的滚动视图的子视图来实现:
Swift
self.webView.scrollView.subviews.forEach { [=10=].isUserInteractionEnabled = false }
Objective-C
for (UIView *subview in self.webView.scrollView.subviews)
{
subview.userInteractionEnabled = NO;
}
首先,您必须将委托提供给您的 webkit,然后添加以下代码。 Swift5.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 中的交互