javascript drag()拖拽

<! DOCTYPE html >
< html lang = "en" >

< head >
< title > 事件类型 </ title >
< meta charset = "UTF-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< script src = "js/jquery.js" > < / script >
< style >
.div1 {
position : absolute ;
left : 100px ;
top : 100px ;
width : 250px ;
background-color : white ;
border : 1px solid gray ;
}
.div2 {
background-color : gray ;
border-bottom : 1px dotted black ;
padding : 3px ;
font-family : snas-serif;
font-weight : bold ;
}
< / style >
</ head >

< body >
< div class = "shipping_address" ></ div >
< form id = "shipping_address" ></ form >
< button id = "mybutton" > click me </ button >
< button id = "testButton" > click me again </ button >
< button id = "addBtn" onclick = "addBtn()" > add </ button >
< p class = "pNumber" > 0 </ p >
<!-- <img src="image/assistant-loading.jpg" style="position:absolute;left:100px;top:100px;" οnmοusedοwn="if(event.shiftKey) drag(this.event)" id="img" /> -->
<!-- <img src="image/assistant-loading.jpg" id="img1" style="position:absolute;" /> -->
< div class = "div1" >
< div class = "div2" onmousedown = "drag(this.parentNode,event)" > 拖动我 </ div >
< p > 这是一个测试,这是一个测试, </ p >
</ div >


< script >
window . onload = function () {
// 查找一个form元素
var elt = document . getElementById ( "shipping_address" );
// 注册一个处理程序函数
elt . onsubmit = function () {
return validata ( this );
}
};
// addEventListener
var b = document . getElementById ( "mybutton" );
b . onclick = function () {
console . log ( "click" );
};
b . addEventListener ( "click" , function () {
console . log ( "hello world" );
}, false );
// 事件处理程序移除代码
// document.removeEventListener();
document . removeEventListener ( "mousemove" , function () {}, true );

// ie浏览器的事件处理
var b = document . getElementById ( "mybutton" );
var handler = function () {
console . log ( "ie事件处理程序" );
};
if ( b . addEventListener )
b . addEventListener ( "click" , handler, false );
else if ( b . attachEvent )
b . attachEvent ( "onclick" , handler);

//事件处理程序参数
function handler ( event ) {
event = event || window . event ;
//处理程序代码
}
//事件处理程序的运行环境
var e = document . getElementById ( "mybutton" );
e . onclick = function () {};


function addEvent ( target , type , handler ) {
if ( target . addEventListener )
target . addEventListener (type, handler, false );
else
target . attachEvent ( "on" + type, function ( event ) {
// 把处理程序作为事件目标的方法调用
// 传递事件对象
return handler . call (target, event );
});
};
var btn1 = document . getElementById ( "testButton" );
var type = "click" ;
var handler = function () {
console . log ( "the world is very beautiful" );
};
addEvent (btn1, type, handler);
// 事件处理程序的作用域
// 调用顺序:
// 事件取消preventDefault(),取消事件的默认操作;
function cancelHandler ( event ) {
// 用于ie
var event = event || window . event ;
//这里是处理事件的代码
if ( event . preventDefault ) event . preventDefault (); //标准技术
if ( event . returnValue ) event . returnValue = false ;
return false ;
};

// 文档加载事件
// 当文档准备就绪是调用函数
/*
*传递给whenReady(),当文档解析完毕且为操作准备就绪时
*函数将作为文档对象的方法调用
*DOMContentLoad readystatechange or load事件发生时会触发注册函数
*一旦文档准备就绪时,所有的函数都会被调用,任何传递给whenReady()的函数都将立即调用
*/
var whenReady = ( function () {
var funcs = [];
var ready = false ;

function handler ( e ) {
if (ready) return ;
if ( e . type === "readystatechange" && document . readyState !== "complete" )
return ;

for ( var i = 0 ; i < funcs . length ; i ++ )
funcs[i]. call ( document );
ready = true ;
funcs = null ;
};
if ( document . addEventListener ) {
document . addEventListener ( "DOMContentLoaded" , handler, false );
document . addEventListener ( "DOMContentLoaded" , handler, false );
window . addEventListener ( "load" , handler, false );
} else if ( document . attachEvent ) {
document . attachEvent ( "onreadystatechange" , handler);
window . attachEvent ( "onload" , handler);
};
return function whenReady ( f ) {
if (ready)
f . call ( document );
else
funcs . push (f);
}
}());

var number1 = 0 ;
var firstNumber = document . getElementsByClassName ( "pNumber" )[ 0 ];

function addBtn1 () {
number1 ++ ;
firstNumber . textContent = number1;
if ( firstNumber . textContent >= 11 ) {
number1 = 10 ;
alert ( "每天最多只能点10个赞" );
firstNumber . textContent = 10 ;
}
};
//拖动文档元素
// drag()函数,它用于mousedown事件处理程序的调用
//elementToDrag:接收mousedown事件的元素或其他某些包含元素,它必须是绝对定位的元素
// 它的style.left and style.top值随用户的拖动而改变
// function getScrollOffsets(e) {
// console.log([
// e.width,
// e.height
// ]);

// };
// var e = document.getElementById("img");
// // console.log(e);
// getScrollOffsets(e);





//查询窗口滚动条的位置
function getScrollOffsets ( w ) {
w = w || window ;
if ( w . pageXOffset != null )
return {
x : w . pageXOffset ,
y : w . pageYOffset
};
var d = w . document ;
if ( document . compatmode == "CSS1Compat" )
return {
x : d . documentElement . scrollLeft ,
y : d . documentElement . scrollTop
};
};

function drag ( elementToDrag , event ) {
// 初始鼠标的位置
var scroll = getScrollOffsets ();
var startX = event . clientX + scroll . x ;
var startY = event . clientY + scroll . y ;
// 在文档坐标下,待拖动元素的初始位置
// 因为elementToDrag是绝对定位的
// 所以假设它的offsetParen就是文档的body元素
var origX = elementToDrag . offsetLeft ;
var origY = elementToDrag . offsetTop ;
// 计算mousedown事件和元素左上角的距离
var deltaX = startX - origX;
var deltaY = startY - origY;
// 注册用于相应接着mousedown事件发生的mousemove和mouseup事件的事件处理程序
if ( document . addEventListener ) {
document . addEventListener ( "mousemove" , moveHandler, true );
document . addEventListener ( "mouseup" , upHandler, true );
} else if ( document . attachEvent ) {
elementToDrag . setCapture ();
elementToDrag . attachEvent ( "onmousemove" , moveHandler);
elementToDrag . attachEvent ( "onmouseup" , upHandler);
// 作为mouseup事件看待鼠标捕获的丢失
elementToDrag . attachEvent ( "onlosecapture" , upHandler);
};
// 我们处理这个事件,不让任何其他元素看到他
if ( event . stopPropagation ) {
event . stopPropagation ();
} else {
event . cancelBubble = true ;
};
// 现在阻止任何默认操作
if ( event . preventDefault ) {
event . preventDefault ();
} else {
event . returnValue = false ;
};
// 当元素正在被拖动是,它就是捕获mousemove事件的处理程序
// 它用于移动这个元素
function moveHandler ( e ) {
if ( ! e) {
e = window . event ;
};
var scroll = getScrollOffsets ();
elementToDrag . style . left = ( e . clientX + scroll . x - deltaX) + "px" ;
elementToDrag . style . top = ( e . clientY + scroll . y - deltaY) + "px" ;
if ( event . stopPropagation ) {
event . stopPropagation ();
} else {
event . cancelBubble = true ;
};
};
// 这里捕捉得失拖动结束时发生的最终mouseup事件的处理程序
function upHandler ( e ) {
if ( ! e) {
e = window . event ;
};
if ( document . removeEventListener ) {
document . removeEventListener ( "mouseup" , upHandler, true );
document . removeEventListener ( "mousemove" , moveHandler, true );
} else if ( document . detachEvent ) {
elementToDrag . detachEvent ( "onlosecapture" , upHandler);
elementToDrag . detachEvent ( "onmouseup" , upHandler);
elementToDrag . detachEvent ( "onmousemove" , moveHandler);
elementToDrag . repleaseCapture ();
}
if ( e . stopPropagation ) {
e . stopPropagation ();
} else {
e . cancelBubble = true ;
};
}
};
< / script >
</ body >

</ html >
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 JavaScript 拖拽元素互换位置的实现代码,你可以根据自己的需要进行修改: HTML 部分: ```html <div class="drag-container"> <div class="drag-item" draggable="true"> 拖拽元素1 </div> <div class="drag-item" draggable="true"> 拖拽元素2 </div> <div class="drag-item" draggable="true"> 拖拽元素3 </div> </div> ``` CSS 部分: ```css .drag-container { display: flex; } .drag-item { width: 100px; height: 100px; margin-right: 10px; background-color: #ccc; text-align: center; line-height: 100px; cursor: move; } ``` JavaScript 部分: ```javascript const dragItems = document.querySelectorAll('.drag-item'); let dragItem = null; // 获取元素距离页面左上角的距离 function getPosition(el) { let x = 0, y = 0; while (el !== null) { x += el.offsetLeft; y += el.offsetTop; el = el.offsetParent; } return { x, y }; } // 判断两个元素是否相交 function isOverlap(el1, el2) { const el1Rect = el1.getBoundingClientRect(); const el2Rect = el2.getBoundingClientRect(); return !( el1Rect.bottom < el2Rect.top || el1Rect.top > el2Rect.bottom || el1Rect.right < el2Rect.left || el1Rect.left > el2Rect.right ); } // 获取拖拽元素的位置信息 function getItemPosition(item) { const { x, y } = getPosition(item); const width = item.offsetWidth; const height = item.offsetHeight; return { x, y, width, height }; } // 交换两个元素的位置 function swapItems(item1, item2) { const parent = item1.parentNode; const temp = document.createElement('div'); parent.insertBefore(temp, item1); parent.insertBefore(item1, item2); parent.insertBefore(item2, temp); parent.removeChild(temp); } // 拖拽事件处理函数 function handleDragStart(e) { dragItem = e.target; } function handleDragOver(e) { e.preventDefault(); } function handleDragEnter(e) { e.preventDefault(); if (isOverlap(dragItem, e.target)) { e.target.style.border = '2px dashed red'; } } function handleDragLeave(e) { e.target.style.border = ''; } function handleDrop(e) { e.preventDefault(); e.target.style.border = ''; if (isOverlap(dragItem, e.target)) { const item1 = dragItem; const item2 = e.target; swapItems(item1, item2); } } // 绑定拖拽事件监听器 dragItems.forEach(item => { item.addEventListener('dragstart', handleDragStart); item.addEventListener('dragover', handleDragOver); item.addEventListener('dragenter', handleDragEnter); item.addEventListener('dragleave', handleDragLeave); item.addEventListener('drop', handleDrop); }); ``` 上述代码实现了拖拽元素的互换位置,基本思路是通过拖拽事件监听器来获取拖拽元素和目标元素的位置信息,并根据位置信息判断是否需要交换位置。交换位置时,使用一个临时元素来占位,然后将两个元素互换位置即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值