Thursday, February 11, 2010

Moving data between two ListBoxes - Difference between jQuery 1.3.2 and jQuery 1.4

Recentlya new version of jQuery was released. This version is 1.4. As with anynew version, ultimately you see what used to take you several lines ofcode, now rolled up into a single line of code. I'm going todemonstrate a question I've been asked many times on forums and that ishow to move selected items from one<select> element toanother. I'll show you how you could do it using jQuery 1.3.2 and howto minimize the code by using the new 1.4 library. Before we begin, thenew version can be found here.
The HTML
TheHTML for this is pretty straight forward. It's simply two<select> elements side by side with two buttons betweenthem. Here's what it looks like:
Move data between two listboxes
<form method="get">             
      <select id="SelectLeft" multiple="multiple">
            <option value="1">Australia</option>
            <option value="2">New Zealand</option>
            <option value="3">Canada</option>
            <option value="4">USA</option>
            <option value="5">France</option>
      </select>
           
      <input id="MoveRight" type="button" value=" >> " />
      <input id="MoveLeft" type="button" value=" << " />
       
      <select id="SelectRight" multiple="multiple">          
      </select>
</form>
jQuery 1.3.2
Below is the code to move the selected items from each <select> element. 
<script language="javascript" type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>   
    <script language="javascript" type="text/javascript">
        $(function() {
            $("#MoveRight,#MoveLeft").click(function(event) {
                var id = $(event.target).attr("id");
                var selectFrom = id == "MoveRight" ? "#SelectLeft" : "#SelectRight";
                var moveTo = id == "MoveRight" ? "#SelectRight" : "#SelectLeft";
                var selectedItems = $(selectFrom + " :selected");
                var output = [];               
                $.each(selectedItems, function(key, e) {                   
                  output.push('<option value="' + e.value + '">' + e.text + '</option>');
                                });
               
                $(moveTo).append(output.join(""));               
                selectedItems.remove();
            });
        });
    </script>
I'vebound one event handler for the button clicks. To decide whichdirection the selected items should go, I'm using the ID of the buttonthat fired the event:
var id = $(event.target).attr("id");
var selectFrom = id == "MoveRight" ? "#SelectLeft" : "#SelectRight";
var moveTo = id == "MoveRight" ? "#SelectRight" : "#SelectLeft";
Next I create an empty array and loop through every selected item and add it to the end of the array:
var output = [];               
$.each(selectedItems, function(key, e) {                   
      output.push('<option value="' + e.value + '">' + e.text + '</option>');
});
Then I append it to the end of the <select> element and remove the moved items:
$(moveTo).append(output.join(""));               
selectedItems.remove();
Overall I think that's a good approach. In jQuery 1.4 we can make this better!
jQuery 1.4
In the new jQuery library, the team has introduced a new function called toArray. This retrieves all the DOM elements contained in the jQuery set, as an array. So here's the code below:
<script language="javascript" type="text/javascript" src="http://code.jquery.com/jquery-1.4.1.min.js"></script>
    <script language="javascript" type="text/javascript">
        $(function() {
            $("#MoveRight,#MoveLeft").click(function(event) {
                var id = $(event.target).attr("id");
                var selectFrom = id == "MoveRight" ? "#SelectLeft" : "#SelectRight";
                var moveTo = id == "MoveRight" ? "#SelectRight" : "#SelectLeft";
                var selectedItems = $(selectFrom + " :selected").toArray();
                $(moveTo).append(selectedItems);
                selectedItems.remove;
            });
        });
    </script> 
The first thing you'll notice is the code has been reduced. Thanks to the toArray function, I have eliminated the need to loop through the selected items. Now they're returned as an array:
var selectedItems = $(selectFrom + " :selected").toArray();
And to add them to the <select> element, I no longer need to use the join function, I simply append them:
$(moveTo).append(selectedItems);
 Nice and simple! The entire source code of this article can be downloaded over here

No comments: