2014-02-26 49 views
0

編輯: 我會解釋我的問題更好:選上的選擇:附加以及從多個刪除項目選擇

我有一個jQuery的插件創建一個多重選擇 - >選擇的。 我創建的Ajax + PHP + MYSQL選擇內部和選項如下:

$("#Enmarcado").append(array_items[x]); //inside a loop 
[...] 
$("#Enmarcado").trigger("chosen:updated"); 

現在,在選擇創建的,我想確認您可以選擇的選項:

這是我的選擇(HTML由Ajax + Php + MySQL創建)

<select id="Enmarcado" name="Enmarcado" data-placeholder="Elije los acabados..." class="chosen-select" multiple="" onchange="validar_enmarcado();"> 
    <option selected="" value="-1">Sin Acabados</option> 
    <option value="20">Kappa-fix 10mm (PVC)</option> 
    <option value="19">Kappa-fix 5mm (PVC)</option> 
    <option value="18">Laminado mate (75 micras producción)</option> 
    <option value="17">Laminado brillo (75 micras producción)</option> 
    <option value="16">Laminado mate (30-50 micras)</option> 
    <option value="15">Laminado brillo (30-50 micras)</option> 
    <option value="14">Plastificado brillo (125 micras)</option> 
    <option value="13">Plastificado brillo (75 - 80 micras)</option> 
    <option value="11">Adhesivado</option> 
    <option value="7">Kappa-fix 10 mm (cartón pluma alta densidad)</option> 
    <option value="6">Kappa-fix 5 mm (cartón pluma alta densidad)</option> 
    <option value="5">Laminado Mate (proteccion uv)</option> 
    <option value="4">Laminado Brillo (proteccion uv)</option> 
    <option value="3">Aluminio</option> 
    <option value="2">Bastidor 4 cm</option> 
    <option value="1">Bastidor 2 cm</option> 
    <option value="9">Dibond 3mm (sandwich aluminio + pvc)</option> 
</select> 

第一個選項是絕對的:如果選擇它,則清除所有其他選項。

<option selected="" value="-1">Sin Acabados</option> 

但如果我有選擇此選項,我想刪除它,並留下了新的選擇的選項時,我選擇另一個選項:

<option selected="" value="-1">Sin Acabados</option> <!-- Selected yet --> 
<option value="20">Kappa-fix 10mm (PVC)</option> <!-- I want select this, clearing value =-1 from the selected options. --> 

我的驗證功能:

EDIT2:

function validar_enmarcado(){ 
    var obj = document.getElementById ("Enmarcado"); 
    var enmarcado = new Array(); 

    var i = 0; 
    var u = 0; 
    var y = 0; 
    var cont = 0; 
    var opt1 = ""; 
    var opt2 = ""; 

    enmarcado = obj.selectedOptions; 
    if(enmarcado.length>1){ 
     for (i=0; opt1=enmarcado[i];i++){ 
      for (u=i+1; opt2=enmarcado[u];u++){ 
       if(opt1.value == -1){ 
        if(opt2.value >= 1){ 
         $("#Enmarcado").chosen(); 
         $("#Enmarcado").val(-1).trigger("chosen:updated"); 
         jAlert("Si elige Sin Acabados, no puede haber acabados en la lista.","Error de Acabado"); 
        } 
       } 
       if(opt1.value == 6 || opt1.value == 7 || opt1.value == 9 || opt1.value == 19 || opt1.value == 20){ 
        if(opt2.value == 6 || opt2.value == 7 || opt2.value == 9 || opt2.value == 19 || opt2.value == 20){ 
         jAlert("No puede elegir dos Soportes al mismo tiempo, elimino uno.","Error de Acabado"); 
        } 
       } 
       if(opt1.value == 1 || opt1.value == 2){ 
        if(opt2.value == 1 || opt2.value == 2){ 
         jAlert("No puede elegir dos Bastidores al mismo tiempo, elimino uno.","Error de Acabado"); 
        } 
       } 
       if(opt1.value == 4 || opt1.value == 5 || opt1.value == 13 || opt1.value == 14 || opt1.value == 15 || opt1.value == 16 || opt1.value == 17 || opt1.value == 18){ 
        if(opt2.value == 4 || opt2.value == 5 || opt2.value == 13 || opt2.value == 14 || opt2.value == 15 || opt2.value == 16 || opt2.value == 17 || opt2.value == 18){ 
         jAlert("No puede elegir dos Laminados o Plastificados al mismo tiempo, elimino uno.","Error de Acabado"); 
        } 
       } 
      } 
     } 
    } 
} 

問題是:

<option selected="" value="-1">Sin Acabados</option> 

這是默認選項,我想在選擇其他選項時將其刪除。但是我不知道如何去做,而不去除其他驗證。

我無法獲得從$(「#Enmarcado」)。selectedOptions []列表中選擇的最後一個選項,因爲多重選擇始終使用$(「#Enmarcado」)。選項[]順序重新排序所選項目。

感謝您的幫助!

EDIT3:

我剛搜了一下代碼,給我「選擇選項值」:

$("#Enmarcado").chosen().change(function() { 
    alert(+$(this).val()); 
}); 

但它向我發送NaN當我選擇多個選項。任何人都可以幫助插入我的驗證功能?

對此的迴應:刪除$(this).val()之前的+,它會向您發送一個包含所選值的字符串。但是,這不是我想要的:我需要知道哪個選項我剛選擇(或點擊)。

回答

1

我發現the solution通過使用谷歌今天:

var foo = []; 
$('#EnmarcadoChosen :selected').each(function(i, selected){ 
    foo[i] = $(selected).text(); // you can get the .value() too, and compare it. 
}); 
0

這可能是簡單的:$("#Enmarcado option[value='-1']").remove();

但是,如果上述在上下文不起作用,你可以通過VirtualTroll建立在this answer? (如果是的話,也可以贊同他的觀點。)在你的情況,可能是這樣的:

for (i=0; i<obj.length; i++) { 
    if (obj.options[i].value=='-1') { 
    obj.remove(i); 
    } 
} 

並注意一些溫和的方式,可能更容易打開默認回,後來:
一:$("#Enmarcado option[value='-1']").hide();
2:$("#Enmarcado option[value='-1']").attr('disabled','disabled');


UPDATE:

從下面新的意見,這是現在很清楚,你不尋找「刪除」或「刪除」選項 - 你只能看到明確,或「取消選擇」,選擇的選項。雖然我沒有知道的答案,我認爲我發現答案。 (同樣,如果這些信息適用於您,請提供他們的答案。)

(1)Note Sudhir Kesharwani's solution here。我認爲他的代碼清除所有選擇......所以,嘗試他的代碼的變化,將這個簡寫工作?:

$("#Enmarcado option[value='-1']").removeAttr("selected"); 
$("#Enmarcado").trigger("chosen:updated"); 

,(2),你可能會發現有用的文檔。在Joseph Silber's answer here中,他提到the documentation here,他說:「(找到標題爲更新動態選擇的部分)」。它解釋了在任何選擇更改後必須觸發chosen:updated

我希望幫助...

+0

在我的功能validar_enmarcado()我可以刪除所有選項當我選擇與第一種選擇: '$( 「#Enmarcado」)選擇(); (複製選擇 $(「#Enmarcado」)。val(-1).trigger(「chosen:updated」); //選擇第一個選項' 但是當我選擇第一個選項時,我想在選擇其他選項時將其刪除。 但我不想從obj.option []中刪除選項,我只想從obj.selectedOptions []中刪除它們; 我的問題是不是命令,是logarythm: 我可以刪除一個循環的選項和'obj.selectedOptions [I] .selected = FALSE;' –

+0

@BarragánLouisenbairn那麼,是不是要* *選擇其他選項時,「取消選擇」**該值(默認值)? –

+0

是的!而已!但我不想失去其他驗證: 1.-當我點擊默認值,所有其他選項是「未選中」。 –