>  기사  >  웹 프론트엔드  >  H5의 드래그 앤 드롭에 대한 자세한 설명

H5의 드래그 앤 드롭에 대한 자세한 설명

php中世界最好的语言
php中世界最好的语言원래의
2018-03-27 11:12:023215검색

이번에는 H5 드래그 앤 드롭에 대한 자세한 설명을 가져왔습니다. H5 드래그 앤 드롭 사용 시 주의사항은요?

소개

드래그 앤 드롭은 개체를 잡고 나중에 다른 위치로 드래그하는 일반적인 기능입니다.

HTML5에서는 드래그 앤 드롭이 표준의 일부이며 모든 요소를 ​​드래그 앤 드롭할 수 있습니다.

먼저 작은 예를 클릭하세요. 사용자가

요소

JavaScript

<p draggable="true" ondragstart="myFunction(event)">拖动我!</p>
팁: 링크와 이미지는 기본적으로 드래그 가능하며 드래그 가능 속성이 필요하지 않습니다.

정의 및 사용법

드래그 앤 드롭 프로세스 중에 다음 이벤트가 트리거됩니다.

  • 드래그 대상(소스 요소)에 대한 트리거 이벤트: ondragstart - 사용자가 요소 드래그를 시작할 때 트리거됩니다

    • ondrag - 요소를 드래그할 때 트리거됨

    • ondragend - 사용자가 요소 드래그를 완료한 후 트리거됨

  • 대상을 놓을 때 트리거됨: ondragenter - 마우스로 개체를 드래그할 때 트리거됨 컨테이너 범위에 진입 이벤트

    • ondragover - 이 이벤트는 드래그된 객체가 다른 객체의 컨테이너 범위 내에서 드래그될 때 트리거됩니다.

    • ondragleave - 이 이벤트는 마우스로 드래그하는 객체가 범위를 벗어날 때 트리거됩니다.

    • ondrop - 이 이벤트는 드래그 중에 마우스 버튼을 놓으면 트리거됩니다.

브라우저 지원

Internet Explorer 9+, Firefox, Opera, Chrome 및 Safari는 드래그를 지원합니다.

참고: Safari 5.1.2는 드래그를 지원하지 않습니다. 요소를 드래그하면 ondragover 이벤트가 350밀리초마다 실행됩니다.

먼저 코드를 붙여넣은 후 하나씩 설명해보세요:

<!DOCTYPE html>
<html>
<head>
<title>HTML5拖拽</title>
<meta charset="utf-8">
<style>
#p1 {width:350px;height:70px;padding:10px;border:1px solid #aaaaaa;}
</style>
</head>
<body>
<p>拖动img_w3slogo.gif图片到矩形框中:</p>
<p id="p1" ondrop="drop(event)" ondragover="allowDrop(event)"></p>
<br>
<img id="drag1" src="images/img_w3slogo.gif" draggable="true" ondragstart="drag(event)" width="300" height="56">
<script>
function allowDrop(ev){
    ev.preventDefault();
}
function drag(ev){
    ev.dataTransfer.setData("Text",ev.target.id);
}
function drop(ev){
    ev.preventDefault();
    var data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
}
</script>
</body>
</html>
드래그 전 페이지 효과는:

위 코드의 의미를 별도로 분석해 보겠습니다.

요소를 드래그 가능하게 설정

먼저 요소를 드래그 가능하게 만들려면 드래그 가능 속성을 true로 설정하세요.

<img draggable="true">

드래그할 내용 - ondragstart 및 setData()

그런 다음 요소가 드래그됩니다. 이동하면 어떤 일이 발생합니까?

위의 예에서 ondragstart 속성은 드래그할 데이터를 지정하는 drag(event) 함수를 호출합니다.

dataTransfer.setData() 메서드는 드래그된 데이터의

데이터 유형과 값을 설정합니다.

function drag(ev)
{
    ev.dataTransfer.setData("Text",ev.target.id);
}
이 예에서 데이터 유형은 "Text"이고 값은 드래그 가능한 요소의 ID("drag1")입니다. ).

배치 위치 - ondragover

ondragover 이벤트는 드래그된 데이터를 배치할 위치를 지정합니다.

기본적으로 데이터/요소는 다른 요소에 배치될 수 없습니다. 배치를 허용해야 하는 경우 요소의 기본 처리를 방지해야 합니다.

이 작업은 ondragover 이벤트의 event.preventDefault() 메서드를 호출하여 수행됩니다.

event.preventDefault()

배치용 - ondrop

드래그된 데이터가 삭제되면 드롭 이벤트가 발생합니다.

위의 예에서 ondrop 속성은 함수 drop(event)를 호출합니다.

function drop(ev)
{
    ev.preventDefault();
    var data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
}
코드 설명:

  • preventDefault()를 호출하여 브라우저의 기본 데이터 처리를 방지합니다(drop 이벤트의 기본 동작은 다음과 같습니다). 링크로 열기)

  • dataTransfer.getData("Text") 메소드를 통해 드래그한 데이터를 가져옵니다. 이 메소드는 setData() 메소드에서 동일한 유형으로 설정된 모든 데이터를 반환합니다.

  • 드래그된 데이터는 드래그된 요소의 ID("drag1")입니다.

  • 드래그된 요소를 배치된 요소(대상 요소)에 추가합니다.

결과는 그림과 같습니다.

 

dataTransfer对象

在拖曳操作的过程中,我们可以用过dataTransfer对象来传输数据,以便在拖曳操作结束的时候对数据进行其他的操作。

对象属性:

  • dropEffect:设置或返回拖放目标上允许发生的拖放行为。如果此处设置的拖放行为不再effectAllowed属性设置的多种拖放行为之内,拖放操作将会失败。该属性值只允许为“null”、“copy”、“link”和“move”四值之一。

  • effectAllowed:设置或返回被拖动元素允许发生的拖动行为。该属性值可设为“none”、“copy”、“copyLink”、“copyMove”、“link”、“linkMove”、“move”、“all”和“uninitialized”。

  • items:该属性返回DataTransferItems对象,该对象代表了拖动数据。

  • types:该属性返回一个DOMStringList对象,该对象包括了存入dataTransfer中数据的所有类型。

对象方法:

  • setData(format,data):将指定格式的数据赋值给dataTransfer对象,参数format定义数据的格式也就是数据的类型,data为待赋值的数据

  • getData(format):从dataTransfer对象中获取指定格式的数据,format代表数据格式,data为数据。

  • clearData([format]):从dataTransfer对象中删除指定格式的数据,参数可选,若不给出,则为删除对象中所有的数据。

  • addElement(element):添加自定义图标

  • setDragImage(element,x,y):设置拖放操作的自定义图标。其中element设置自定义图标,x设置图标与鼠标在水平方向上的距离,y设置图标与鼠标在垂直方向上的距离。

Identify what is draggable

function dragstart_handler(ev) {
 console.log("dragStart");
 // Add the target element's id to the data transfer object
 ev.dataTransfer.setData("text/plain", ev.target.id);
}
<body>
 <p id="p1" draggable="true" ondragstart="dragstart_handler(event);">This element is draggable.</p>
</body>

Define the drag's data

function dragstart_handler(ev) {
  // Add the drag data
  ev.dataTransfer.setData("text/plain", ev.target.id);
  ev.dataTransfer.setData("text/html", "<p>Example paragraph</p>");
  ev.dataTransfer.setData("text/uri-list", "http://developer.mozilla.org");
}

Define the drag image

function dragstart_handler(ev) {
  // Create an image and then use it for the drag image.
  // NOTE: change "example.gif" to an existing image or the image 
  // will not be created and the default drag image will be used.
  var img = new Image(); 
  img.src = 'example.gif'; 
  ev.dataTransfer.setDragImage(img, 10, 10);
}

Define the drag effect

function dragstart_handler(ev) {
  // Set the drag effect to copy
  ev.dataTransfer.dropEffect = "copy";
}

Define a drop zone

function dragover_handler(ev) {
 ev.preventDefault();
 // Set the dropEffect to move
 ev.dataTransfer.dropEffect = "move"
}
function drop_handler(ev) {
 ev.preventDefault();
 // Get the id of the target and add the moved element to the target's DOM
 var data = ev.dataTransfer.getData("text");
 ev.target.appendChild(document.getElementById(data));
}
<body>
 <p id="target" ondrop="drop_handler(event);" ondragover="dragover_handler(event);">Drop Zone</p>
</body>

火狐浏览器拖拽问题

但是进行到这儿在火狐浏览器中发现一个问题:

html5的拖拽,用了preventDefault防止弹出新页面,但在火狐下不管用?

解决办法:

document.body.ondrop = function (event) {
    event.preventDefault();
    event.stopPropagation();
} 

或者对于上面的实例中,添加到ondrop方法里面也是可以的:

function drop(ev){
    ev.preventDefault();
    ev.stopPropagation();
    var data=ev.dataTransfer.getData("Text");
    ev.target.appendChild(document.getElementById(data));
}

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

H5的Canvas做出圆形进度条并显示数字百分比

H5的LocalStorage本地存储使用详解

위 내용은 H5의 드래그 앤 드롭에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.