利用jquery在做一个拖拽的列表中,由于大的列表项会发生拖拽,而列表项中的新增表单中的input项用鼠标拖拽选择时会触发拖拽事件,所以需要将新建表单做成一个弹出框的样式,即将新增列表项的表单放到body的底部默认隐藏,通过鼠标点击来使表单显示并利用点击元素的位置来传递给表单使表单显示在鼠标单击的位置,然后遇到一个问题即在表单中点击提交按钮之后需要将表单中的信息组成一个列表项插入到所点击的列表,在这之中遇到传输传值的问题,将该问题简化成一个如下的demo。
<body>
<div id="full">
<div id="div1" class="child">2</div>
<div id="div2" class="child">3</div>
</div>
<button class="submit">提交</button>
<script src="js/jquery.min.js"></script>
<script>
$(document).ready(function () {
showdiv()
})
function showdiv() {
$('body').on('click', '.child', function () {
flag = true;
nodeId = $(this).attr('id')
console.log(nodeId);
showId(nodeId);
})
}
function showId(idName) {
console.log(idName);
nodeName = idName;
$('.submit').on('click', function () {
if (flag) {
console.log(idName);
console.log(nodeName);
flag = false;
} else {
return;
}
})
}
</script>
</body>
下面从头一步步拆解思路:
首先是通过点击获取到当前点击元素的id,然后通过传递参数的方法把参数传递给第二个函数,在第二个函数中没有点击事件的时候可以传递到正常的传输,例如:
<body>
<div id="full">
<div id="div1" class="child">2</div>
<div id="div2" class="child">3</div>
</div>
<script src="js/jquery.min.js"></script>
<script>
$(document).ready(function () {
showdiv()
})
function showdiv() {
$('body').on('click', '.child', function () {
nodeId = $(this).attr('id')
console.log(nodeId);
showId(nodeId);
})
}
function showId(idName) {
console.log(idName);
}
</script>
</body>
点击当前元素的时候可以正常打印出来所点击的元素的id
加上点击事件之后便会出现问题
<body>
<div id="full">
<div id="div1" class="child">2</div>
<div id="div2" class="child">3</div>
</div>
<button class="submit">提交</button>
<script src="js/jquery.min.js"></script>
<script>
$(document).ready(function () {
showdiv()
})
function showdiv() {
$('body').on('click', '.child', function () {
nodeId = $(this).attr('id')
console.log(nodeId);
showId(nodeId);
})
}
function showId(idName) {
console.log(idName);
$('.submit').on('click', function () {
console.log(idName);
})
}
</script>
</body>
当在调用的函数中用点击事件触发时,调用函数的触发会把之前点击的事件的值也打印出来,例如:
点击2,然后再点击提交按钮,会正常打印出div1的id,点击3,然后再点击提交按钮,会打印出div1和div2,然后再点击2,再点击提交,会打印出div1,div2和div1,会把之前的数值重新打印一边,为了解决这个问题,我们采用标记的形式,点击元素的时候设置标记为true,调用函数的时候再把标记位设置成false,这样可以避免多次触发。
<body>
<div id="full">
<div id="div1" class="child">2</div>
<div id="div2" class="child">3</div>
</div>
<button class="submit">提交</button>
<script src="js/jquery.min.js"></script>
<script>
$(document).ready(function () {
showdiv()
})
function showdiv() {
$('body').on('click', '.child', function () {
flag = true;
nodeId = $(this).attr('id')
console.log(nodeId);
showId(nodeId);
})
}
function showId(idName) {
console.log(idName);
$('.submit').on('click', function () {
if (flag) {
console.log(idName);
flag = false;
} else {
return;
}
})
}
</script>
</body>
这样的话,点击提交按钮的时候回调函数中的事件就会只能触发一次,效果如下
点击2,然后点击提交,点击3,然后点击提交,均只会回调一次,但是第二次点击打印出来的却是第一次点击传过来的参数,这时候我们需要再点击原来元素的时候调用的函数中将传过来的参数赋值给一个变量,然后在点击事件中打印这个变量,这样便可以打印出来正确的值了。
<body>
<div id="full">
<div id="div1" class="child">2</div>
<div id="div2" class="child">3</div>
</div>
<button class="submit">提交</button>
<script src="js/jquery.min.js"></script>
<script>
$(document).ready(function () {
showdiv()
})
function showdiv() {
$('body').on('click', '.child', function () {
flag = true;
nodeId = $(this).attr('id')
console.log(nodeId);
showId(nodeId);
})
}
function showId(idName) {
console.log(idName);
nodeName = idName;
$('.submit').on('click', function () {
if (flag) {
console.log(idName+”传递过来的值“);
console.log(nodeName+”赋值的变量“);
flag = false;
} else {
return;
}
})
}
</script>
</body>
效果如下,点击2,然后点击提交,点击3,然后点击提交,点击2,然后点击图标,虽然传递过来的值打印仍然会有问题,但是我们通过赋值的变量,可以正确的返回点击元素的id,我们可以通过这个id来正确的将弹出框中的表单所创建的dom节点插入到点击的列表中了
实际项目的效果和代码如下:
项目效果图:
代码:
列表
<div class="clause_task_blocks nodrag">
<div class="clause_task_blotit">
<div style="display: flex;align-items: flex-end">
<div class="clause_task_blotitname">项目评估</div>
<div class="clause_task_blotitnum">3</div>
</div>
<div class="clause_task_blotitmore"></div>
</div>
<div class="clause_task_main">
<div id="taskitem1" class="clause_task_items">
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish2.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会</div>
<div class="clause_task_item_icon" style="display: none"></div>
</div>
</div>
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish1.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会</div>
<div class="clause_task_item_icon" style="display: none"></div>
</div>
</div>
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish1.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会</div>
<div class="clause_task_item_icon">
<span class="iconfont icon-xiewrite18"></span>
<span class="clause_task_item_iconnum">1/2</span>
</div>
</div>
</div>
</div>
<div class="clause_task_item_add">
<div class="clause_task_item_addicon">+</div>
<div class="clause_task_item_addicon_local" style="display: none"></div>
</div>
</div>
</div>
<div class="clause_task_blocks">
<div class="clause_task_blotit">
<div style="display: flex;align-items: flex-end">
<div class="clause_task_blotitname">项目评估</div>
<div class="clause_task_blotitnum">3</div>
</div>
<div class="clause_task_blotitmore"></div>
</div>
<div class="clause_task_main">
<div id="taskitem2" class="clause_task_items">
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish1.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会</div>
<div class="clause_task_item_icon" style="display: none"></div>
</div>
</div>
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish1.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会项目启动会</div>
<div class="clause_task_item_icon" style="display: none"></div>
</div>
</div>
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish1.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会</div>
<div class="clause_task_item_icon">
<span class="iconfont icon-xiewrite18"></span>
<span class="clause_task_item_iconnum">1/2</span>
</div>
</div>
</div>
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish1.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会</div>
<div class="clause_task_item_icon" style="display: none"></div>
</div>
</div>
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish1.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会</div>
<div class="clause_task_item_icon" style="display: none"></div>
</div>
</div>
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish1.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会</div>
<div class="clause_task_item_icon" style="display: none"></div>
</div>
</div>
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish1.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会</div>
<div class="clause_task_item_icon" style="display: none"></div>
</div>
</div>
<div class="clause_task_item">
<div class="clause_task_item_imp imp3"></div>
<div class="clause_task_item_select">
<div class="clause_task_item_selectbox">
<img class="select-checkbox" src="images/finish1.png">
</div>
</div>
<div class="clause_task_item_body">
<div class="clause_task_item_title">项目启动会</div>
<div class="clause_task_item_icon" style="display: none"></div>
</div>
</div>
</div>
<div class="clause_task_item_add">
<div class="clause_task_item_addicon">+</div>
<div class="clause_task_item_addicon_local" style="display: none"></div>
</div>
</div>
</div>
js代码:注释的为该效果的代码
<script>
$(document).ready(function ()
sort();
showAddItem(); //调用显示表单框的函数
showAddBlo();
addTaskBlo();
hideAdd();
buttonColor();
selectCheckBox()
});
//显示出弹出框的函数
function showAddItem() {
$('body').on('click','.clause_task_item_addicon', function (e) {
e.stopPropagation();
flag = true;
$(this).hide();
$(this).next().show();
let x = $(this).next().offset().left;
$('#additem').show();
$('#additem').css('left', x);
addNodeId = $(this).parent().prev().attr('id');
addTaskItem(addNodeId);
})
}
function showAddBlo() {
$('body').on('click','.clause_task_bloadd', function (e) {
e.stopPropagation();
$(this).next().show();
})
}
function hideAdd() {
$('body').on('click','.clause_task_additem', function (e) {
e.stopPropagation()
})
$('body').on('click','.clause_task_addblo', function (e) {
e.stopPropagation()
})
$('body').on('click',function () {
hidefrom()
})
}
function hidefrom() {
$('.clause_task_additem').hide();
$('.clause_task_addblo').hide();
$('.clause_task_item_addicon').show();
}
//通过弹出框增加列表的函数
function addTaskItem(addNodeId) {
addNode = addNodeId;
$('body').on('click', '.clause_task_additem_submit',function (e) {
if(flag){
e.stopPropagation();
let nodeValue = $(this).parent().prev().find('input').val();
let divNode = '<div class="clause_task_item">\n' +
' <div class="clause_task_item_imp imp3"></div>\n' +
' <div class="clause_task_item_select">\n' +
' <div class="clause_task_item_selectbox">\n' +
' <img class="select-checkbox" src="images/finish1.png">\n' +
' </div>\n' +
' </div>\n' +
' <div class="clause_task_item_body">\n' +
' <div class="clause_task_item_title">'+ nodeValue +'</div>\n' +
' <div class="clause_task_item_icon" style="display: none">\n' +
' <span class="iconfont icon-xiewrite18"></span>\n' +
' <span class="clause_task_item_iconnum"></span>\n' +
' </div>\n' +
' </div>\n' +
' </div>';
$(this).parent().prev().find('input').val('');
$("#"+addNode).append(divNode);
hidefrom();
flag = false;
} else {
return
}
})
}
function addTaskBlo() {
$('.clause_task_addblo_submit').on('click', function () {
let nodeValue = $(this).parent().prev().find('input').val();
let divNode = '<div class="clause_task_blocks">\n' +
' <div class="clause_task_blotit">\n' +
' <div style="display: flex;align-items: flex-end">\n' +
' <div class="clause_task_blotitname">'+ nodeValue +'</div>\n' +
' <div class="clause_task_blotitnum">0</div>\n' +
' </div>\n' +
' <div class="clause_task_blotitmore"></div>\n' +
' </div>\n' +
' <div class="clause_task_main">\n' +
' <div id="taskitem7" class="clause_task_items">\n' +
' </div>\n' +
' <div class="clause_task_item_add">\n' +
' <div class="clause_task_item_addicon">+</div>\n' +
' <div class="clause_task_item_addicon_local" style="display: none"></div>\n' +
' </div>\n' +
' </div>\n' +
' </div>'
$(this).parent().parent().parent().parent().before(divNode);
$(this).parent().prev().find('input').val('');
hidefrom();
sort();
})
}
function buttonColor() {
$('body').on('input propertychange', 'input', function () {
let inpValue = $(this).val();
if(inpValue.length == 0){
$(this).parent().next().find('button').addClass('clause_task_addblo_submitfalse');
$(this).parent().next().find('button').removeClass('clause_task_addblo_submittrue');
}else {
$(this).parent().next().find('button').removeClass('clause_task_addblo_submitfalse');
$(this).parent().next().find('button').addClass('clause_task_addblo_submittrue');
}
})
function selectCheckBox() {
$('body').on('click','.select-checkbox',function () {
var divsrc = $(this).attr("src");
console.log(divsrc)
if(divsrc == 'images/finish1.png'){
$(this).attr('src','images/finish2.png')
}else {
$(this).attr('src','images/finish1.png')
}
})
}
function sort() {
var taskblo = document.getElementById('taskblo');
lists = document.getElementsByClassName('clause_task_items');
list = [];
for (let i = 0; i < lists.length; i++){
list[i] = document.getElementById(lists[i].id)
}
new Sortable(taskblo, {
animation: 100
})
for (let i = 0; i < list.length; i++){
new Sortable(list[i], {
group: 'list',
animation: 100
})
}
}
</script>