是否有更好、更干净的方式来编写这个条件脚本?它基本上做同样的事情,除了如果cloneVar
有类"之前",它改变哪一行它正在抓取(第一个或最后一个),并将.insertAfter
更改为.insertBefore
。
var cloneVar = $(this).parent().parent('.sortable');
if ($(cloneVar).hasClass('before')) {
var cloneRow = $(cloneVar).find('.sort-group .row:first');
$(cloneRow).clone(true).insertBefore(cloneRow)
.addClass('add').removeClass('first')
.find('input[type=text], textarea').val('')
.attr('name', function(index, name) {
return name.replace(/(d+)/, function(fullMatch, n) {
return Number(n) + 1;
});
}).parent().find('input, textarea').attr('id', function(index, id) {
return id.replace(/(d+)/, function(fullMatch, n) {
return Number(n) + 1;
});
}).parent().find('.delete').removeClass('visible');
return false;
} else {
var cloneRow = $(cloneVar).find('.sort-group .row:last');
$(cloneRow).clone(true).insertAfter(cloneRow)
.addClass('add').removeClass('first')
.find('input[type=text], textarea').val('')
.attr('name', function(index, name) {
return name.replace(/(d+)/, function(fullMatch, n) {
return Number(n) + 1;
});
}).parent().find('input, textarea').attr('id', function(index, id) {
return id.replace(/(d+)/, function(fullMatch, n) {
return Number(n) + 1;
});
}).parent().find('.delete').removeClass('visible');
return false;
}
// move this out to clean up, since you're doing the same thing in both spots
function incrementProp(index, prop) {
return prop.replace(/(d+)/, function (fullMatch, n) {
return Number(n) + 1;
});
}
var cloneRow;
if (cloneVar.hasClass('before') {
cloneRow = $(cloneVar).find('.sort-group .row:first');
insert = "insertBefore";
} else {
cloneRow = $(cloneVar).find('.sort-group .row:last');
insert = "insertAfter";
}
cloneRow.clone(true)[insert](cloneRow) // dynamically call function
.addClass('add').removeClass('first')
.find('input[type=text], textarea').val('')
.attr('name', incrementProp).end()
.find('input, textarea').attr('id', incrementProp)
.end().find('.delete').removeClass('visible');
return false;
实际问题:- 你可以根据cloneVar是否有相关的类来动态地构建选择器。然后运行通用代码
- 使用带字符串的括号表示法来调用insertBefore/insertAfter,具体取决于新元素的位置
额外的指针:
-
cloneVar
/cloneRow
已经是jQuery对象,所以你不需要在jQuery中再次包装 - 你可能想使用
end
而不是parent
-它恢复到你之前调用find
的集合,你不需要改变它,如果你修改你的DOM - 你做了很多链接,但是移动替换函数可以清理它很多
您可以只对更改的部分执行if:
var cloneRow = $(cloneVar).find('.sort-group .row:' +
/* do the check here */ (cloneVar.hasClass('before') ? 'first' : 'last'));
$(cloneRow).clone(true).insertBefore(cloneRow)
.addClass('add').removeClass('first')
.find('input[type=text], textarea').val('')
.attr('name', function(index, name) {
return name.replace(/(d+)/, function(fullMatch, n) {
return Number(n) + 1;
});
}).parent().find('input, textarea').attr('id', function(index, id) {
return id.replace(/(d+)/, function(fullMatch, n) {
return Number(n) + 1;
});
}).parent().find('.delete').removeClass('visible');
return false;
a ?B: c语法只是
的简写if (a) { b }; else { c };