जावास्क्रिप्ट का उपयोग करके Ctrl + V, Ctrl + C का पता कैसे लगाएं?


173

कैसे पता लगाने के लिए ctrl+ v, ctrl+ cजावास्क्रिप्ट का उपयोग कर?

मुझे अपने पाठयक्रम में चिपकाने को प्रतिबंधित करने की आवश्यकता है, अंत उपयोगकर्ता को सामग्री को कॉपी और पेस्ट नहीं करना चाहिए, उपयोगकर्ता को केवल textarea में पाठ लिखना चाहिए।

इसे कैसे प्राप्त किया जाए?


3
इसका उद्देश्य क्या है? केवल दो वैध परिदृश्य मैं सोच सकता हूं कि पासवर्ड फ़ील्ड हैं (जो आप किसी भी तरह से कॉपी नहीं कर सकते हैं) और एक टाइपिंग स्पीड टेस्ट। मुझे यकीन है कि आप संदिग्ध तेजी से टाइपिंग का पता लगा सकते हैं।
पॉल बुचर

9
@Paul बुचर, @Propeng: ऐसे परिदृश्य हैं, जहां आपको इसकी आवश्यकता है। बहुत सरल उदाहरण: विदेशी भाषाओं को सीखने के लिए एक साइट। सीखने का प्रभाव बढ़ाया जाता है, यदि आप कॉपी और पेस्ट का उपयोग करने के बजाय शब्दों को हाथ से लिखते हैं।
back2dos

2
एक और वैध स्थिति हो सकती है जहां गलतियों का पता लगाने के लिए दोहरी प्रविष्टि की आवश्यकता होती है (जैसे कि आपका ईमेल दो बार टाइप करें, ताकि हमें पता चले कि इसमें टाइपो नहीं मिला है)। फिर भी, ऐसा उपयोगकर्ता बेतरतीब ढंग से उत्पन्न ईमेल पतों (जैसे स्नीकेमेल) की एक सूची रख सकता है, और शायद सटीकता के लिए इसे चिपकाना चाहेगा।
पॉल बुचर

40
@Paul बुचर - यह एक वैध स्थिति नहीं है, मैं उन साइटों से नफरत करता हूं जो ऐसा करते हैं और मैं हमेशा अपने (लंबे) ईमेल पते को एक इनपुट से दूसरे में कॉपी / पेस्ट करता हूं। कॉपी / पेस्ट को तोड़ना एक बड़ी प्रयोज्य समस्या है। यह वास्तव में उपयोगकर्ता को फेंक देता है, क्योंकि यह उनके मानसिक मॉडल के लिए इतना मौलिक है कि वे इसे "बस काम" करने की उम्मीद करते हैं। यह ऐसा है जैसे आपने एक दरवाजा खींचने की कोशिश की और यह आपकी ओर बढ़ने के बजाय आपसे दूर चला गया!
ईएमपी

4
जब भी इस तरह की कॉपी पेस्ट एक पेज में इसकी अनुमति नहीं है, तो मैं क्या कर रहा हूं, पाठ को कहीं और पेस्ट करें (मैं URL बार का उपयोग करता हूं) और फिर Ctrl + A (केवल यूआरएल में चिपकाए गए पाठ का चयन करें), खींचें और छोड़ें फ़ील्ड में ब्राउज़ करें, जहाँ पेस्ट अक्षम है। मुझे लगता है, यह आज की तरह रोके जाने योग्य नहीं है।
जानकीराम

जवाबों:


180

मैंने बस यही किया। मैं मानता हूं कि यह करना सही बात नहीं है, लेकिन मुझे लगता है कि इसे ऑप का निर्णय होना चाहिए ... साथ ही कार्यक्षमता को जोड़ने के लिए कोड को आसानी से बढ़ाया जा सकता है, बजाय इसे दूर ले जाने के (जैसे कि अधिक उन्नत क्लिपबोर्ड, या Ctrl+ sसर्वर को ट्रिगर करना) -साइड सेव)।

$(document).ready(function() {
    var ctrlDown = false,
        ctrlKey = 17,
        cmdKey = 91,
        vKey = 86,
        cKey = 67;

    $(document).keydown(function(e) {
        if (e.keyCode == ctrlKey || e.keyCode == cmdKey) ctrlDown = true;
    }).keyup(function(e) {
        if (e.keyCode == ctrlKey || e.keyCode == cmdKey) ctrlDown = false;
    });

    $(".no-copy-paste").keydown(function(e) {
        if (ctrlDown && (e.keyCode == vKey || e.keyCode == cKey)) return false;
    });
    
    // Document Ctrl + C/V 
    $(document).keydown(function(e) {
        if (ctrlDown && (e.keyCode == cKey)) console.log("Document catch Ctrl+C");
        if (ctrlDown && (e.keyCode == vKey)) console.log("Document catch Ctrl+V");
    });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h3>Ctrl+c Ctrl+v disabled</h3>
<textarea class="no-copy-paste"></textarea>
<br><br>
<h3>Ctrl+c Ctrl+v allowed</h3>
<textarea></textarea>

इसके अलावा सिर्फ स्पष्ट करने के लिए, इस स्क्रिप्ट को jQuery लाइब्रेरी की आवश्यकता है।

कोडपेन डेमो

EDIT: टिम डाउन के सुझाव के लिए 3 निरर्थक रेखाओं (ई.व्हीच को शामिल करना) को हटा दिया गया (टिप्पणियां देखें)

संपादित करें: मैक के लिए अतिरिक्त समर्थन ( cmdइसके बजाय कुंजी ctrl)


4
पर keydownऔर keyupहैंडलर क्यों document? आप $(".no-copy-paste").keydownहैंडलर में Ctrl कुंजी के लिए परीक्षण कर सकते हैं । इसके अलावा, e.keyCode || e.whichबिट की कोई आवश्यकता नहीं है : e.keyCodeसभी ब्राउज़रों में e.whichकाम करता है जो काम करता है, इसलिए e.whichइसका उपयोग कभी नहीं किया जाएगा। शायद आप सोच रहे थे कि किसी keypressघटना से आपको वर्ण कोड कैसे मिलता है ? अंत में, यह संदर्भ या संपादन मेनू से पेस्ट के बारे में कुछ नहीं करेगा, लेकिन मुझे लगता है कि ओपी ने सीधे उस बारे में नहीं पूछा।
टिम डाउन

@ समय: Ctrl मुख्य दस्तावेज़ों को सामान्य करने के लिए हैंडलर - क्योंकि वे नहीं चाहते कि ctrlDown चर को विशेष रूप से बिना कॉपी-पेस्ट इनपुट (ओं) से जोड़ा जाए। यह शायद ओटीटी है। E.which टिप के लिए धन्यवाद - मैंने आधे घंटे का समय बिताया है, जिसमें e.keyCode और e.which के अलग-अलग उपयोग के केस कीडाउन () और कीपर (), और क्या गड़बड़ है (विशेषकर फ़ायरफ़ॉक्स में) पर शोध करने में!
कटहल

1
jackocnr: मैं जन वोल्टर के जावास्क्रिप्ट कुंजी से निपटने के लेख की सिफारिश करता हूं : unixpapa.com/js/key.html मैंने इसे कई बार संदर्भ के लिए उपयोग किया है और त्रुटि नहीं मिली है।
टिम डाउन

3
Dude! धन्यवाद! यह वही है जो मैं उपयोगकर्ताओं को एक वेब ऐप में "तत्व" (कैलेंडर प्रविष्टि) का चयन करने में सक्षम करने के लिए सक्षम हूं, जो मैं लिख रहा हूं, इसे कॉपी करने के लिए ctrl + c को हिट करें, फिर ctrl + v को "पेस्ट" करें, यह सब बिना वास्तव में सर्वशक्तिमान धन्य क्लिपबोर्ड के साथ बातचीत। ctrl + c मुझे याद है कि उन्होंने क्या क्लिक किया है, ctrl + v मैं इसे डुप्लिकेट करता हूं, हर कोई जीतता है।
दान एफ

2
मैं एक विशेषज्ञ या कुछ भी नहीं कर रहा हूँ, लेकिन मुझे लगता है कि यह शायद के लिए परीक्षण करने के लिए बेहतर होगा e.metaKeyया e.ctrlKeyकिया जा रहा है trueके बजाय चाबियाँ करने के लिए संख्या निर्दिष्ट करना और उन का परीक्षण।
स्लॉथर

52

Jquery से आप फ़ंक्शन को बांधकर कॉपी, पेस्ट आदि का आसानी से पता लगा सकते हैं:

$("#textA").bind('copy', function() {
    $('span').text('copy behaviour detected!')
}); 
$("#textA").bind('paste', function() {
    $('span').text('paste behaviour detected!')
}); 
$("#textA").bind('cut', function() {
    $('span').text('cut behaviour detected!')
});

अधिक जानकारी यहाँ: http://www.mkyong.com/jquery/how-to-detect-copy-paste-and-cut-behavior-with-jquery/


1
दुर्भाग्य से, यह विधि केवल फ़ायरफ़ॉक्स पर आग लगा देगी यदि पाठ का चयन किया गया है
यासिर एननाज़क

44

जब यह एक एंटी-पायरेसी उपाय के रूप में उपयोग किए जाने पर कष्टप्रद हो सकता है, तो मैं देख सकता हूं कि कुछ ऐसे उदाहरण हो सकते हैं जहां यह वैध होगा, इसलिए:

function disableCopyPaste(elm) {
    // Disable cut/copy/paste key events
    elm.onkeydown = interceptKeys

    // Disable right click events
    elm.oncontextmenu = function() {
        return false
    }
}

function interceptKeys(evt) {
    evt = evt||window.event // IE support
    var c = evt.keyCode
    var ctrlDown = evt.ctrlKey||evt.metaKey // Mac support

    // Check for Alt+Gr (http://en.wikipedia.org/wiki/AltGr_key)
    if (ctrlDown && evt.altKey) return true

    // Check for ctrl+c, v and x
    else if (ctrlDown && c==67) return false // c
    else if (ctrlDown && c==86) return false // v
    else if (ctrlDown && c==88) return false // x

    // Otherwise allow
    return true
}

मैंने event.ctrlKeyमैक ओएस एक्स Ctrl/ Alt"डाउन" और "अप" घटनाओं पर अधिकांश ब्राउज़रों पर कुंजी कोड की जांच करने के बजाय उपयोग किया है , कभी भी ट्रिगर नहीं किया जाता है, इसलिए पता लगाने का एकमात्र तरीका कुंजी के event.ctrlKeyबाद ई जैसे सी घटना में उपयोग करना Ctrlहै नीचे आयोजित। मैंने macs के लिए भी प्रतिस्थापित ctrlKeyकिया metaKeyहै।

इस विधि की सीमाएं:

  • ओपेरा राइट क्लिक घटनाओं को अक्षम करने की अनुमति नहीं देता है

  • जहाँ तक मुझे पता है, ब्राउज़र विंडो के बीच ड्रैग और ड्रॉप को रोका नहीं जा सकता है।

  • edit-> copyजैसे फ़ायरफ़ॉक्स में मेनू आइटम अभी भी प्रतिलिपि करने / चिपकाने अनुमति दे सकते हैं।

  • इस बात की भी कोई गारंटी नहीं है कि विभिन्न कीबोर्ड लेआउट / स्थानों वाले लोग जिनके लिए कॉपी / पेस्ट / कट समान कोड हैं (हालांकि लेआउट अक्सर अंग्रेजी के समान मानक का पालन करते हैं), लेकिन कंबल "सभी नियंत्रण कुंजी अक्षम करें" का अर्थ है कि सभी का चयन करें आदि। को भी अक्षम कर दिया जाएगा, इसलिए मुझे लगता है कि यह एक समझौता है जिसे बनाने की आवश्यकता है।

14

: ऐसा करने का एक और तरीका है onpaste , oncopyऔर oncutकेवल प्रमुख ब्राउज़र कि इन घटनाओं को रद्द ओपेरा है की अनुमति नहीं है घटनाओं पंजीकृत है और (कुछ मामूली समस्याओं के साथ) आईई, फ़ायरफ़ॉक्स, क्रोम, सफारी में रद्द कर दिया जा सकता है।

जैसा कि आप मेरे अन्य उत्तर में देख सकते हैं Ctrl+ vऔर Ctrl+ cकई साइड इफेक्ट्स के साथ आता है, और यह अभी भी उपयोगकर्ताओं को फ़ायरफ़ॉक्स Editमेनू आदि का उपयोग करने से रोकता नहीं है ।

function disable_cutcopypaste(e) {
    var fn = function(evt) {
        // IE-specific lines
        evt = evt||window.event
        evt.returnValue = false

        // Other browser support
        if (evt.preventDefault) 
            evt.preventDefault()
        return false
    }
    e.onbeforepaste = e.onbeforecopy = e.onbeforecut = fn
    e.onpaste = e.oncopy = e.oncut = fn
}

इस विधि के साथ सफारी में अभी भी कुछ छोटी समस्याएं हैं (यह डिफ़ॉल्ट को रोकते समय कट / कॉपी के स्थान पर क्लिपबोर्ड को साफ करता है) लेकिन यह बग क्रोम में अब ठीक किया गया प्रतीत होता है।

यह भी देखें: अधिक जानकारी के लिए http://www.quirksmode.org/dom/events/cutcopypaste.html और संबंधित परीक्षण पृष्ठ http://www.quirksmode.org/dom/events/tests/cutcopypaste.html



8

उपयोगकर्ता को संदर्भ मेनू का उपयोग करने से रोकने के लिए लघु समाधान, कॉपी और jQuery में कटौती:

jQuery(document).bind("cut copy contextmenu",function(e){
    e.preventDefault();
});

सीएसएस में पाठ चयन को निष्क्रिय करना भी आसान हो सकता है:

.noselect {  
    -webkit-touch-callout: none;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
     user-select: none;
}

4

यदि आप ctrlKeyसंपत्ति का उपयोग करते हैं, तो आपको राज्य बनाए रखने की आवश्यकता नहीं है।

   $(document).keydown(function(event) {
      // Ctrl+C or Cmd+C pressed?
      if ((event.ctrlKey || event.metaKey) && event.keyCode == 67) {
         // Do stuff.
      }

      // Ctrl+V or Cmd+V pressed?
      if ((event.ctrlKey || event.metaKey) && event.keyCode == 86) {
         // Do stuff.
      }

      // Ctrl+X or Cmd+X pressed?
      if ((event.ctrlKey || event.metaKey) && event.keyCode == 88) {
         // Do stuff.
      } 
    }

यह सही जवाब है! यदि किसी कुंजी को इसके साथ दबाया गया है, तो घटना में एक गुण ctrlKey = true है। हमें किसी अतिरिक्त कार्यक्रम की आवश्यकता नहीं है।
जनब्रस

3

मैंने एक jQuery प्लगइन लिखा है, जो कीस्ट्रोक्स को पकड़ता है। इसका उपयोग ओएस के बिना HTML रूपों में कई भाषा स्क्रिप्ट इनपुट को सक्षम करने के लिए किया जा सकता है (फोंट को छोड़कर)। इसकी लगभग ३०० पंक्तियाँ, शायद आप एक बार देखना पसंद करें:

आम तौर पर, इस तरह के परिवर्तनों से सावधान रहें। मैंने क्लाइंट के लिए प्लगइन लिखा क्योंकि अन्य समाधान उपलब्ध नहीं थे।


3

आप इस कोड का उपयोग राइटक्लिक, CTRL+ C, CTRL+ V, CTRL+ के लिए कर सकते हैं Xऔर उनकी कार्रवाई का पता लगा सकते हैं

$(document).bind('copy', function(e) {
        alert('Copy is not allowed !!!');
        e.preventDefault();
    }); 
    $(document).bind('paste', function() {
        alert('Paste is not allowed !!!');
        e.preventDefault();
    }); 
    $(document).bind('cut', function() {
        alert('Cut  is not allowed !!!');
        e.preventDefault();
    });
    $(document).bind('contextmenu', function(e) {
        alert('Right Click  is not allowed !!!');
        e.preventDefault();
    });

3

onkeypress के बजाय, onkeydown का उपयोग करें।

<input type="text" onkeydown="if(event.ctrlKey && event.keyCode==86){return false;}" name="txt">

2

एक अन्य दृष्टिकोण (कोई प्लगइन की आवश्यकता नहीं) यह केवल उस ऑब्जेक्ट केctrlKey गुण का उपयोग करने के लिए है जो इसमें पास हो जाता है। यह इंगित करता है कि क्या घटना के समय दबाया गया था, इस तरह:Ctrl

$(document).keypress("c",function(e) {
  if(e.ctrlKey)
    alert("Ctrl+C was pressed!!");
});

Jquery भी देखें : keypress, ctrl + c (या कुछ कॉम्बो जैसा)


0

कि मत भूलना, जब आप पता लगाने के लिए और ब्लॉक सक्षम हो सकता है Ctrl+ C/ V, आप अभी भी एक निश्चित क्षेत्र का मान बदल सकते हैं।
इसके लिए सबसे अच्छा उदाहरण क्रोम का निरीक्षण तत्व फ़ंक्शन है, यह आपको किसी फ़ील्ड के मूल्य-गुण को बदलने की अनुमति देता है।


0

मुझे पहले से ही आपकी समस्या है और मैंने इसे निम्न कोड द्वारा हल किया है .. जो केवल संख्याओं को स्वीकार करते हैं

$('#<%= mobileTextBox.ClientID %>').keydown(function(e) {
            ///// e.which Values
            // 8  : BackSpace , 46 : Delete , 37 : Left , 39 : Rigth , 144: Num Lock 
            if (e.which != 8 && e.which != 46 && e.which != 37 && e.which != 39 && e.which != 144
                && (e.which < 96 || e.which > 105 )) {
                return false;
            }
        });

आप Ctrlआईडी का पता लगा सकते हैंe.which == 17


-1

आप कीपर इवेंट को सुन सकते हैं, और डिफॉल्ट ईवेंट (टेक्स्ट में प्रवेश) को रोक सकते हैं यदि यह विशिष्ट कीकोड से मेल खाता है


-1

महत्वपूर्ण लेख

मैं e.keyCodeथोड़ी देर के लिए उपयोग कर रहा था और मुझे पता चला कि जब मैं ctrl+ दबाता हूं ., तो यह विशेषता एक गलत संख्या, 190 वापस कर देती है, जबकि एससीआई कोड .46 है!

इसलिए आपको e.key.toUpperCase().charCodeAt(0)इसके बजाय उपयोग करना चाहिए e.keyCode


-4

इसे रोकने के कुछ तरीके हैं।

हालांकि उपयोगकर्ता हमेशा जावास्क्रिप्ट को बंद करने या पृष्ठ के स्रोत कोड को देखने में सक्षम होगा ।

कुछ उदाहरण (jQuery की आवश्यकता है)

/**
* Stop every keystroke with ctrl key pressed
*/
$(".textbox").keydown(function(){
    if (event.ctrlKey==true) {
        return false;
    }
});

/**
* Clear all data of clipboard on focus
*/
$(".textbox").focus(function(){
    if ( window.clipboardData ) {
        window.clipboardData.setData('text','');
    }
});

/**
* Block the paste event
*/
$(".textbox").bind('paste',function(e){return false;});

संपादित करें: टिम डाउन ने कैसे कहा, यह कार्य सभी ब्राउज़र आश्रित हैं।


2
इसमें कई समस्याएं हैं: पहला, यह उन ब्राउज़रों में काम नहीं करेगा जिनके पास कोई pasteईवेंट नहीं है , जिसमें संस्करण 3 से पहले फ़ायरफ़ॉक्स के सभी संस्करण शामिल हैं। दूसरा, window.clipboardDataकेवल IE है और मेरा मानना ​​है कि अब IE में डिफ़ॉल्ट रूप से अक्षम है । तीसरा, उन सभी keydownघटनाओं को अक्षम करना जहां Ctrl कुंजी दबाया जाता है, अत्यधिक है: आप उपयोगी कीबोर्ड शॉर्टकट जैसे कि Ctrl-A (सभी का चयन करें) और Ctrl-Z (पूर्ववत करें) को रोकें। चौथा, जैसा कि दूसरों द्वारा बताया गया है, यह वास्तव में बुरा काम है।
टिम डाउन

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