Maison >interface Web >js tutoriel >Glisser-déposer mobile jQuery (développement modulaire, événements tactiles, webpack)

Glisser-déposer mobile jQuery (développement modulaire, événements tactiles, webpack)

高洛峰
高洛峰original
2017-01-04 14:16:371486parcourir

Le glisser-déposer côté CP peut être facilement réalisé via jquery. Mais cela ne fonctionne pas bien du côté mobile. J'ai donc écrit une démo glisser-déposer côté mobile. Les principaux événements utilisés sont les événements tactiles (touchstart, touchmove et touchend).

La fonction implémentée par cette démo est la suivante : les éléments qui peuvent être glissés (voici des images) sont dans la liste. Ces éléments peuvent être glissés vers la zone spécifiée. Après avoir atteint la zone spécifiée (console). les éléments sont insérés dans le contrôle Après la console, l'élément déplacé d'origine revient à sa position d'origine et le nouvel élément peut toujours être glissé dans la console ou hors de la console.

Dans cette démo, trois modules sont utilisés, à savoir le module ajax, le module drag et le module position. Le module ajax est utilisé pour implémenter les requêtes ajax (toutes les ressources d'image sont obtenues via des requêtes ajax), le module glisser est utilisé pour implémenter le déplacement d'éléments et le module de position est utilisé pour implémenter les opérations de position d'élément (telles que l'initialisation de position, la restauration, la suppression). ). Le fichier d'entrée de la démo est indx.js et les trois fichiers de module précédents sont enregistrés dans le même dossier. Une fois le codage terminé, il est empaqueté via webpack. Le code de développement se trouve dans le dossier app et le code packagé se trouve dans le dossier build.

1. Introduction aux événements tactiles

Il existe trois événements tactiles, à savoir touchstart, touchmove et touchend. L'événement touchstart est déclenché lorsqu'un doigt touche l'écran. touchmove se déclenche en continu lorsqu'un doigt glisse sur l'écran. Le désactiver lors de cet événement empêche le défilement des pages. touchend est déclenché lorsque le doigt est soulevé de l'écran. En plus de fournir des attributs communs aux événements de souris, les objets événement de ces trois événements tactiles incluent également les trois attributs suivants :

Touches : un tableau d'objets tactiles représentant les opérations tactiles actuellement suivies.

TargetTouches : un tableau d'objets Touch spécifiques à la cible de l'événement.

changeTouches : Un tableau d'objets Touch indiquant ce qui a changé depuis le dernier contact.

Dans ce cas, je dois obtenir la position du point de contact par rapport à la fenêtre d'affichage. J'utilise event.targetTouches[0].clientX et event.targetTouches[0].clientY

二.ajax Code du module

var $ = require('jquery');
var ajax = {
//得到可拖拽图片的初始列表
getInitImg:function(parent){
var num = 50;
$.ajax({
type:"GET",
async:false,//这里使用同步加载,因为要让图片加载完成后才能做其他操作
url:'/Home/picwall/index',
success:function(result){
if(result.status == 1) {
$.each(result.data, function (index,item) {
var src = item.pic_src;
var width = parseInt(item.width);
var height = parseInt(item.height);
var ratio = num / height;
var img = $('').attr("src",src).height(num).width(parseInt(width * ratio));
parent.append(img);
});
}
},
dataType:'json'
});
}
};
module.exports = ajax;//将ajax模块暴露出来

3. Positionner le code du module

var $ = require('jquery');
var position = {
//初始化位置,gap是一个表示元素间距的对象
init:function(parent,gap){
var dragElem = parent.children();
//确保父元素是相对定位
if(parent.css('position') !== "relative"){
parent.css('position','relative');
}
parent.css({
'width':"100%",
'z-index':'10'
});
//当前列表内容的宽度
var ListWidth = 0;
//位于第几列
var j = 0;
dragElem.each(function(index,elem){
var curEle = $(elem);
//设置元素的初始位置
curEle.css({
position:"absolute",
top:gap.Y,
left:ListWidth + gap.X
});
//为每个元素添加一个唯一的标识,在恢复初始位置时有用
curEle.attr('index',index);
//将元素的初始位置保存起来
position.coord.push({
X:ListWidth + gap.X,
Y:gap.Y
});
j++;
//设置父元素的高度
parent.height( parseInt(curEle.css('top')) + curEle.height() + gap.Y);
ListWidth = curEle.offset().left + curEle.width();
});
},
//将子元素插入到父元素中
addTo:function(child,parent,target){
//父元素在视口的坐标
var parentPos = {
X:parent.offset().left,
Y:parent.offset().top
};
//目标位置相对于视口的坐标
var targetPos = {
X:target.offset().left,
Y:target.offset().top
};
//确保父元素是相对定位
if(parent.css('position') !== "relative"){
parent.css({
'position':'relative'
});
}
parent.css({
'z-index':'12'
});
//将子元素插入父元素中
parent.append(child);
//确定子元素在父元素中的位置并且保证子元素的大小不变
child.css({
       position:absolute,
top:targetPos.Y - parentPos.Y,
left:targetPos.X - parentPos.X,
width:target.width(),
height:target.height()
});
},
//将元素恢复到原来的位置
restore:function(elem){
//获得元素的标识
var index = parseInt( elem.attr('index') );
elem.css({
top:position.coord[index].Y,
left:position.coord[index].X
});
},
//拖拽元素的初始坐标
coord:[],
//判断元素A是否在元素B的范围内
isRang:function(control,dragListPar,$target){
var isSituate = undefined;
if(control.offset().top > dragListPar.offset().top){
isSituate = $target.offset().top > control.offset().top
&& $target.offset().left > control.offset().left
&& ($target.offset().left + $target.width()) < (control.offset().left + control.width());
}else{
isSituate = ($target.offset().top + $target.height())<(control.offset().top + control.height())
&& $target.offset().top > control.offset().top
&& $target.offset().left > control.offset().left
&& ($target.offset().left + $target.width()) < (control.offset().left + control.width());
}
return isSituate;
}
};
module.exports = position;

4. Faire glisser le code du module

var $ = require(&#39;jquery&#39;);
var position = require(&#39;./position.js&#39;);
var drag = {
//拖拽元素的父元素的id
dragParen:undefined,
//操作台的id值
control:undefined,
//移动块相对视口的位置
position:{
X:undefined,
Y:undefined
},
//触摸点相对视口的位置,在滑动过程中会不断更新
touchPos:{
X:undefined,
Y:undefined
},
//开始触摸时触摸点相对视口的位置
startTouchPos:{
X:undefined,
Y:undefined
},
//触摸点相对于移动块的位置
touchOffsetPos:{
X:undefined,
Y:undefined
},
//获取拖拽元素父元素id和控制台的ID的值
setID:function(dragList,control){
this.dragParent = dragList;
this.control = control;
},
touchStart:function(e){
var target = e.target;
//阻止冒泡
e.stopPropagation();
//阻止浏览器默认的缩放和滚动
e.preventDefault();
var $target = $(target);
//手指刚触摸到屏幕上时,触摸点的位置
drag.startTouchPos.X = e.targetTouches[0].clientX;
drag.startTouchPos.Y = e.targetTouches[0].clientY;
//触摸元素相对视口的位置
drag.position.X = $target.offset().left;
drag.position.Y = $target.offset().top;
//触摸点相对于视口的位置,滑动过程中不断更新
drag.touchPos.X = e.targetTouches[0].clientX;
drag.touchPos.Y = e.targetTouches[0].clientY;
//触摸点相对于触摸元素的位置
drag.touchOffsetPos.X = drag.touchPos.X - drag.position.X;
drag.touchOffsetPos.Y = drag.touchPos.Y - drag.position.Y;
//给目标元素绑定touchMove事件
$target.unbind(&#39;touchmove&#39;).on(&#39;touchmove&#39;,drag.touchMove);
},
touchMove:function(e){
var target = e.target;
//阻止冒泡
e.stopPropagation();
//阻止浏览器默认的缩放和滚动
e.preventDefault();
var $target = $(target);
//获得触摸点的位置
drag.touchPos.X = e.targetTouches[0].clientX;
drag.touchPos.Y = e.targetTouches[0].clientY;
//修改移动块的位置
$target.offset({
top: drag.touchPos.Y - drag.touchOffsetPos.Y,
left: drag.touchPos.X - drag.touchOffsetPos.X
});
//给移动元素绑定touchend事件
$target.unbind(&#39;touchend&#39;).on(&#39;touchend&#39;,drag.touchEnd);
},
touchEnd:function(e) {
var target = e.target;
//阻止冒泡
e.stopPropagation();
//阻止浏览器默认的缩放和滚动
e.preventDefault();
var $target = $(target);
var parent = $target.parent();
//得到控制台和拖动元素列表的父元素
var control = $("#" + drag.control);
var dragListPar = $(&#39;#&#39; + drag.dragParent);
//拖动元素是否位于控制台
var sitControl = position.isRang(control, dragListPar, $target);
//拖动结束后,如果拖拽元素的父元素是拖拽列表
if (parent.attr(&#39;id&#39;) === drag.dragParent) {
//如果元素位于控制台
if (sitControl) {
var dragChild = $target.clone();
//为克隆出的元素绑定touchstart事件
dragChild.unbind(&#39;touchstart&#39;).on(&#39;touchstart&#39;,drag.touchStart);
//将克隆出的元素插入到控制台
position.addTo(dragChild, control, $target);
}
//将原来的触摸元素恢复到初始位置
position.restore($target);
}
// 拖拽结束后,如果拖拽元素的父元素是控制台,并且元素拖出了控制台
if (parent.attr(&#39;id&#39;) === drag.control && !sitControl) {
$target.remove();
}
}
};
module.exports = drag;

5. Fichier d'entrée index.js Code

require(&#39;../css/base.css&#39;);
require(&#39;../css/drag.css&#39;);
var $ = require(&#39;jquery&#39;);
var drag = require(&#39;./drag.js&#39;);
var position = require(&#39;./position.js&#39;);
var ajax = require(&#39;./ajax.js&#39;);
var dragList = $(&#39;#dragList&#39;);
//可拖拽元素的水平,竖直间距
var gap = {
X:20,
Y:10
};
//通过ajax获取可拖拽的元素的列表
ajax.getInitImg(dragList);
//初始化可拖拽元素的位置
position.init(dragList,gap);
//设置控制台的高度。控制台的高度为屏幕的高度减去拖拽列表的盖度
var control = $(&#39;#control&#39;);
control.height( $(window).height() - dragList.height() );
//给每个拖动元素绑定touchstart事件
var dragElem = dragList.children();
dragElem.each(function(index,elem){
$(elem).unbind(&#39;touchstart&#39;).on(&#39;touchstart&#39;,drag.touchStart);
});
//拖拽元素的父元素的id值为dragList,操作台的id值为control
drag.setID(&#39;dragList&#39;,&#39;control&#39;);

6. Packaging Webpack

Ce qui précède utilise l'idée de programmation modulaire et écrit différentes implémentations fonctionnelles dans différents modules. Vous pouvez utiliser toutes les fonctions dont vous avez besoin(). à introduire, mais le navigateur n'a pas de définition de la méthode require. Par conséquent, le code ci-dessus ne peut pas être exécuté directement dans le navigateur et doit d’abord être empaqueté. Si vous n'êtes pas encore familier avec webpack, vous pouvez consulter cet article. Le fichier de configuration de webpack est le suivant :

var autoHtml = require(&#39;html-webpack-plugin&#39;);
var webpack = require(&#39;webpack&#39;);
var extractTextWebpack = require(&#39;extract-text-webpack-plugin&#39;);// 这个插件可以将css文件分离出来,为css文件位于单独的文件中
module.exports = {
entry:{
&#39;index&#39;:&#39;./app/js/index.js&#39;,
&#39;jquery&#39;:[&#39;jquery&#39;]
},
output:{
path:&#39;./build/&#39;,
filename:&#39;js/[name].js&#39;
},
module:{
loaders:[
{
test:/\.css/,
loader:extractTextWebpack.extract(&#39;style&#39;,&#39;css&#39;)
}
]
},
plugins:[
new extractTextWebpack(&#39;css/[name].css&#39;,{
allChunks:true
}),
new webpack.optimize.CommonsChunkPlugin({
name:&#39;jquery&#39;,
filename:&#39;js/jquery.js&#39;
}),
new autoHtml({
title:"拖拽",
filename:"drag.html",
template:&#39;./app/darg.html&#39;,
inject:true
})
]
};

Ce qui précède est le glisser-déposer mobile jQuery (développement modulaire) introduit par le éditeur. Touch event, webpack), j'espère que cela sera utile à tout le monde. Si vous avez des questions, laissez-moi un message et l'éditeur vous répondra à temps. Je voudrais également vous remercier tous pour votre soutien au site Web PHP chinois !

Pour plus d'articles sur le glisser-déposer mobile jQuery (développement modulaire, événements tactiles, webpack), veuillez faire attention au site Web PHP chinois !


Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn