2011-08-23 98 views
1

我想用.bind()'dragenter','dragover''drop',所以我可以從我的桌面拖動文件到我的瀏覽器。jQuery 1.6.2綁定不再與拖動事件一起工作?

請參閱附件jsfiddle。 http://jsfiddle.net/v82An/23/

$(function(){ 
    function dragenter(e) { 
     e.stopPropagation(); 
     e.preventDefault(); 
    } 
    function dragover(e) { 
     e.stopPropagation(); 
     e.preventDefault(); 
    }  
    function drop(e) { 
     e.stopPropagation(); 
     e.preventDefault();   
     alert('hi') 
    } 

    $('#drop').bind('dragenter', dragenter, false); 
    $('#drop').bind('dragover', dragover, false); 
    $('#drop').bind('drop', drop, false);  
}); 

這撥弄重視這些事件在1.5正常,但在1.6他們根本不工作。

任何人都知道我是否只是做錯了嗎?

回答

6

看來,如果你不設置preventBubblefalse工作:

$('#drop').bind('dragenter', dragenter); 
$('#drop').bind('dragover', dragover); 
$('#drop').bind('drop', drop); 

DEMO

更新:如果你看看documentation,傳遞三個參數,其中最後一個是一個布爾值,被解釋爲:

.bind(eventType, [eventData], preventBubble) 

這意味着t該處理程序不用作事件處理程序,而是用作事件數據。

他們改變了他們如何檢測處理程序。在jQuery 1.5.2,它是:

if (jQuery.isFunction(data) || data === false) { 
    fn = data; 
    data = undefined; 
} 

你看,當第二個參數是一個函數,那麼這一個作爲事件處理程序(而不是第三個)。

,但它是在jQuery 1.6.2改爲:

if (arguments.length === 2 || data === false) { 
    fn = data; 
    data = undefined; 
} 

現在只測試了許多參數如何傳遞。因爲,在你的情況下,data不是false(它是一個函數)並且你傳遞了三個參數fn沒有改變。它保持false

當處理程序falsethen this happens

if (handler === false) { 
    handler = returnFalse; 
} else if (!handler) { 
    // Fixes bug #7229. Fix recommended by jdalton 
    return; 
} 

因此,這實際上可以看作是jQuery的1.5錯誤,這是現在固定,也不符合這些特定事件的問題。

+0

有趣。我想知道爲什麼這是... – kidcapital

+0

請看我的更新。 –

0

我發現我的問題在綁定過程中使用jQuery來美化原始事件對象。

我的代碼是這樣的:

$dropArea = $(".dropArea"); 
$dropArea.bind({ 
    dragover: function (ev) { 
     $(this).addClass('hover'); 
     ev.preventDefault(); 
     return false; 
    }, 
    dragend: function() { 
     $(this).removeClass('hover'); 
     return false; 
    }, 
    dragleave: function() { 
     $(this).removeClass('hover'); 
     return false; 
    }, 
    drop: function (ev) { 
     ev.preventDefault(); 
     //e = e || window.event; 
     var data = ev.dataTransfer.getData("text/html"); 
     ev.target.appendChild(document.getElementById(data)); 

     console.log("dropping element."); 
     return false; 
    }); 

jQuery的包裹被老事件對象成事件對象的新的更榮耀的jQuery版本。

我加入這一行:

ev = ev.originalEvent; 

來獲得原始事件對象回來了,在這我可以調用preventDefault(),和所有的工作很好的一次。

我希望這有助於節省時間! (仍然將我的頭包裹在與它們相關的jQuery對象和函數中,因爲它們與原始JavaScript對象關聯)。