这个问题主要集中在如何在开发代码时管理代码,使其具有高适应性等.让我通过这个例子来解释,它会更有意义."如果我需要的话,我会加上赏金."
我们的服务器内存紧张,我们正在使用Javascript/Jquery将大量的排序工作推到客户端,以缓解这些问题.如果你想跟随,这就是小提琴.https://jsfiddle.net/ydc6ywuz/23/
这个代码带来了问题.
var sortSubSite = $('.AccessSitesLinks.False'); var subArr = sortSubSite.map(function(_, o){ return { t: $(o).text(), h: $(o).attr('href'), c: $(o).attr('class') }; }).get(); sortSubSite.each(function(i, o) { var classList = $(o).attr('class').split(/\s+/); $('.ContainingBox.AccessSitesLinks.True.'+ classList[2]).append($(o)); $(o).wrap(""); $(o).text(subArr[i].t); $(o).attr('href', subArr[i].h); $(o).attr('class', subArr[i].c + classList[2]); });
每个Home
站点都有这个类AccessSitesLinks True [Num]
.所以它的所有子网都会有AccessSitesLinks False [Num]
.我理解sortSubSite和SubSite是相似的,可以组合起来以便更具可扩展性,这也是问题的一部分.
新的业务要求是能够SubSites
按字母顺序排序.这就是问题发挥作用的地方.如何使用现有代码并重构它以不断满足业务需求?我可以像我一样使代码排序Home Sites
,但是,这似乎不可扩展,只是创建另一个函数来调用.我有科技部的变量,数组和函数按字母顺序排序已.从设计角度来看,我有什么遗漏的东西吗?这只是缺乏经验,所以我无法看到如何正确设计?
编辑
我想更多地澄清这个问题.是的,我$(o)
多次获得该对象,这可能效率低下.这个问题更多的是关于如何重新设计,而编码仍在继续,而不是持续的片断代码.
$(document).ready(function() {
setFields();
});
function setFields() {
var sortSite = $('.AccessSitesLinks.True');
var arr = sortSite.map(function(_, o) {
return {
t: $(o).text(),
h: $(o).attr('href'),
c: $(o).attr('class')
};
}).get();
arr.sort(function(o1, o2) {
return o1.t > o2.t ? 1 : o1.t < o2.t ? -1 : 0;
});
sortSite.each(function(i, o) {
$(o).text('+');
$(o).attr('href', arr[i].h);
$(o).attr('class', arr[i].c);
$(o).wrap("");
/// arr[i]c is: AccessSitesLinks True
$(o).removeAttr('href');
$(o).parent().append("" + arr[i].t + "");
});
var sortSubSite = $('.AccessSitesLinks.False');
var subArr = sortSubSite.map(function(_, o) {
return {
t: $(o).text(),
h: $(o).attr('href'),
c: $(o).attr('class')
};
}).get();
// Changes started from here
subArr.sort(function(o1, o2) {
return o1.t > o2.t ? 1 : o1.t < o2.t ? -1 : 0;
});
$.each(subArr, function(i, o) {
var a = $("." + o.c.split(" ").join(".") + '[href="' + o.h + '"]');
var n = o.c.split(" ")[2];
a.appendTo($('.ContainingBox.AccessSitesLinks.True.' + n));
$(a).removeClass(n).addClass(n + n).wrap("");
// Changes ended here and below commented is your code
/*var classList = $(o).attr('class').split(/\s+/);
$('.ContainingBox.AccessSitesLinks.True.'+ classList[2]).append($(o));
$(o).wrap("");
$(o).text(subArr[i].t);
$(o).attr('href', subArr[i].h);
$(o).attr('class', subArr[i].c + classList[2]);*/
});
$('.ContainingBox2').hide();
$('.ContainingBox').click(function() {
$('.ContainingBox2', this).toggle(); // p00f
});
$(".ContainingBox2").on({
mouseenter: function() {
$(this).data('bg2', $(this).css("background-color"));
$(this).css("background-color", "#e5f2ff");
},
mouseleave: function() {
$(this).css("background-color", $(this).data('bg2'));
}
});
}
.ContainingBox2 {
padding: 2px 15%;
}
.AccessSitesLinks.True {
padding: 2px 2%;
font-size: 1.2em;
width: 80%;
}
.AccessSitesLinks {
text-decoration: none !Important;
font-family: "Segoe UI", "Segoe", Tahoma, Helvetica, Arial, sans-serif;
color: #444;
font-size: 1em;
width: 80%;
margin: 2px
}