2011-04-26 24 views
7

estoy haciendo un selecto menú de plug-in para reemplazar los selecciona por defecto feas y ser consistente a través de diferentes sistemas operativos.Añadir atributo seleccionado la opción en el menú de selección con jQuery

Aquí está la demostración (sólo Firefox y WebKit)
http://spacirdesigns.com/selectMenu/

Ya se está trabajando, pero tengo problemas para asignar el atributo "seleccionado" para la opción. El código funciona con cualquier otro atributo pero no puedo hacer que funcione con el atributo seleccionado.

Esto funciona:

select.find('option') 
    .removeAttr('whatever') 
    .eq(index).attr('whatever', 'hello'); 

Esto no es así:

select.find('option') 
    .removeAttr('selected') 
    .eq(index).attr('selected', 'selected'); 

Y aquí está el código hasta ahora:

(function($){ 

     $.fn.selectMenu = function() { 

      var select = this; 
      select.hide(); 

      var title = select.attr('title'); 
      var arrow = 'img/arrow.png'; 
      var items = ''; 

      select 
       .children('option') 
       .each(function(){ 
        var item = $(this).text(); 
        if ($(this).val() != '') { 
         $(this).attr('value', item); 
        } 
        items += '<li>' + item + '</li>' 
       }); 

      var menuHtml = 
       '<ul class="selectMenu">' + 
       '<img src="' + arrow + '" alt=""/>' + 
       '<li>' + title + '</li>' + 
       '<ul>' + items + '</ul>' + 
       '</ul>'; 

      select.after(menuHtml); 

      var menu = $(this).next('ul'); 
      var list = menu.find('ul'); 

      menu 
       .hover(function(){}, function(){ 
        list.hide(); 
       }) 
       .children('li').hover(function(){ 
        list.show(); 
       }); 

      menu.find('ul li').click(function(){ 
       var index = $(this).index(); 
       menu.children('li').text($(this).text()); 
       select.find('option') 
        .removeAttr('selected') 
        .eq(index).attr('selected', 'selected'); 
       list.hide(); 
      }); 

     }; 

    })(jQuery); 
+0

¿Ha intentado utilizar '.attr ('selected', true)'? – NT3RP

+0

Yo sé que este plugin es compatible seleccionado: http://programmingdrunk.com/current-projects/dropdownReplacement/#use – mkoryak

+0

'.attr ('selected', true)' no funciona bien. – elclanrs

Respuesta

3

Salida this previous detailled answer on SO:

Si realmente quiere maitain salida HTML con el atributo seleccionado, y no sólo han jQuery maitaining la derecha selectedIndex atributo en el elemento de selección, se puede cortar con settAttr originales() Función :

select[0].options[select[0].selectedIndex].setAttribute('selected','selected'); 

Pero tan pronto como se lo sigue usando métodos jQuery para val() o ': seleccionado', que should'nt consigue cualquier problema, usted podría tener un problema sólo si estabas análisis de HTML para encontrar atributo seleccionado, algo que no deberías hacer, nunca.

+0

Tahnk usted. He encontrado este otro post también, muy útil http://stackoverflow.com/questions/3729741/jquery-cannot-set-selected-selected-via-attr-on-option-elements – elclanrs

+0

sí, que es la referencia correcta. – regilero

0

Teniendo en cuenta su último comentario Asumo que su problema es Firebug no tu código Por qué esto funciona con otros atributos, excepto "seleccionado", es que seleccionar una opción del menú desplegable no modifica el atributo seleccionado en el DOM. Te aseguro que no hay nada malo con tu código.

23

A partir de jQuery 1.6 "Para recuperar y cambiar las propiedades DOM tales como el estado marcado, seleccionado o deshabilitado de los elementos del formulario, use el método .prop()".

$("#someselect option[value=somevalue]").prop("selected", "selected") 
+2

Esta debe ser la respuesta más común, mucho más simple que el otro, los mayores –

+0

Gracias @sidarcy. Me ayudó mucho. Claro que debería estar arriba. – offshore

+0

¿No debería ser '.prop (" selected ", true)'? Como recuerdo, cuando se utiliza un enfoque antiguo para este caso, tiene que ser '.attr (" selected "," selected ")'. – rabudde

Cuestiones relacionadas