2013-05-20 44 views
0

会有更好,更干净的方式来编写这个条件脚本吗?它基本上是做同样的事情,除非cloneVar有“之前”类,它会更改它抓取的行(第一个或最后一个)并将.insertAfter更改为.insertBefore有条件的jQuery格式

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; 
} 
+0

你并不需要的一切链成一个巨大的线。分开来。 – Blender

回答

1
// 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
  • 你做了很多链接,但是移动中的替换功能可以进行清理了很多
+0

BOOM!这很好。感谢丹尼斯和戴夫的答案! –

0

你可以做的,如果关于改变的一个部分:

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; 

的一个? B:C语法只是

if (a) { b }; else { c }; 
+2

'cloneVar'已经是一个jQuery对象,所以你不需要再把它放在'$()'中。 – Dennis

+0

已修复。谢谢。 – dave