Bildiğim eski konu .......
@Ryuutatsuo'nun cevabıyla ilgili sorun, 'tıklamalara' (örneğin girdiler) tepki vermesi gereken herhangi bir girişi veya diğer öğeleri de engellemesidir, bu yüzden bu çözümü yazdım. Bu çözüm, herhangi bir dokunmatik cihaz (veya cumputer) üzerinde fare indirme, fare imleci ve fareyi kaldırma olaylarına dayanan mevcut herhangi bir sürükle ve bırak kitaplığının kullanılmasını mümkün kıldı. Bu aynı zamanda tarayıcılar arası bir çözümdür.
Ben birkaç cihaz üzerinde de test ettik ve hızlı çalışır (ThreeDubMedia sürükle ve bırak özelliği ile kombinasyon halinde (bkz http://threedubmedia.com/code/event/drag )). Bu bir jQuery çözümüdür, bu nedenle onu yalnızca jQuery kitaplıkları ile kullanabilirsiniz. Bunun için jQuery 1.5.1 kullandım çünkü bazı yeni işlevler IE9 ve üstü ile düzgün çalışmıyor (jQuery'nin yeni sürümleriyle test edilmedi).
Bir olaya herhangi bir sürükle veya bırak işlemi eklemeden önce, önce bu işlevi çağırmanız gerekir :
simulateTouchEvents(<object>);
Aşağıdaki sözdizimini kullanarak giriş için tüm bileşenleri / alt öğeleri engelleyebilir veya olay işlemeyi hızlandırabilirsiniz:
simulateTouchEvents(<object>, true); // ignore events on childs
İşte yazdığım kod. Bir şeyleri değerlendirmeyi hızlandırmak için bazı güzel numaralar kullandım (koda bakın).
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;
};
Ne yapar: İlk başta, tek dokunuş olaylarını fare olaylarına çevirir. Bir olayın, sürüklenmesi gereken öğenin üzerindeki / içindeki bir öğeden kaynaklanıp kaynaklanmadığını kontrol eder. Girdi, metin alanı vb. Gibi bir girdi öğesiyse çeviriyi atlar veya buna standart bir fare olayı eklenmişse çeviriyi de atlar.
Sonuç: Sürüklenebilir bir öğedeki her öğe hala çalışıyor.
Mutlu kodlama, greetz, Erwin Haantjes