กระทู้เก่ารู้แล้ว .......
ปัญหาเกี่ยวกับคำตอบของ @ryuutatsuo คือมันบล็อกอินพุตหรือองค์ประกอบอื่น ๆ ที่ต้องตอบสนองต่อ 'การคลิก' (เช่นอินพุต) ดังนั้นฉันจึงเขียนวิธีแก้ปัญหานี้ โซลูชันนี้ช่วยให้สามารถใช้ไลบรารีการลากและวางที่มีอยู่ซึ่งอิงตามเหตุการณ์การเลื่อนลงมูสมูฟและเมาส์อัพบนอุปกรณ์สัมผัสใด ๆ (หรือคัมพิเตอร์) นอกจากนี้ยังเป็นโซลูชันข้ามเบราว์เซอร์
ฉันได้ทดสอบในอุปกรณ์หลายเครื่องและทำงานได้รวดเร็ว (ร่วมกับคุณสมบัติการลากและวางของ ThreeDubMedia (ดูเพิ่มเติมที่http://threedubmedia.com/code/event/drag )) เป็นโซลูชัน jQuery เพื่อให้คุณสามารถใช้กับ jQuery libs เท่านั้น ฉันใช้jQuery 1.5.1เพราะฟังก์ชั่นใหม่บางอย่างทำงานไม่ถูกต้องกับ IE9 ขึ้นไป (ไม่ได้ทดสอบกับ jQuery เวอร์ชันใหม่กว่า)
ก่อนที่คุณจะเพิ่มการลากหรือวางลงในเหตุการณ์คุณต้องเรียกใช้ฟังก์ชันนี้ก่อน :
simulateTouchEvents(<object>);
คุณยังสามารถบล็อกคอมโพเนนต์ / ชายน์ทั้งหมดสำหรับอินพุตหรือเพื่อเพิ่มความเร็วในการจัดการเหตุการณ์โดยใช้ไวยากรณ์ต่อไปนี้:
simulateTouchEvents(<object>, true); // ignore events on childs
นี่คือรหัสที่ฉันเขียน ฉันใช้เคล็ดลับดีๆเพื่อเร่งการประเมินสิ่งต่าง ๆ (ดูรหัส)
function simulateTouchEvents(oo,bIgnoreChilds)
{
if( !$(oo)[0] )
{ return false; }
if( !window.__touchTypes )
{
window.__touchTypes = {touchstart:'mousedown',touchmove:'mousemove',touchend:'mouseup'};
window.__touchInputs = {INPUT:1,TEXTAREA:1,SELECT:1,OPTION:1,'input':1,'textarea':1,'select':1,'option':1};
}
$(oo).bind('touchstart touchmove touchend', function(ev)
{
var bSame = (ev.target == this);
if( bIgnoreChilds && !bSame )
{ return; }
var b = (!bSame && ev.target.__ajqmeclk), // Get if object is already tested or input type
e = ev.originalEvent;
if( b === true || !e.touches || e.touches.length > 1 || !window.__touchTypes[e.type] )
{ return; } //allow multi-touch gestures to work
var oEv = ( !bSame && typeof b != 'boolean')?$(ev.target).data('events'):false,
b = (!bSame)?(ev.target.__ajqmeclk = oEv?(oEv['click'] || oEv['mousedown'] || oEv['mouseup'] || oEv['mousemove']):false ):false;
if( b || window.__touchInputs[ev.target.tagName] )
{ return; } //allow default clicks to work (and on inputs)
// https://developer.mozilla.org/en/DOM/event.initMouseEvent for API
var touch = e.changedTouches[0], newEvent = document.createEvent("MouseEvent");
newEvent.initMouseEvent(window.__touchTypes[e.type], true, true, window, 1,
touch.screenX, touch.screenY,
touch.clientX, touch.clientY, false,
false, false, false, 0, null);
touch.target.dispatchEvent(newEvent);
e.preventDefault();
ev.stopImmediatePropagation();
ev.stopPropagation();
ev.preventDefault();
});
return true;
};
ให้ประโยชน์อะไร: ในตอนแรกจะแปลเหตุการณ์การสัมผัสเพียงครั้งเดียวเป็นเหตุการณ์ของเมาส์ ตรวจสอบว่าเหตุการณ์เกิดจากองค์ประกอบบน / ในองค์ประกอบที่ต้องลากไปรอบ ๆ หรือไม่ หากเป็นองค์ประกอบอินพุตเช่นอินพุตพื้นที่ข้อความ ฯลฯ จะข้ามการแปลหรือหากมีการแนบเหตุการณ์เมาส์มาตรฐานเข้าด้วยก็จะข้ามการแปลไปด้วย
ผลลัพธ์: ทุกองค์ประกอบในองค์ประกอบที่ลากได้ยังคงทำงานอยู่
ขอให้มีความสุขในการเขียนโปรแกรมทักทาย Erwin Haantjes