2012-01-30 3 views
6

Gmail과 유사한 파일 업로 드로 시스템을 구현하려고합니다. 나는 이미 모든 Fileupload/AJAX 문제를 완료했으며 완벽하게 작동합니다. 내가 가진 유일한 문제는 사용자 피드백입니다.데스크톱에서 브라우저로 파일을 드래그 할 때 트리거되는 Javascript 이벤트는 무엇입니까

예를 들어 .. Gmail에서 파일을 브라우저로 드래그하면 (IE9 이상 사용자라고 가정) 팝업 창이 나타나 파일을 놓을 수 있습니다. 프레임 워크 (Jquery라고 가정 해 봅시다)에 포착되어 드롭 영역에서 멋진 애니메이션을 만들 수 있습니다.

내 질문은 간단합니다.이 작업을 수행하기 위해 어떤 이벤트를 캡처해야합니까? 어떤 아이디어? 내가 잘못하고 있니?

답변

8

메인 이벤트는 단지 drop입니다.

dragenterdragleave도 처리해야합니다. 그렇지 않으면 삭제 조치로 인해 삭제 된 파일이로드됩니다. 선택적으로 dragover을 볼 수도 있습니다. dragenterdragleave 핸들러 물건이 그것으로 드래그 될 때 단지 드롭 존의 모양이 변경되어이 경우

var $dz = $('#dropzone'); 
$dz.on({ 
    dragenter: dragenter, 
    dragleave: dragleave, 
    dragover: false, 
    drop: drop 
}); 

function dragenter() { 
    $dz.addClass('active'); 
}; 

function dragleave() { 
    $dz.removeClass('active'); 
}; 

function drop(e) { 
    var dt = e.originalEvent.dataTransfer; 
    if (dt) { 
     var files = dt.files; 
     ... 
    } 
    $dz.removeClass('active'); 
}; 

:

나는과 같이,이 핸들러를 등록하는 코드가 있습니다.

+0

쿨! 내 상사가이 기능을 원할 것입니다. – gdoron

+0

글쎄요, 이건 실제로 다소 효과가 있지만, 드래그 한 항목을 놓기 영역으로 전달할 때만 .. 나는 여전히 드롭 영역이 어디에 있는지 알지 못합니다. on ... 잘 사용하지만, 다른 div에 들어가면 (즉, 고정 된 폭으로 가운데에 페이지가 놓여 있다고 말하면, 그래서 우리는 "순수한 바디 태그"라고 말할 수있는 양쪽에 약간의 빈 공간이 있습니다.) 그러면 휴가 핸들러가 작동합니다 ... 페이지 전체에 "enter"를 유지하는 방법을 알아 내고 실제로 브라우저 영역을 완전히 떠날 때 "나가십시오". 도움을 주셔서 감사합니다 –

+0

게다가, 그것 sux의 종류 .. 이벤트 "dragenter"마우스가 움직이는 모든 픽셀에 트리거와 같은 것 같습니다! 그래서 내가 2 초 동안 dropzone에 좋은 "흔들림"효과를 말하는 것을 말하게한다. .. 그런데. 그것은 실제로 내가 움직이는 유지하는 한 오랫동안 흔들리지 않을 그 얼고, 사촌처럼 느낀다! –

3

이것은 drop이며, 이벤트 객체에서 필요한 속성은 originalEvent 속성에 있습니다. 이 드롭 이벤트가 발생하는 내가 정확히 기억한다면

$(element).on("drop",function(e){ 
    console.log(e.originalEvent) 
}); 

당신은 또한 dragenter에 바인딩을 해제와 같은 요소에 dragleave해야합니다.

$(element).on("dragenter dragleave", false); 
+0

dragenter와 dragleave에 대한 좋은 메모 - 나는 코드에 포함되어 있지만 실제로 필요하다는 것을 잊어 버렸다. – Alnitak

+0

@Alnitak - 예,이 기능을 구현하려고 처음 시도했을 때 루프가 발생했습니다. 나는 텍스트 영역을 사용하고 텍스트 영역의 정상적인 사용으로 이러한 이벤트를 엉망으로 만들기 때문에 전체 아이디어를 폐기하고 jquery의 드래그 앤 드랍으로 끝납니다. –

관련 문제