วิธีตรวจจับctrl+ v, ctrl+ cโดยใช้ Javascript
ฉันต้องการ จำกัด การวางข้อความใน textareas ของฉันผู้ใช้ไม่ควรคัดลอกและวางเนื้อหาผู้ใช้ควรพิมพ์ข้อความใน textarea เท่านั้น
ทำอย่างไรจึงจะได้สิ่งนี้?
วิธีตรวจจับctrl+ v, ctrl+ cโดยใช้ Javascript
ฉันต้องการ จำกัด การวางข้อความใน textareas ของฉันผู้ใช้ไม่ควรคัดลอกและวางเนื้อหาผู้ใช้ควรพิมพ์ข้อความใน textarea เท่านั้น
ทำอย่างไรจึงจะได้สิ่งนี้?
คำตอบ:
ฉันเพิ่งทำสิ่งนี้ออกมาจากความสนใจ ฉันยอมรับว่ามันไม่ใช่สิ่งที่ถูกต้องที่จะทำ แต่ฉันคิดว่ามันควรเป็นการตัดสินใจของ op ... นอกจากนี้โค้ดสามารถขยายได้อย่างง่ายดายเพื่อเพิ่มฟังก์ชันการทำงานแทนที่จะนำออกไป (เช่นคลิปบอร์ดขั้นสูงหรือ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
แก้ไข: ลบ 3 บรรทัดที่ซ้ำซ้อน (เกี่ยวข้องกับ e.which) ขอบคุณคำแนะนำของ Tim Down (ดูความคิดเห็น)
แก้ไข: เพิ่มการสนับสนุนสำหรับ Mac ( cmdกุญแจแทนctrl)
keydown
และkeyup
จัดการกับdocument
? คุณสามารถทดสอบปุ่ม Ctrl ใน$(".no-copy-paste").keydown
ตัวจัดการ นอกจากนี้ไม่จำเป็นต้องมีe.keyCode || e.which
บิต: ใช้e.keyCode
งานได้ในเบราว์เซอร์ทั้งหมดที่e.which
ทำงานได้ดังนั้นe.which
จะไม่ถูกนำมาใช้ บางทีคุณอาจกำลังคิดว่าจะรับรหัสอักขระจากkeypress
เหตุการณ์ได้อย่างไร ในที่สุดสิ่งนี้จะไม่ทำอะไรเกี่ยวกับน้ำพริกจากบริบทหรือเมนูแก้ไข แต่ฉันคิดว่า OP ไม่ได้ถามเกี่ยวกับสิ่งนั้นโดยตรง
e.metaKey
หรือe.ctrlKey
เป็นtrue
แทนที่จะกำหนดค่าตัวเลขให้กับคีย์และทดสอบเหล่านั้น
ด้วย 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/
แม้ว่าจะเป็นเรื่องที่น่ารำคาญเมื่อใช้เป็นมาตรการต่อต้านการละเมิดลิขสิทธิ์ แต่ฉันเห็นว่าอาจมีบางกรณีที่มันถูกกฎหมายดังนั้น:
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
แทนการตรวจสอบรหัสคีย์เป็นบนเบราว์เซอร์ส่วนใหญ่ใน Mac OS X Ctrl/ Alt"down" และ "up" ไม่เคยถูกเรียกดังนั้นวิธีเดียวที่จะตรวจจับคือใช้event.ctrlKey
ในเหตุการณ์เช่น c หลังจากCtrlคีย์คือ จัดขึ้น ฉันยังทดแทนctrlKey
ด้วยmetaKey
สำหรับ macs
ข้อ จำกัด ของวิธีนี้:
edit
-> copy
รายการเมนูในเช่น Firefox ยังคงสามารถอนุญาตให้คัดลอก / วางมีวิธีการทำเช่นนี้ผู้อื่น: onpaste
, oncopy
และoncut
เหตุการณ์ที่เกิดขึ้นสามารถลงทะเบียนและยกเลิกใน IE, Firefox, Chrome, Safari (ที่มีปัญหาเล็ก ๆ น้อย ๆ บางคน), เบราว์เซอร์เท่านั้นที่สำคัญที่ไม่อนุญาตให้มีการยกเลิกเหตุการณ์เหล่านี้เป็นโอเปร่า
อย่างที่คุณเห็นในคำตอบอื่น ๆ ของฉันการสกัดกั้นCtrl+ vและCtrl+ cมาพร้อมกับผลข้างเคียงมากมายและมันก็ไม่ได้ป้องกันผู้ใช้จากการวางโดยใช้Edit
เมนูFirefox เป็นต้น
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
}
Safari ยังคงมีปัญหาเล็กน้อยเกี่ยวกับวิธีนี้ (มันจะลบคลิปบอร์ดแทนการตัด / คัดลอกเมื่อป้องกันค่าเริ่มต้น) แต่ข้อผิดพลาดที่ดูเหมือนจะได้รับการแก้ไขใน Chrome ทันที
ดูเพิ่มเติมที่: http://www.quirksmode.org/dom/events/cutcopypaste.htmlและหน้าทดสอบที่เกี่ยวข้องhttp://www.quirksmode.org/dom/events/tests/cutcopypaste.htmlสำหรับข้อมูลเพิ่มเติม
การสาธิตสด: http://jsfiddle.net/abdennour/ba54W/
$(document).ready(function() {
$("#textA").bind({
copy : function(){
$('span').text('copy behaviour detected!');
},
paste : function(){
$('span').text('paste behaviour detected!');
},
cut : function(){
$('span').text('cut behaviour detected!');
}
});
});
ทางออกสั้น ๆ สำหรับป้องกันผู้ใช้จากการใช้เมนูบริบทคัดลอกและตัดใน jQuery:
jQuery(document).bind("cut copy contextmenu",function(e){
e.preventDefault();
});
การปิดใช้งานการเลือกข้อความใน CSS อาจมีประโยชน์ด้วย:
.noselect {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
หากคุณใช้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.
}
}
ฉันเขียนปลั๊กอิน jQuery ซึ่งจับการกดแป้นพิมพ์ มันสามารถใช้เพื่อเปิดใช้งานการป้อนสคริปต์หลายภาษาในรูปแบบ html โดยไม่ต้องระบบปฏิบัติการ (ยกเว้นแบบอักษร) มันมีโค้ดประมาณ 300 บรรทัดบางทีคุณอาจต้องการดู:
โดยทั่วไปควรระวังการเปลี่ยนแปลงดังกล่าว ฉันเขียนปลั๊กอินสำหรับลูกค้าเพราะไม่มีวิธีแก้ไขปัญหาอื่น
คุณสามารถใช้รหัสนี้เพื่อคลิกขวา, 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();
});
แทน onkeypress ใช้ onkeydown
<input type="text" onkeydown="if(event.ctrlKey && event.keyCode==86){return false;}" name="txt">
วิธีการอื่น (ไม่จำเป็นต้องใช้ปลั๊กอิน) เพียงแค่ใช้ctrlKey
คุณสมบัติของวัตถุเหตุการณ์ที่ได้รับการส่งผ่านซึ่งบ่งชี้ว่าCtrlมีการกดในช่วงเวลาของเหตุการณ์เช่นนี้:
$(document).keypress("c",function(e) {
if(e.ctrlKey)
alert("Ctrl+C was pressed!!");
});
ดูเพิ่มเติมjQuery: ปุ่มกด CTRL + C (หรือคำสั่งผสมบางเช่นนั้น)
อย่าลืมว่าแม้ว่าคุณจะสามารถตรวจจับและบล็อกCtrl+ C/ ได้Vแต่คุณยังสามารถเปลี่ยนค่าของฟิลด์ที่ต้องการได้
ตัวอย่างที่ดีที่สุดสำหรับสิ่งนี้คือฟังก์ชั่นองค์ประกอบการตรวจสอบของ Chrome ซึ่งจะช่วยให้คุณเปลี่ยนคุณสมบัติค่าของฟิลด์
ฉันมีปัญหาของคุณแล้วและฉันแก้ไขได้ด้วยรหัสต่อไปนี้ .. ที่รับเฉพาะตัวเลข
$('#<%= 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;
}
});
คุณสามารถตรวจสอบCtrlIDe.which == 17
คุณสามารถฟังเหตุการณ์ keypress และหยุดเหตุการณ์เริ่มต้น (ป้อนข้อความ) หากตรงกับรหัสเฉพาะ
ฉันใช้ไปe.keyCode
ระยะหนึ่งและฉันตรวจพบว่าเมื่อฉันกดctrl+ .คุณลักษณะนี้จะส่งกลับหมายเลขผิด 190 ในขณะที่รหัส ASCII ของ.
46!
ดังนั้นคุณควรใช้แทนe.key.toUpperCase().charCodeAt(0)
e.keyCode
มีวิธีป้องกันบางอย่าง
อย่างไรก็ตามผู้ใช้จะสามารถปิดจาวาสคริปต์หรือดูที่ซอร์สโค้ดของหน้า
ตัวอย่างบางส่วน (ต้องการ 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;});
แก้ไข: วิธีที่ Tim Down พูดว่าฟังก์ชั่นนี้เป็นสิ่งที่พึ่งพาเบราว์เซอร์
paste
เหตุการณ์ซึ่งรวมถึง Firefox ทุกเวอร์ชันก่อนหน้ารุ่นที่ 3 ที่สองwindow.clipboardData
คือ IE เท่านั้นและฉันเชื่อว่าตอนนี้ถูกปิดใช้งานโดยค่าเริ่มต้นใน IE . ประการที่สามการปิดใช้งานkeydown
กิจกรรมทั้งหมดที่กดปุ่ม Ctrl มากเกินไป: คุณป้องกันแป้นพิมพ์ลัดที่มีประโยชน์เช่น Ctrl-A (เลือกทั้งหมด) และ Ctrl-Z (เลิกทำ) ข้อสี่ตามที่คนอื่น ๆ พูดถึงนี่เป็นสิ่งที่เลวร้ายจริงๆที่ต้องทำ