简化 jQuery 代码 - slide 和 slideToggle
Simplify jQuery code - slide and slideToggle
如何简化当前的 JavaScript 代码?看起来太复杂了。
// Data from AJAX response
var errorsJSON = {
"name-pl": ["The name-pl field is required."],
"name-en": ["The name-en field is required."]
}
var errorString = $(this).data('validate-multiple');
var errorNamesArray = errorString.split(", ");
var ul = $('<ul class="list-unstyled">');
$.each(errorNamesArray, function(key, value) {
if (errorsJSON.hasOwnProperty(value)) {
ul.append(`<li><span class="help-block">${errorsJSON[value]}</span></li>`);
}
});
if (! $(this).is(':visible') && ul.children('li').length > 0) {
$(this).find('div.controls').empty().append(ul);
$(this).slideDown(500);
} else if ($(this).is(':visible') && ul.children('li').length === 0) {
$(this).slideUp(500);
} else if ($(this).is(':visible') && ul.children('li').length > 0) {
$(this).slideUp(500, function() {
$(this).find('div.controls').empty().append(ul);
$(this).slideDown(500);
});
}
这里我把html和js代码都贴上了http://jsfiddle.net/ecLjnnhm/
我想指出 errorsJSON
可以更改并取决于用户在输入字段中输入的内容。
可读性:使用变量来存储您的if
语句的条件,而不是每次都进行冗长的声明。
效率:将$(this)
缓存为变量,因此jQuery只需执行一次。
个人偏好:我建议在任何 jQuery 对象变量(如您的情况下的 ul
)前加上 $
表示它们是 jQuery 对象。
// Data from AJAX response
var errorsJSON = {
"name-pl": ["The name-pl field is required."],
"name-en": ["The name-en field is required."]
}
var errorString = $(this).data('validate-multiple');
var errorNamesArray = errorString.split(", ");
var $ul = $('<ul class="list-unstyled">');
var $t = $(this);
var isVisible = $t.is(':visible');
var hasErrors = false;
$.each(errorNamesArray, function(key, value) {
if (errorsJSON.hasOwnProperty(value)) {
$ul.append(`<li><span class="help-block">${errorsJSON[value]}</span></li>`);
hasErrors = true;
}
});
if (!isVisible && hasErrors) {
$t.find('div.controls').empty().append(ul);
$t.slideDown(500);
} else if (isVisible && !hasErrors) {
$t.slideUp(500);
} else if (isVisible && hasErrors) {
$t.slideUp(500, function() {
$t.find('div.controls').empty().append(ul);
$t.slideDown(500);
});
}
如何简化当前的 JavaScript 代码?看起来太复杂了。
// Data from AJAX response
var errorsJSON = {
"name-pl": ["The name-pl field is required."],
"name-en": ["The name-en field is required."]
}
var errorString = $(this).data('validate-multiple');
var errorNamesArray = errorString.split(", ");
var ul = $('<ul class="list-unstyled">');
$.each(errorNamesArray, function(key, value) {
if (errorsJSON.hasOwnProperty(value)) {
ul.append(`<li><span class="help-block">${errorsJSON[value]}</span></li>`);
}
});
if (! $(this).is(':visible') && ul.children('li').length > 0) {
$(this).find('div.controls').empty().append(ul);
$(this).slideDown(500);
} else if ($(this).is(':visible') && ul.children('li').length === 0) {
$(this).slideUp(500);
} else if ($(this).is(':visible') && ul.children('li').length > 0) {
$(this).slideUp(500, function() {
$(this).find('div.controls').empty().append(ul);
$(this).slideDown(500);
});
}
这里我把html和js代码都贴上了http://jsfiddle.net/ecLjnnhm/
我想指出 errorsJSON
可以更改并取决于用户在输入字段中输入的内容。
可读性:使用变量来存储您的if
语句的条件,而不是每次都进行冗长的声明。
效率:将$(this)
缓存为变量,因此jQuery只需执行一次。
个人偏好:我建议在任何 jQuery 对象变量(如您的情况下的 ul
)前加上 $
表示它们是 jQuery 对象。
// Data from AJAX response
var errorsJSON = {
"name-pl": ["The name-pl field is required."],
"name-en": ["The name-en field is required."]
}
var errorString = $(this).data('validate-multiple');
var errorNamesArray = errorString.split(", ");
var $ul = $('<ul class="list-unstyled">');
var $t = $(this);
var isVisible = $t.is(':visible');
var hasErrors = false;
$.each(errorNamesArray, function(key, value) {
if (errorsJSON.hasOwnProperty(value)) {
$ul.append(`<li><span class="help-block">${errorsJSON[value]}</span></li>`);
hasErrors = true;
}
});
if (!isVisible && hasErrors) {
$t.find('div.controls').empty().append(ul);
$t.slideDown(500);
} else if (isVisible && !hasErrors) {
$t.slideUp(500);
} else if (isVisible && hasErrors) {
$t.slideUp(500, function() {
$t.find('div.controls').empty().append(ul);
$t.slideDown(500);
});
}