我知道的老線程.......
問題與@likwid_t的答案是,它也阻止任何輸入或其他元素,必須對'點擊'作出反應(例如輸入),所以我寫了這個解決方案。該解決方案可以使用任何基於任何觸摸設備(或cumputer)上的mousedown,mousemove和mouseup事件的現有拖放庫。這也是一個跨瀏覽器的解決方案。
我已經測試過幾種設備,它的工作速度很快(與ThreeDubMedia的拖放功能結合使用(另請參閱http://threedubmedia.com/code/event/drag))。這是一個jQuery解決方案,因此您只能在jQuery庫中使用它。我使用了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;
};
做些什麼: 起初,它轉換單點觸摸事件轉換成鼠標事件。它檢查事件是否由必須拖動的元素上/上的元素引起。如果它是input,textarea等input元素,它會跳過翻譯,或者如果標準鼠標事件附加到它,它也會跳過翻譯。
結果: 可拖動元素上的每個元素仍在工作。
快樂編碼,格爾茨, 歐文Haantjes
的[可能重複我怎樣才能讓一個jQuery UI「拖動()'div draggable for touchscreen?](http://stackoverflow.com/questions/3026915/how-can-i-make-a-jquery-ui-draggable-div-draggable-for-touchscreen) – ahsteele 2011-04-26 20:41:36
這確實是我們研究過的SO帖子之一,但在帖子中引用的可拖拽修復程序沒有爲我們工作。 – Pat 2011-04-26 21:17:51
我們看到的另一個SO帖子是; http://stackoverflow.com/questions/4755505/how-to-recogized-touch-event-using-jquery-for-ipad-safari-browser-is-it-possible – Pat 2011-04-26 21:20:09