on 9/12/09 8:02 AM, Alex Weber at alexwebe...@gmail.com wrote:

> 
> Hey, two suggestions:
> 
> First off, if you're using JSON data to populate it then I assume the
> data will come from an external source and you are only generating it
> in your script for testing purposes.
Actually, I wrote this for a friend that insists the data set is small and
wants to just embed it in the page.

> In that case, perfect.  If not,
> and the data is actually hard-coded, then you shouldn't really be
> doing it like this!
I would agree but I have no choice here.
 
> Finally, what I would do and its really just matter of preference,
> instead of doing this:
> 
>                         $("select[name='model']").empty();
>                             $.each(model, function (){
> $("select[name='model']").append('<option value="' + this + '">' +
> this +
> '</option>') });
>                             }
Agreed I missed this.
> I would do the following:
> 
> var options = '';
> $.each(model, function (){
>     html += '<option value="' + this + '">' + this + '</option>');
> });
> $("select[name='model']").html(options);
> 
> It should increase the performance because you cache all the data in a
> variable and insert it into the select in one step, instead of
> appending it during each iteration.
> Using html() will overwrite the previous contents too, so no need to
> use empty() either.
> 

Well this is what I currently have. I think I am doing too many .each()
though. Isn't there a "get" or "find" that I can do to eliminate iterating
thru all sets to find the selected manufacturer then add the models?

Here is what I currently have.

$(document).ready(function () {
    var items = {    "Aquatech"     : ["Canon 5D Mark II","Nikon D3","Nikon
D3x","Canon 1D","Canon 1Ds","Canon 1Ds Mark II","Canon 1Ds Mark III","Canon
1D Mark III","Canon 30D","Canon EOS 5D","Canon 20D","Nikon D200","Nikon
D700","Canon 40D","Canon 50D","Nikon D300"],
                    "Canon"     : ["Canon HF20","Canon SD800","Canon
A570","Canon G10","Canon G11"],
                    "Ikelite"     : ["Olympus FE-360","Canon 20D","Canon
Rebel 350 / XT","Nikon D300","Canon Rebel 400 / XTi","Canon 30D","Canon
5D","Nikon D200","Nikon D40","Nikon D40x","Nikon D60","Olympus
SP-510","Olympus E-500","Canon G9","Nikon P5000","Nikon P5100","Nikon
D80","Nikon D90","Nikon P6000","Nikon D700","Canon 40D","Canon 50D","Canon
G10","Canon 5D Mark II","Canon Rebel 500 / T1i","Canon Rebel 450 / XSi"],
                    "Sony"         : ["Sony W300"]
                };

    $.each( items, function(brand){
            $("select[name='manufacturer']").append('<option value="' +
brand + '">' + brand + '</option>');
            });
    $("select[name='model']").attr('disabled','disabled');
    $("select[name='manufacturer']").change( function(){
            var man = this.value;
            if( !this.selectedIndex )
$("select[name='model']").empty().attr('disabled','disabled');
            $.each( items, function(brand, model){    if(brand==man) {
                                                        var options=
'<option value="">Select a brand</option>';
                                                        $.each(model,
function (){ options += '<option value="' + this + '">' + this +
'</option>'});
                   
$("select[name='model']").removeAttr('disabled').html(options);
                                                        }
                    });
            });
});


Any suggestions to simplify this would be appreciated.


> Cheers,
> 
> Alex
> 
> On Sep 12, 12:48 am, "Steffan A. Cline" <stef...@hldns.com> wrote:
>> on 9/11/09 8:02 PM, Steffan Cline at stef...@hldns.com wrote:
>> 
>> 
>> 
>> 
>> 
>>> on 9/11/09 5:15 PM, Steffan Cline at stef...@hldns.com wrote:
>> 
>>>> Perhaps I am not Googling correctly to find the data I am after.
>> 
>>>> I want to have a select that upon making a choice will add elements to a
>>>> second select. I've seen code to do this using ajax calls but what if I
>>>> embed the data into the page in a JSON format? I am looking for a good
>>>> example of this. Anyone seen one?
>> 
>>> Ok, getting closer:
>> 
>>> $(document).ready(function () {
>>>     var items = {    "Aquatech"     : ["Canon 5D Mark II","Nikon D3","Nikon
>>> D3x","Canon 1D","Canon 1Ds","Canon 1Ds Mark II","Canon 1Ds Mark III","Canon
>>> 1D Mark III","Canon 30D","Canon EOS 5D","Canon 20D","Nikon D200","Nikon
>>> D700","Canon 40D","Canon 50D","Nikon D300"],
>>>                     "Canon"     : ["Canon HF20","Canon SD800","Canon
>>> A570","Canon G10","Canon G11"],
>>>                     "Ikelite"     : ["Olympus FE-360","Canon 20D","Canon
>>> Rebel 350 / XT","Nikon D300","Canon Rebel 400 / XTi","Canon 30D","Canon
>>> 5D","Nikon D200","Nikon D40","Nikon D40x","Nikon D60","Olympus
>>> SP-510","Olympus E-500","Canon G9","Nikon P5000","Nikon P5100","Nikon
>>> D80","Nikon D90","Nikon P6000","Nikon D700","Canon 40D","Canon 50D","Canon
>>> G10","Canon 5D Mark II","Canon Rebel 500 / T1i","Canon Rebel 450 / XSi"],
>>>                     "Sony"         : ["Sony W300"]
>>>                 };
>> 
>>>     $.each( items, function(brand){
>>>             $("select[name='manufacturer']").append('<option value="' +
>>> brand + '">' + brand + '</option>');
>>>             });
>>>     $("select[name='manufacturer']").change( function(){
>>>         $
>> 
>>>         });
>>> });
>> 
>>> So, that is populating the first. Great. Now, it's a matter of finding the
>>> chosen value and then adding the elements of the array to the select.
>> 
>>> A nudge anyone?
>> 
>> This is ugly but works. Any suggestions on how to shorten it?
>> 
>> $(document).ready(function () {
>>     var items = {    "Aquatech"     : ["Canon 5D Mark II","Nikon D3","Nikon
>> D3x","Canon 1D","Canon 1Ds","Canon 1Ds Mark II","Canon 1Ds Mark III","Canon
>> 1D Mark III","Canon 30D","Canon EOS 5D","Canon 20D","Nikon D200","Nikon
>> D700","Canon 40D","Canon 50D","Nikon D300"],
>>                     "Canon"     : ["Canon HF20","Canon SD800","Canon
>> A570","Canon G10","Canon G11"],
>>                     "Ikelite"     : ["Olympus FE-360","Canon 20D","Canon
>> Rebel 350 / XT","Nikon D300","Canon Rebel 400 / XTi","Canon 30D","Canon
>> 5D","Nikon D200","Nikon D40","Nikon D40x","Nikon D60","Olympus
>> SP-510","Olympus E-500","Canon G9","Nikon P5000","Nikon P5100","Nikon
>> D80","Nikon D90","Nikon P6000","Nikon D700","Canon 40D","Canon 50D","Canon
>> G10","Canon 5D Mark II","Canon Rebel 500 / T1i","Canon Rebel 450 / XSi"],
>>                     "Sony"         : ["Sony W300"]
>>                 };
>> 
>>     $.each( items, function(brand){
>>             $("select[name='manufacturer']").append('<option value="' +
>> brand + '">' + brand + '</option>');
>>             });
>>     $("select[name='manufacturer']").change( function(x){
>>             var man = this.value;
>>             $.each( items, function(brand, model){
>>                         if(brand==man) {
>>                             $("select[name='model']").empty();
>>                             $.each(model, function (){
>> $("select[name='model']").append('<option value="' + this + '">' + this +
>> '</option>') });
>>                             }
>>                     });
>> 
>>                 });
>> 
>> });
>> 
>> Thanks
>> 
>> Steffan



Thanks

Steffan




Reply via email to