禁用UIWebView中的用户选择

时间:2011-05-13 16:48:46

标签: ios uiwebview webkit ios4 mobile-webkit

我有一个应用程序,我将内容加载到UIWebView并显示此内容。我无法完全禁用用户交互,因为我希望用户能够单击链接。我只需要禁用用户选择。我在互联网中找到了你可以使用的地方:

document.body.style.webkitUserSelect='none';

我尝试将其插入

[self.contentView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitUserSelect='none';"]; 
webViewDidFinishLoad:

中的

然而,它不起作用。我仍然可以在WebView中选择和复制文本。

任何想法可能出错?

更新:这似乎只从iOS 4.3开始

11 个答案:

答案 0 :(得分:273)

以下是禁用选择的几种方法:

将以下内容添加到您的移动网络文档

<style type="text/css">
* {
    -webkit-touch-callout: none;
    -webkit-user-select: none; /* Disable selection/copy in UIWebView */
}
</style>

以编程方式加载以下Javascript代码:

NSString * jsCallBack = @"window.getSelection().removeAllRanges();";    
[webView stringByEvaluatingJavaScriptFromString:jsCallBack];

禁用复制/粘贴用户菜单:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{    
    if (action == @selector(copy:) ||
        action == @selector(paste:)||
        action == @selector(cut:)) 
    {
        return _copyCutAndPasteEnabled;
    }
    return [super canPerformAction:action withSender:sender];
}

答案 1 :(得分:102)

我可以确认以下代码适用于iOS 5.0 - 8.0。

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    // Disable user selection
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
    // Disable callout
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}

也适用于iOS 9及更高版本。这是快速的代码:

func webViewDidFinishLoad(webView: UIWebView) {
    // Disable user selection
    webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitUserSelect='none'")!
    // Disable callout
    webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitTouchCallout='none'")!
}

答案 2 :(得分:23)

我在Android / iPhone的Web应用程序中使用此技术(与Trigger.IO一起打包),发现它只适用于:not()伪类的链接语法:

*:not(input):not(textarea) {
-webkit-user-select: none; /* disable selection/Copy of UIWebView */
    -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */

}

答案 3 :(得分:18)

我喜欢WrightsCS解决方案,但我会使用它,这样用户仍然可以在输入上使用复制,粘贴和选择操作

<style type="text/css">
*:not(input,textarea) {
    -webkit-touch-callout: none;
    -webkit-user-select: none; /* Disable selection/Copy of UIWebView */
}
</style>

答案 4 :(得分:9)

我不确定设置是如何完成的,但是为什么不在调用viewWillDisappear时清除pasteBoard。也许就像你的appDelegate.m:

[UIPasteboard generalPasteboard].string = nil;

这将确保用户可能复制的任何数据,他们将无法将其粘贴到应用程序之外。

此外,与Engin一样,您可以覆盖包含uiwebview的控制器类中的canPerformSelector方法。

答案 5 :(得分:7)

T Poschel答案是正确的但在我的情况下,顺序很重要。

// this works - locks selection and callout
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}

// this doesn't work - locks only callout
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
}

答案 6 :(得分:5)

我可以确认这一定对您有用。

<style type="text/css">
  *:not(input):not(textarea) {
   -webkit-user-select: none; /* disable selection/Copy of UIWebView */
   -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */
   }       
</style>

如果您想要仅禁用锚点按钮标记,请使用此功能。

    a {-webkit-user-select: none; /* disable selection/Copy of UIWebView */
   -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */
     }

答案 7 :(得分:4)

给出的第一个解决方案对我来说非常合适......直到我将.pdf加载到我的UIWebView中。

加载.doc文件工作得很好,但加载.pdf会导致以下代码行不再具有所需的效果,并且用户长时间触摸时会再次弹出复制/定义菜单。

    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];

经过另一次头发拉动之后,我在Johnny Rockex找到了这个答案,它就像一个冠军。 UIWebView without Copy/Paste when displaying PDF files

非常感谢他这个易于实施,天才的解决方案!!

答案 8 :(得分:3)

    let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: nil, action: nil)
    longPress.minimumPressDuration = 0.2
    webView.addGestureRecognizer(longPress)

只需将此代码添加到viewDidLoad()即可。用户可以单击链接但无法复制内容。

答案 9 :(得分:2)

对我来说,我打算去拍摄图片&#39;来自NSData UIWebView的{​​{1}}。

但放大镜和复制/粘贴/剪切总是在我的func执行之前发生。

我发现了这个:  enter image description here

这意味着,放大镜和复制/粘贴/剪切需要0.5秒来执行,所以如果你的func可以在0.49秒内执行,那就完成了!

LongPressGesture

答案 10 :(得分:-4)

使用网络视图交互功能

   webView.userInteractionEnabled = false

它对我有用

PS:请记住,当您希望用户再次与webview进行交互时,可以恢复交互