ฉันจัดการเหตุการณ์ dblclick ในช่วงเวลาหนึ่งในเว็บแอปของฉัน ผลข้างเคียงคือการคลิกสองครั้งที่เลือกข้อความบนหน้า ฉันจะป้องกันไม่ให้สิ่งที่เลือกนี้เกิดขึ้นได้อย่างไร
ฉันจัดการเหตุการณ์ dblclick ในช่วงเวลาหนึ่งในเว็บแอปของฉัน ผลข้างเคียงคือการคลิกสองครั้งที่เลือกข้อความบนหน้า ฉันจะป้องกันไม่ให้สิ่งที่เลือกนี้เกิดขึ้นได้อย่างไร
คำตอบ:
function clearSelection() {
if(document.selection && document.selection.empty) {
document.selection.empty();
} else if(window.getSelection) {
var sel = window.getSelection();
sel.removeAllRanges();
}
}
คุณยังสามารถใช้สไตล์เหล่านี้กับช่วงขยายสำหรับเบราว์เซอร์ที่ไม่ใช่ IE และ IE10 ทั้งหมด:
span.no_selection {
user-select: none; /* standard syntax */
-webkit-user-select: none; /* webkit (safari, chrome) browsers */
-moz-user-select: none; /* mozilla browsers */
-khtml-user-select: none; /* webkit (konqueror) browsers */
-ms-user-select: none; /* IE10+ */
}
-ms-user-select: none;
โปรดดูblogs.msdn.com/b/ie/archive/2012/01/11/… @PaoloBergantino
ในจาวาสคริปต์ธรรมดา:
element.addEventListener('mousedown', function(e){ e.preventDefault(); }, false);
หรือกับ jQuery:
jQuery(element).mousedown(function(e){ e.preventDefault(); });
return false
ใช้event.preventDefault()
ซึ่งไม่ได้ฆ่าตัวจัดการอื่น ๆ ที่คุณอาจมีใน mousedown
element
เป็น textarea ใช่
หากต้องการป้องกันการเลือกข้อความหลังจากดับเบิลคลิก:
คุณสามารถใช้MouseEvent#detail
คุณสมบัติ สำหรับเหตุการณ์ที่มีการวางเมาส์หรือการวางเมาส์มันเป็น 1 บวกจำนวนคลิกปัจจุบัน
document.addEventListener('mousedown', function (event) {
if (event.detail > 1) {
event.preventDefault();
// of course, you still do not know what you prevent here...
// You could also check event.ctrlKey/event.shiftKey/event.altKey
// to not prevent something useful.
}
}, false);
ดูhttps://developer.mozilla.org/en-US/docs/Web/API/UIEvent/detail
(event.detail === 2)
เพื่อป้องกันการดับเบิลคลิกเท่านั้น (และไม่ใช่การคลิกสามครั้งและอื่น ๆ )
FWIW ฉันตั้งค่าuser-select: none
เป็นองค์ประกอบหลักขององค์ประกอบลูกเหล่านั้นที่ฉันไม่ต้องการให้เลือกเมื่อคลิกสองครั้งที่ใดก็ได้ในองค์ประกอบหลัก และมันใช้งานได้! สิ่งที่ยอดเยี่ยมคือการcontenteditable="true"
เลือกข้อความและอื่น ๆ ยังคงใช้ได้กับองค์ประกอบของเด็ก!
ชอบมาก:
<div style="user-select: none">
<p>haha</p>
<p>haha</p>
<p>haha</p>
<p>haha</p>
</div>
style="user-select: note"
ทุกเรียงปัญหาฉันได้พยายามที่จะแก้ปัญหา :)
ฟังก์ชัน Javascript แบบธรรมดาที่ทำให้เนื้อหาภายในองค์ประกอบของหน้าไม่สามารถเลือกได้:
function makeUnselectable(elem) {
if (typeof(elem) == 'string')
elem = document.getElementById(elem);
if (elem) {
elem.onselectstart = function() { return false; };
elem.style.MozUserSelect = "none";
elem.style.KhtmlUserSelect = "none";
elem.unselectable = "on";
}
}
สำหรับผู้ที่มองหาวิธีการแก้ปัญหาสำหรับเชิงมุม 2+
คุณสามารถใช้mousedown
เอาต์พุตของเซลล์ตาราง
<td *ngFor="..."
(mousedown)="onMouseDown($event)"
(dblclick) ="onDblClick($event)">
...
</td>
detail > 1
และป้องกันไม่ถ้า
public onMouseDown(mouseEvent: MouseEvent) {
// prevent text selection for dbl clicks.
if (mouseEvent.detail > 1) mouseEvent.preventDefault();
}
public onDblClick(mouseEvent: MouseEvent) {
// todo: do what you really want to do ...
}
dblclick
การส่งออกยังคงทำงานตามที่คาดไว้
หรือบน mozilla:
document.body.onselectstart = function() { return false; } // Or any html object
บน IE
document.body.onmousedown = function() { return false; } // valid for any html object as well
document.body
คุณจะต้องใช้ฟังก์ชั่นการแทนที่ในองค์ประกอบที่เฉพาะเจาะจงมากขึ้นกว่า
เธรดเก่า แต่ฉันพบกับโซลูชันที่ฉันเชื่อว่าสะอาดกว่าเนื่องจากไม่ได้ปิดใช้งานทุกอย่างที่ผูกไว้กับวัตถุและป้องกันการเลือกข้อความแบบสุ่มและไม่พึงประสงค์ในหน้าเท่านั้น มันตรงไปตรงมาและทำงานได้ดีสำหรับฉัน นี่คือตัวอย่าง; ฉันต้องการป้องกันการเลือกข้อความเมื่อฉันคลิกหลาย ๆ ครั้งบนวัตถุด้วยคลาส "ลูกศรขวา":
$(".arrow-right").hover(function(){$('body').css({userSelect: "none"});}, function(){$('body').css({userSelect: "auto"});});
HTH!
หากคุณพยายามป้องกันการเลือกข้อความโดยวิธีใดวิธีหนึ่งอย่างสมบูรณ์เช่นเดียวกับการดับเบิลคลิกเท่านั้นคุณสามารถใช้user-select: none
แอตทริบิวต์ css ฉันได้ทดสอบใน Chrome 68 แต่ตามhttps://caniuse.com/#search=user-selectมันควรจะทำงานในเบราว์เซอร์ผู้ใช้ปกติอื่น ๆ ในปัจจุบัน
ตามพฤติกรรมใน Chrome 68 นั้นได้รับการสืบทอดโดยองค์ประกอบย่อยและไม่อนุญาตให้เลือกข้อความที่มีองค์ประกอบขององค์ประกอบแม้ว่าจะมีการเลือกข้อความโดยรอบและรวมถึงองค์ประกอบนั้นก็ตาม
เพื่อป้องกันไม่ให้ IE 8 CTRL และ SHIFT คลิกการเลือกข้อความในแต่ละองค์ประกอบ
var obj = document.createElement("DIV");
obj.onselectstart = function(){
return false;
}
เพื่อป้องกันการเลือกข้อความในเอกสาร
window.onload = function(){
document.onselectstart = function(){
return false;
}
}
ผมมีปัญหาเหมือนกัน. ฉันแก้ไขได้โดยสลับไปที่<a>
และเพิ่มonclick="return false;"
(เพื่อให้การคลิกที่มันจะไม่เพิ่มรายการใหม่ในประวัติเบราว์เซอร์)