UIWebView में उपयोगकर्ता चयन को अक्षम करना


121

मेरे पास एक ऐप है जहां मैं सामग्री को लोड करता हूं UIWebViewऔर इसे प्रस्तुत करता हूं । मैं उपयोगकर्ता इंटरैक्शन को पूरी तरह से अक्षम नहीं कर सकता क्योंकि मैं चाहता हूं कि उपयोगकर्ता लिंक पर क्लिक करने में सक्षम हो। मुझे बस उपयोगकर्ता चयन को अक्षम करने की आवश्यकता है। मैंने कहीं न कहीं उन इंटनेट्स में पाया जिनका आप उपयोग कर सकते हैं:

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

मैंने इसे सम्मिलित करने का प्रयास किया

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

में webViewDidFinishLoad:

हालांकि, यह काम नहीं करता है। मैं अभी भी WebView के अंदर पाठ का चयन और कॉपी करने में सक्षम हूं।

आपके हिसाब से क्या गलत हो सकता है?

अपडेट: यह केवल iOS 4.3 से शुरू होता है

जवाबों:


280

चयन को अक्षम करने के कुछ तरीके यहां दिए गए हैं:

अपने मोबाइल वेब दस्तावेज़ों में निम्न जोड़ें

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

निम्नलिखित जावास्क्रिप्ट कोड को प्रोग्रामेटिक रूप से लोड करें:

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
UIWebViewकिसी श्रेणी का उपयोग करके बढ़ाएँ ।
दीपक दंडुपोलु

4
Engin, मोबाइल सफारी, iOS 4.3.1 में पहला काम करता है। लेकिन राइटर्स चयनकर्ता को जोड़ना भूल गए। इसे सभी तत्वों पर लागू करने के लिए, तारांकन का उपयोग करें, जैसे: * {/ * css यहाँ जाता है * /}
fisherwebdev

1
मेरे फोनगैप ऐप के अंदर एक लिंक पर टैप करने पर दिखाई देने वाले मेनू को हटाने में शैली को पूरी तरह से जोड़ने का काम किया।
स्थानिक

7
canPerformActionकट, कॉपी, पेस्ट मेनू को अक्षम नहीं करता है। और Select, All मेनू का चयन करें। इसे कैसे ठीक करें? -webkit-touch-calloutऔर removeAllRangesउपयोगकर्ता इनपुट तोड़। सभी प्रदान की गई विधियों का उपयोग नहीं कर सकते :(
दिमित्री

4
इन चुनिंदा शैलियों को *वैश्विक दायरे में रखने में समस्या यह है कि यह वेब रूपों में उपयोगकर्ता इनपुट को रोकती है। मैंने पाया कि मुझे bodyइसके बजाय टैग के अंदर रखकर बेहतर परिणाम मिले ।
डेविड डगलस

104

मैं पुष्टि कर सकता हूं कि निम्न कोड 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
IOS 7 पर पुष्टि! नोट: दो कॉल को समेट कर एक में दो कॉल को ग्रुप करना संभव है।
Bigood

IOS 9.x पर लंबे समय तक प्रेस के बाद एक खाली कॉल आउट दिखाई देता है, यहां तक ​​कि ऊपर का उपयोग करते समय भी।
द्वारडोह

मैं उपरोक्त कोड का उपयोग कैसे कर सकता हूं..मैं सिर्फ जेएस को जानता हूं; कोई भी विचार नहीं है कि मैं कैसे उद्देश्य सी कोड को संपादित कर सकता हूं या फोनगैप प्लगइन को बदल सकता हूं..यदि कोई भी मदद कर सकता है
Lakshay

IOS 9 और 10 परफेक्ट लड़के के साथ काम करें!
.लॉस्टा

25

मैं इस तकनीक का उपयोग Android / iPhone (Trigger.IO के साथ पैक) के लिए एक वेब ऐप में कर रहा हूं और पाया कि यह केवल छद्म वाक्य के साथ काम करेगा: नहीं () छद्म वर्ग:

*: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 */

}

मैं jQuery मोबाइल और फोनगैप बिल्ड का उपयोग कर रहा हूं और यह मेरे लिए काम कर रहा है। मैंने पहली बार कोशिश की, *:not(input,textarea) {-webkit-touch-callout: none; -webkit-user-select: none;}लेकिन यह मेरे लिए चाल नहीं चली। धन्यवाद!
मार्क रूमेल

18

मुझे राइट्स समाधान पसंद है लेकिन मैं इसका उपयोग करूंगा ताकि उपयोगकर्ता अभी भी कॉपी, पेस्ट और इनपुट पर कार्रवाई का चयन कर सकें

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

2
यदि आप ऐसा करने जा रहे हैं, तो textarea को मत भूलना!
रयान

9

मुझे यकीन नहीं है कि सेटअप कैसे किया जाता है, लेकिन क्यों आप बस पेस्ट को साफ़ नहीं करते हैं जब viewWillDisappear कहा जाता है। शायद आपके appDelegate.m में कुछ ऐसा है:

[UIPasteboard generalPasteboard].string = nil;

यह सुनिश्चित करेगा कि जो भी डेटा उपयोगकर्ता ने कॉपी किया है, वे इसे ऐप के बाहर पेस्ट नहीं कर पाएंगे।

इसके अलावा, जैसे Engin ने कहा कि आप नियंत्रक वर्ग में canPerformSelector विधि को ओवरराइड कर सकते हैं जिसमें uiwebview शामिल है।


1
यह सबसे अच्छे समाधानों में से एक है। इस में सेट किया जा सकता है - (शून्य) applicationDidEnterBackground: (UIApplication *) एप्लिकेशन ईवेंट हैंडलर। और यह सुनिश्चित करता है कि कोई भी डेटा ऐप से बाहर न जाए।
कृष्णन

@ कृष्ण, क्या आप 100% निश्चित हैं जो स्क्रीनशॉट को भी रोक देंगे?
नॉर्मन एच।

मुझे यह समाधान पसंद है, लेकिन चूंकि यह एप्लिकेशन के सक्रिय होने के दौरान पेस्टबोर्ड पर रहता है, पृष्ठभूमि थ्रेड में चल रहा एक और (दुर्भावनापूर्ण) एप्लिकेशन सामान्य पेस्टबोर्ड तक पहुंच सकता है, जबकि इसमें डेटा है।
बाइनरी_फाल्कन

क्या यह भी डेटा को ऐप से नहीं हटाएगा? शायद डेटा मिलने पर और इसे वापस सेट कर दें कि गायब हो जाना बेहतर काम करेगा
हमजा मलिक

7

TPoschel का उत्तर स्पष्ट है लेकिन मेरे मामले में आदेश महत्वपूर्ण था।

// 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';"];
}

7

मैं पुष्टि कर सकता हूं कि यह निश्चित रूप से आपके लिए काम करेगा।

<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 */
     }

5

एक सप्ताह के लिए महान काम का परिणाम! यदि आप कई पृष्ठों पर माउस ईवेंट और उपयोगकर्ता इनपुट को सहेजना चाहते हैं, तो अन्य सभी उत्तर गलत हैं।

1) स्विज़ल विधि ( रेंटस्च / जर्सज़ी लाइब्रेरी द्वारा):

[NSClassFromString(@"UIWebDocumentView") jr_swizzleMethod:@selector(canPerformAction:withSender:) withMethod:@selector(myCanPerformAction:withSender:) error:nil];

NSObject + myCanPerformAction.h:

@interface NSObject (myCanPerformAction)

- (BOOL)myCanPerformAction:(SEL)action withSender:(id)sender;

@end

NSObject + myCanPerformAction.m:

#import "NSObject+myCanPerformAction.h"

@implementation NSObject (myCanPerformAction)

- (BOOL)myCanPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(copy:)) {
        return [self myCanPerformAction:action withSender:sender];
    }
    if (action == @selector(paste:)) {
        return [self myCanPerformAction:action withSender:sender];
    }
    return NO;
}

@end

2) UIView पर UIWebView रखें और एक कोड जोड़ें:

    UITapGestureRecognizer* singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)] autorelease];
    singleTap.numberOfTapsRequired = 2;
    singleTap.numberOfTouchesRequired = 1;
    singleTap.delegate = self;
    [self.view addGestureRecognizer:singleTap];

और ये वाला:

- (void)handleSingleTap:(UIGestureRecognizer*)gestureRecognizer {
    return;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if ([otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
        UITapGestureRecognizer *gesture = (UITapGestureRecognizer *)otherGestureRecognizer;
        if (gesture.numberOfTapsRequired == 2) {
            [otherGestureRecognizer.view removeGestureRecognizer:otherGestureRecognizer];
        }
    }
    return YES;
}

2
यह क्या करना चाहिए के कुछ स्पष्टीकरण अच्छा होगा। विशेष रूप से, मैं इस बारे में उलझन में हूं कि आपके इशारे को सिंगलटैप क्यों कहा जाता है लेकिन इसके लिए दो टैप की आवश्यकता होती है।
अर्लोमेडिया

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

बस इस कोड को अपने viewDidLoad () में जोड़ें। उपयोगकर्ता लिंक पर क्लिक कर सकता है लेकिन सामग्री की प्रतिलिपि नहीं बना सकता है।


4

पहले दिए गए समाधान ने मेरे लिए पूरी तरह से काम किया ... जब तक मैंने अपने UIWebView में एक .pdf लोड नहीं किया।

लोड हो रही एक .doc फ़ाइल पूरी तरह से काम किया है, लेकिन एक .pdf लोड हो रहा है कोड की निम्नलिखित पंक्ति अब वांछित प्रभाव नहीं है और प्रतिलिपि / परिभाषित मेनू उपयोगकर्ता द्वारा एक लंबे स्पर्श पर फिर से पॉप अप हुआ।

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

बाल खींचने के एक और बाउट के बाद मुझे जॉनी रॉकटेक्स के यहाँ यह उत्तर मिला और यह एक विजेता की तरह काम करता था। पीडीएफ फाइलों को प्रदर्शित करते समय कॉपी / पेस्ट के बिना UIWebView

इस आसान को लागू करने के लिए बहुत धन्यवाद, प्रतिभा समाधान !!


2

मेरे लिए, मैंने छवियों को ' NSDataसे ' लाने का इरादा UIWebViewकिया हैLongPressGesture

लेकिन मैग्नीफायर और कॉपी / पेस्ट / कट हमेशा मेरे फंक एक्जीक्यूट से पहले होते हैं।

और मैंने यह पाया: यहाँ छवि विवरण दर्ज करें

इसका मतलब है, Magnifier और Copy / Paste / Cut को निष्पादित करने के लिए 0.5s की आवश्यकता होती है, इसलिए यदि आपके कवक को 0.49, DONE में निष्पादित किया जा सकता है!

self.longPressPan.minimumPressDuration = 0.3

यह मेरे लिए आईओएस 9 + एक्सकोड 7 जीएम में काम करता है, मैंने जिन अन्य तरीकों की कोशिश की है वे आईओएस 7 और 8 में बस उपयोगी हैं
काइयुआन जू

-4

वेब व्यू इंटरफेक्शन फंक्शन का उपयोग करें

   webView.userInteractionEnabled = false

इससे मेरा काम बनता है

पुनश्च: जब आप उपयोगकर्ता फिर से वेबव्यू के साथ बातचीत कर सकते हैं, तो इंटरएक्शन को वापस सक्षम करना याद रखें


1
Stackoverflow में आपका स्वागत है। क्या उत्तर वास्तव में इस पुराने प्रश्न का मूल्य जोड़ता है? कृपया जवाब देने के लिए समीक्षा करें
डेन्ब

1
अपने उत्तर का विस्तार करने पर विचार करें (कुछ छोटे कोड उदाहरण प्रदान करते हुए) अपने उत्तर के मूल्य को बढ़ाने के लिए। इसके अलावा, 'मेरे लिए काम करता है' वाले उत्तर वास्तव में आत्मविश्वास को प्रेरित नहीं करते हैं - जवाब को प्रस्तुत करने के लिए बेहतर है-और फिर समस्या का निवारण करें यदि कोई आपके जवाब पर स्पष्टीकरण मांगता है।
आरोन डी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.