我的应用程序中有两个标签,一个是球员标签,另一个是教练标签。我在播放器标签中有一个function1,在教练标签中有function2。
功能1
var beforeList = $('#players').val()
$('#players').change(function () {
var afterList = $(this).val()
var selectedPlayer = ''
if (!beforeList) {
selectedPlayer = afterList[0]
$('parent option[value=' + selectedPlayer + ']').add()
$('#injuredPlayer option[value=' + selectedPlayer + ']').add()
} else if (!afterList) {
selectedPlayer = beforeList[0]
$('parent option[value=' + selectedPlayer + ']').remove()
$('#injuredPlayer option[value=' + selectedPlayer + ']').remove()
} else if (beforeList.length > afterList.length) {
selectedPlayer = getselectedPlayer(beforeList, afterList)
$('parent option[value=' + selectedPlayer + ']').remove()
$('#injuredPlayer option[value=' + selectedPlayer + ']').remove()
} else if (beforeList.length < afterList.length) {
selectedPlayer = getselectedPlayer(afterList, beforeList)
$('parent option[value=' + selectedPlayer + ']').add()
$('#injuredPlayer option[value=' + selectedPlayer + ']').add()
}
if (afterList) {
for (var i = 0; i < afterList.length; i++) {
var optionInParentB = ($('#dad option[value=' + afterList[i] + ']').length > 0)
var optionInParentA = ($('#mom option[value=' + afterList[i] + ']').length > 0)
var optionInInjuredPlayer = ($('#injuredPlayer option[value=' + afterList[i] + ']').length > 0)
if (!optionInParentB) {
$('<option/>', {value: afterList[i], html: afterList[i]}).appendTo('#dad')
}
if (!optionInParentA) {
$('<option/>', {value: afterList[i], html: afterList[i]}).appendTo('#mom')
}
if (!optionInInjuredPlayer){
$('<option/>', {value: afterList[i], html: afterList[i]}).appendTo('#injuredPlayer')
}
}
} else {
$('#mom').empty()
$('#dad').empty()
$('#injuredPlayer').empty()
}
beforeList = afterList
})
功能2
var beforeList = $('#coach').val()
$('#coach').change(function () {
var afterList = $(this).val()
var selectedCoach = ''
if (!beforeList) {
selectedCoach = afterList[0]
$('#injuredCoach option[value=' + selectedCoach + ']').add()
} else if (!afterList) {
selectedCoach = beforeList[0]
$('#injuredCoach option[value=' + selectedCoach + ']').remove()
} else if (beforeList.length > afterList.length) {
selectedCoach = getselectedCoach(beforeList, afterList)
$('#injuredCoach option[value=' + selectedCoach + ']').remove()
} else if (beforeList.length < afterList.length) {
selectedCoach = getselectedCoach(afterList, beforeList)
$('#injuredCoach option[value=' + selectedCoach + ']').add()
}
if (afterList) {
for (var i = 0; i < afterList.length; i++) {
var optionInInjuredCoach = ($('#injuredCoach option[value=' + afterList[i] + ']').length > 0)
if (!optionInInjuredCoach){
$('<option/>', {value: afterList[i], html: afterList[i]}).appendTo('#injuredCoach')
}
}
} else {
$('#injuredCoach').empty()
}
beforeList = afterList
})
当我看到两个功能非常相似时,唯一的区别是“播放器”选项卡有父母,而“教练”选项卡没有父母。我想知道这些功能是否很好,还是应该对其进行重构。如果我只保留它们,这是不好的做法吗?如果我要重构,则不确定如何使函数足够通用以适应两个选项卡的差异。我很想念,因为我是JS的新手,如果我误会了,请原谅我。
最佳答案
如果找不到元素(因为它不存在于文档中或因为它在函数运行时被隐藏),jQuery往往会在无提示的情况下失败。如果您可以接受但没有错误,那一切都很好。
否则,将某些重复的代码移到新的命名函数中,并向其传递一个参数,然后使用该参数确定是否对这些元素执行操作。像这样:
// define the function
function doCommonStuff(doDad) {
if (doDad) {
// do Dad stuff
}
}
// call the function
doCommonStuff(true);