2008-10-07 6 views
23

this question yanıtlarını kullanarak, başka bir seçim kutusunun seçimini temel alarak bir seçim kutusunu doldurabildim. (I posted my answer here) Verileri, sunucu tarafında yerleşik, bir .js dosyasında depolanan ve html sayfasında başvurulan bir dizi yapısından çekmek.javascript ve jquery kullanarak, ilgili yapı kutularını dizi yapısıyla doldurmak için

Şimdi üçüncü bir seçim kutusu eklemek istiyorum. Verilerin 3 set olsaydı (model yapmak, seçenekler) bu (sözde kod) gibi bir şey:

cars : [Honda[Accord[Lx, Dx]], [Civic[2dr, Hatchback]], 
    [Toyota[Camry[Blk, Red]], [Prius[2dr,4dr]] 

Ör: Honda seçildi, sonraki seçim kutusu [Accord Civic] ve Accord olsaydı olurdu seçilen sonraki seçim kutusu olurdu [Lx Dx]

nasıl

1) veri saklamak için bir dizi yapı oluşturabilir? ,

2) I aşağıdaki oluşturabilir sonraki seçme kutusunun

sayesinde

DÜZENLEME

gerekli referans değerleri için bir seçme kutusundan değeri kullanabilir şekilde fakat referansları, bir seçim kutusu

var cars = [ 
{"makes" : "Honda", 
    "models" : [ 
    {'Accord' : ["2dr","4dr"]} , 
    {'CRV' : ["2dr","Hatchback"]} , 
    {'Pilot': ["base","superDuper"] } ] 
}, 
{"makes" :"Toyota", 
    "models" : [ 
    {'Prius' : ["green","reallyGreen"]} , 
    {'Camry' : ["sporty","square"]} , 
    {'Corolla' : ["cheap","superFly"] } ] 
} ] ;    

alert(cars[0].models[0].Accord[0]); ---> 2dr 

cevap

45

böyle veri yapısını tercih:

var carMakers = [ 
    { name: 'Honda', models: [ 
      { name: 'Accord', features: ['2dr', '4dr'] }, 
      { name: 'CRV', features: ['2dr', 'Hatchback'] }, 
      { name: 'Pilot', features: ['base', 'superDuper'] } 
     ]}, 

    { name: 'Toyota', models: [ 
      { name: 'Prius', features: ['green', 'superGreen'] }, 
      { name: 'Camry', features: ['sporty', 'square'] }, 
      { name: 'Corolla', features: ['cheap', 'superFly'] } 
     ]} 
]; 

id yıllardan üç seçim listeleri Verilen: 'yapıcı', 'modeli' ve 'özellikleri' Ben bu güzel kendini olduğuna inanıyoruz (bu bunları değiştirebilirsiniz açıklayıcı): @Marko Dunic gelen cevaba

// returns array of elements whose 'prop' property is 'value' 
function filterByProperty(arr, prop, value) { 
    return $.grep(arr, function (item) { return item[prop] == value }); 
} 

// populates select list from array of items given as objects: { name: 'text', value: 'value' } 
function populateSelect(el, items) { 
    el.options.length = 0; 
    if (items.length > 0) 
     el.options[0] = new Option('please select', ''); 

    $.each(items, function() { 
     el.options[el.options.length] = new Option(this.name, this.value); 
    }); 
} 

// initialization 
$(document).ready(function() { 
    // populating 1st select list 
    populateSelect($('#maker').get(0), $.map(carMakers, function(maker) { return { name: maker.name, value: maker.name} })); 

    // populating 2nd select list 
    $('#maker').bind('change', function() { 
     var makerName = this.value, 
      carMaker = filterByProperty(carMakers, 'name', makerName), 
      models = []; 

     if (carMaker.length > 0) 
      models = $.map(carMaker[0].models, function(model) { return { name: model.name, value: makerName + '.' + model.name} }); 

     populateSelect($('#model').get(0), models); 
     $('#model').trigger('change'); 
    }); 

    // populating 3rd select list 
    $('#model').bind('change', function() { 
     var nameAndModel = this.value.split('.'), 
      features = []; 

     if (2 == nameAndModel.length) { 
      var makerName = nameAndModel[0], 
       carModel = nameAndModel[1], 
       carMaker = filterByProperty(carMakers, 'name', makerName); 

      if (carMaker.length > 0) { 
       var model = filterByProperty(carMaker[0].models, 'name', carModel) 

       if (model.length > 0) 
        features = $.map(model[0].features, function(feature) { return { name: feature, value: makerName + '.' + carModel + '.' + feature} }) 
      } 
     } 

     populateSelect($('#feature').get(0), features); 
    }) 

    // alerting value on 3rd select list change 
    $('#feature').bind('change', function() { 
     if (this.value.length > 0) 
      alert(this.value); 
    }) 
}); 
+0

teşekkürler -

"Çözümler mümkün olduğunca basit, ancak hiçbir basit olmalı". Ben kodunuzu çalıştı ve o amele, ama tam olarak nasıl çalıştığını ... Ben dizi yapısını kullanıyorum later..but geri gelecektir öğrenmek için şu anda vaktim yok ... ve ben şimdi ben düşünüyorum Bu dizileri nasıl oluşturacağınızı anlar. Tekrar teşekkürler –

+0

Veri yapısı aslında bir Javascript nesnesidir. http://www.hunlock.com/blogs/Mastering_JSON_%28_JavaScript_Object_Notation_%29 – BalusC

+1

$ .grep ve bu sadece ustalar vuruştur için $ .map kullanma: Burada iyi bir JSON öğretici bulabilirsiniz. Fantastik çözüm, sadece benzer bir şey için bir temel olarak kullandım ve bunun için daha iyi bir programcı gibi hissediyorum. Müthiş çözüm. – hendrixski

1

yardımcı olmaya yardımcı olacak şekilde çözemezsiniz. Seçme kutusunu değiştirmek için here'a bakın. Ne isterseniz, ben sizin için doğru işi yapacak JSON düşünüyorum. Neyse, ben senin yerinde olsaydım, şu şekilde yaparım: İlk seçimi değiştirdiğimde, bir ajax isteği yapıyorum. Ajax cevabı ile ikinci kutuyu dolduracağım. İkinci kutu için de aynı ve orada doğru veriyle doldurulmuş üçüncü kutu var.

3

sayesinde, 3 seçme kutuları doldurmak için başvurulabilir bir dizi (veri) yapı inşa etmek mümkün oldu. Uygulama kodunu kullanmamıştım çünkü tam olarak anlamadım çünkü ... gönderildiği gibi çalışıyor. JQuery'yi öğrendiğimde bu koda geri döneceğim. Kodum aşağıda nakledilir

<html><head> 
<script language="Javascript" src="javascript/jquery-1.2.6.min.js"></script> 
<script type="text/JavaScript"> 
var cars = [ 
{ name: 'Honda', models: [ 
{ name: 'Accord', features: ['2dr', '4dr'] }, 
{ name: 'CRV', features: ['2dr', 'Hatchback'] }, 
{ name: 'Pilot', features: ['base', 'superDuper'] } 
    ]}, 
{ name: 'Toyota', models: [ 
{ name: 'Prius', features: ['green', 'superGreen'] }, 
{ name: 'Camry', features: ['sporty', 'square'] }, 
{ name: 'Corolla', features: ['cheap', 'superFly'] } 
    ] 
} 
]; 
$(function() { 
var options = '' ; 
for (var i = 0; i < cars.length; i++) { 
    var opt = cars[i].name ; 
    if (i == 0){ options += '<option selected value="' + opt + '">' + opt + '</option>'; } 
    else {options += '<option value="' + opt + '">' + opt + '</option>'; } 
} 
$("#maker").html(options); // populate select box with array 

var options = '' ; 
for (var i=0; i < cars[0].models.length; i++) { 
    var opt = cars[0].models[0].name ; 
    if (i==0){options += '<option selected value="' + opt + '">' + opt + '</option>';} 
    else {options += '<option value="' + opt + '">' + opt + '</option>';} 
} 
$("#model").html(options); // populate select box with array 

var options = '' ; 
for (var i=0; i < cars[0].models[0].features.length; i++) { 
    var opt = cars[0].models[0].features[i] ; 
    if (i==0){options += '<option selected value="' + opt + '">' + opt + '</option>';} 
    else {options += '<option value="' + opt + '">' + opt + '</option>';} 
} 
$("#feature").html(options); // populate select box with array 

$("#maker").bind("click", 
    function() { 
     $("#model").children().remove() ;  // clear select box 
     for(var i=0; i<cars.length; i++) { 
      if (cars[i].name == this.value) { 
       var options = '' ; 
       for (var j=0; j < cars[i].models.length; j++) { 
        var opt= cars[i].models[j].name ; 
        if (j==0) {options += '<option selected value="' + opt + '">' + opt + '</option>';} 
        else {options += '<option value="' + opt + '">' + opt + '</option>';} 
       } 
       break; 
      } 
     } 
     $("#model").html(options); // populate select box with array 

     $("#feature").children().remove() ;  // clear select box 
     for(var i=0; i<cars.length; i++) { 
      for(var j=0; j<cars[i].models.length; j++) { 
       if(cars[i].models[j].name == $("#model").val()) { 
        var options = '' ; 
        for (var k=0; k < cars[i].models[j].features.length; k++) { 
         var opt = cars[i].models[j].features[k] ; 
         if (k==0){options += '<option selected value="' + opt + '">' + opt + '</option>';} 
         else {options += '<option value="' + opt + '">' + opt + '</option>';} 
        } 
        break; 
       } 
      } 
     } 
     $("#feature").html(options); // populate select box with array 
    }); 

    $("#model").bind("click", 
     function() { 
      $("#feature").children().remove() ;  // clear select box 
      for(var i=0; i<cars.length; i++) { 
       for(var j=0; j<cars[i].models.length; j++) { 
        if(cars[i].models[j].name == this.value) { 
         var options = '' ; 
         for (var k=0; k < cars[i].models[j].features.length; k++) { 
          var opt = cars[i].models[j].features[k] ; 
          if (k==0){options += '<option selected value="' + opt + '">' + opt + '</option>';} 
          else {options += '<option value="' + opt + '">' + opt + '</option>';} 
         } 
         break ; 
        } 
       } 
      } 
      $("#feature").html(options); // populate select box with array 
    }); 
}); 
</script> 
</head> <body> 
<div id="selection"> 
<select id="maker"size="10" style="{width=75px}"></select> 
<select id="model" size="10" style="{width=75px}"></select> 
<select id="feature" size="10"style="{width=75px}"></select> 
</div></body></html> 
+0

1. Teşekkür ederim :) – Zoe

2

(besbelli, jQuery'ye referans farklı olabilir) Gerçekten @Marko Dunic tarafından çözüm sevdim ama seçeneklere kimlikleri bağlanması için ihtiyaçlarımı karşılamadı. Kimliklerimi ekledikten sonra, JS kodunu daha da küçük ve basit hale getirebileceğimi fark ettim. Çözümüm, veri ilişkisel bir veritabanından geldiğinde ve JSON giriş verisi Birincil/Yabancı Anahtarlar ile ilişkisel yapıyı koruduğunda tasarlandı. O Make-Modeli 2. ve 3. metin kutuları ve Tip (yerli, ithal, tekne, vb) olan 1.seviye yani benim çözüm işlevini kaydırır

<html lang="en"> 
    <head> 
    <title>Populate a select dropdown list with jQuery - WebDev Ingredients</title> 
    <script type="text/javascript" src="js/jquery-1.4.2.js"></script> 
    <script type="text/javascript"> 
     var types = [ 
      { typeID: 1, name: 'Domestic'}, 
      { typeID: 2, name: 'Import'}, 
      { typeID: 3, name: 'Boat'} 
     ] 
     var makes = [ 
      { typeID: 1, makeID: 1, name: 'Chevy'}, 
      { typeID: 1, makeID: 2, name: 'Ford'}, 
      { typeID: 1, makeID: 3, name: 'Delorean'}, 
      { typeID: 2, makeID: 4, name: 'Honda'}, 
      { typeID: 2, makeID: 5, name: 'Toyota'}, 
      { typeID: 2, makeID: 6, name: 'Saab'} 
     ]  
     var model = [ 
      { makeID: 1, modelID: 1, name: 'Camaro'}, 
      { makeID: 1, modelID: 2, name: 'Chevelle'}, 
      { makeID: 1, modelID: 3, name: 'Nova'}, 
      { makeID: 2, modelID: 4, name: 'Focus'}, 
      { makeID: 2, modelID: 5, name: 'Galaxie'}, 
      { makeID: 2, modelID: 6, name: 'Mustang'}, 
      { makeID: 4, modelID: 7, name: 'Accord'}, 
      { makeID: 4, modelID: 8, name: 'Civic'}, 
      { makeID: 4, modelID: 9, name: 'Odyssey'}, 
      { makeID: 5, modelID: 10, name: 'Camry'}, 
      { makeID: 5, modelID: 11, name: 'Corolla'} 
     ] 
     // 
     // Put this in a stand alone .js file 
     // 
     // returns array of elements whose 'prop' property is 'value' 
     function filterByProperty(arr, prop, value) { 
      return $.grep(arr, function (item) { return item[prop] == value }); 
     } 
     // populates select list from array of items given as objects: { name: 'text', value: 'value' } 
     function populateSelect(el, items) { 
      el.options.length = 0; 
      if (items.length > 0) 
       el.options[0] = new Option('please select', ''); 
      $.each(items, function() { 
       el.options[el.options.length] = new Option(this.name, this.value); 
      }); 
     } 
     // initialization 
     $(document).ready(function() { 
      // populating 1st select list 
      populateSelect($('#sType').get(0), $.map(types, function(type) { return { name: type.name, value: type.typeID} }));  
      // populating 2nd select list 
      $('#sType').bind('change', function() { 
       var theModels = filterByProperty(makes, 'typeID', this.value); 
       populateSelect($('#sMake').get(0), $.map(theModels, function(make) { return { name: make.name, value: make.makeID} })); 
       $('#sMake').trigger('change'); 
      }); 
      // populating 3nd select list 
      $('#sMake').bind('change', function() { 
       var theSeries = filterByProperty(model, 'makeID', this.value); 
       populateSelect($('#sModel').get(0), $.map(theSeries, function(model) { return { name: model.name, value: model.modelID} })); 
      }); 
     }); 
    </script> 
    </head> 
    <body> 
    Enter values, click submit, and look at the post parameters 
    <form method="get" action="index.php"> 
      <div id="selection"> 
       <select id="sType" name="type_id" style="{width=75px}"></select> 
       <select id="sMake" name="make_id" style="{width=75px}"></select> 
       <select id="sModel" name="model_id" style="{width=75px}"></select> 
      </div> 
      <input type="submit"> 
    </form> 
    </body> 
</html> 

Uyarı: Burada JSON veridir.İyi biçimlendirmeyi korurken, kazan plakası JS'yi 23 satıra (daha az yorum) aldım.

JSON veri Type-Make-Modeli nadiren değiştirmek çünkü init üzerinde java Listelerinde önbelleğe alınır SQL sorguları görüntülemeye kadar çok kolaydır. Bu mimari zorlaştırmaktadır çünkü herhangi bir dinamik AJAX kullanmayın, ben mevcut değerlerin nispeten küçük bir listesi var, bu yüzden sadece sayfa isteği üzerine gönderin. Eğer cevap koymak çaba için A. Einstein