Move Up/Down List
In an earlier tip we discussed adding/removing items from a <SELECT> field using JavaScript. In this tip, we take the same concept involved in removing an item from a list (taking the currently selected item) and moving that item either up or down in the list. This technique can be used to provide a way for your end users to order a list of entries. Both functions are pretty straightforward. First, make sure it makes sense to move the entry (if there's only one value, then there's no sense in trying to move it) and make sure the user has selected an entry. Second, make sure the item can be moved (the first item cannot be moved up, the last item cannot be moved down). If the item can be moved, then swap the text and value with it's correct neighbor. That's it. Here's the "move up list" function:
function moveUpList(listField) {
if ( listField.length == -1) { // If the list is empty
alert("There are no values which can be moved!");
} else {
var selected = listField.selectedIndex;
if (selected == -1) {
alert("You must select an entry to be moved!");
} else { // Something is selected
if ( listField.length == 0 ) { // If there's only one in the list
alert("There is only one entry!\nThe one entry will remain in place.");
} else { // There's more than one in the list, rearrange the list order
if ( selected == 0 ) {
alert("The first entry in the list cannot be moved up.");
} else {
// Get the text/value of the one directly above the hightlighted entry as
// well as the highlighted entry; then flip them
var moveText1 = listField[selected-1].text;
var moveText2 = listField[selected].text;
var moveValue1 = listField[selected-1].value;
var moveValue2 = listField[selected].value;
listField[selected].text = moveText1;
listField[selected].value = moveValue1;
listField[selected-1].text = moveText2;
listField[selected-1].value = moveValue2;
listField.selectedIndex = selected-1; // Select the one that was selected before
} // Ends the check for selecting one which can be moved
} // Ends the check for there only being one in the list to begin with
} // Ends the check for there being something selected
} // Ends the check for there being none in the list
}
Hopefully the code makes sense. It is commented pretty well, so that should help. For moving down in the list, the code is quite similar:
function moveDownList(listField) {
if ( listField.length == -1) { // If the list is empty
alert("There are no values which can be moved!");
} else {
var selected = listField.selectedIndex;
if (selected == -1) {
alert("You must select an entry to be moved!");
} else { // Something is selected
if ( listField.length == 0 ) { // If there's only one in the list
alert("There is only one entry!\nThe one entry will remain in place.");
} else { // There's more than one in the list, rearrange the list order
if ( selected == listField.length-1 ) {
alert("The last entry in the list cannot be moved down.");
} else {
// Get the text/value of the one directly below the hightlighted entry as
// well as the highlighted entry; then flip them
var moveText1 = listField[selected+1].text;
var moveText2 = listField[selected].text;
var moveValue1 = listField[selected+1].value;
var moveValue2 = listField[selected].value;
listField[selected].text = moveText1;
listField[selected].value = moveValue1;
listField[selected+1].text = moveText2;
listField[selected+1].value = moveValue2;
listField.selectedIndex = selected+1; // Select the one that was selected before
} // Ends the check for selecting one which can be moved
} // Ends the check for there only being one in the list to begin with
} // Ends the check for there being something selected
} // Ends the check for there being none in the list
}
With the four functions outlined in two tips, you should be able to have buttons for working with <SELECT> tags using JavaScript.