[javascript] Ancho de lista desplegable en IE


Answers

Crear su propia lista desplegable es más doloroso de lo que vale. Puede usar JavaScript para hacer que el IE desplegable funcione.

Utiliza un poco de la biblioteca YUI y una extensión especial para arreglar cuadros de selección de IE.

Deberá incluir lo siguiente y ajustar sus elementos <select> en <span class="select-box">

Pon estos antes de la etiqueta corporal de tu página:

<script src="http://us.js2.yimg.com/us.js.yimg.com/lib/common/utils/2/yahoo_2.0.0-b3.js" type="text/javascript">
</script>
<script src="http://us.js2.yimg.com/us.js.yimg.com/lib/common/utils/2/event_2.0.0-b3.js" type="text/javascript">
</script>
<script src="http://us.js2.yimg.com/us.js.yimg.com/lib/common/utils/2/dom_2.0.2-b3.js" type="text/javascript">
</script>
<script src="ie-select-width-fix.js" type="text/javascript">
</script>
<script>
// for each select box you want to affect, apply this:
var s1 = new YAHOO.Hack.FixIESelectWidth( 's1' ); // s1 is the ID of the select box you want to affect
</script>

Edición de aceptación de publicación:

También puede hacer esto sin la biblioteca YUI y el control Hack. Todo lo que necesitas hacer es poner onmouseover = "this.style.width = 'auto'" onmouseout = "this.style.width = '100px'" (o lo que quieras) en el elemento de selección. El control YUI le da una buena animación pero no es necesario. Esta tarea también se puede realizar con jquery y otras bibliotecas (aunque no he encontrado documentación explícita para esto)

- enmienda a la edición:
IE tiene un problema con el onmouseout para seleccionar controles (no considera que las opciones de mouseover sean un mouseover en la selección). Esto hace que usar un mouseout sea muy complicado. La primera solución es la mejor que he encontrado hasta ahora.

Question

En IE, la lista desplegable tiene el mismo ancho que Dropbox (espero que tenga sentido) mientras que en Firefox el ancho de la lista desplegable varía según el contenido.

Esto básicamente significa que tengo que asegurarme de que la Dropbox sea lo suficientemente amplia como para mostrar la selección más larga posible. Esto hace que mi página se vea muy fea :(

¿Hay alguna solución para este problema? ¿Cómo puedo usar CSS para establecer diferentes anchuras para Dropbox y la lista desplegable?




No hay forma de hacerlo en IE6 / IE7 / IE8. El control es dibujado por la aplicación e IE simplemente no lo dibuja de esa manera. Su mejor opción es implementar su propio menú desplegable a través de HTML / CSS / JavaScript simple, si es tan importante tener el menú desplegable de un ancho y la lista de otro ancho.




En jQuery, esto funciona bastante bien. Supongamos que el menú desplegable tiene id = "menú desplegable".

$(document).ready(function(){

    $("#dropdown").mousedown(function(){
    if($.browser.msie) {
        $(this).css("width","auto");
    }
    });
    $("#dropdown").change(function(){
    if ($.browser.msie) {
        $(this).css("width","175px");
    }
    });

});



El enlace de hedgerwow (el trabajo de animación de YUI) en la primera mejor respuesta está roto, supongo que el dominio ha expirado. Copié el código antes de que caducara, por lo que puede encontrarlo aquí (el propietario del código me puede informar si estoy incumpliendo algún derecho de autor volviéndolo a cargar)

http://ciitronian.com/blog/programming/yui-button-mimicking-native-select-dropdown-avoid-width-problem/

En la misma publicación del blog, escribí acerca de cómo hacer un mismo elemento SELECCIONAR exactamente igual al normal usando el menú del botón YUI. ¡Echa un vistazo y avísame si esto ayuda!




Puede agregar un estilo directamente al elemento seleccionado:

<select name="foo" style="width: 200px">

Por lo tanto, este elemento seleccionado tendrá 200 píxeles de ancho.

Alternativamente, puede aplicar una clase o id al elemento y referenciarlo en una hoja de estilo




mira esto ... no es perfecto pero funciona y es solo para IE y no afecta a FF. Usé el javascript regular para onmousedown para establecer IE only fix ... pero el msie de jquery podría usarse también en onmousedown ... la idea principal es el "onchange" y en blur para que el cuadro de selección vuelva a la normalidad ... . decide que eres de su propio ancho para esos. Necesitaba el 35%

onmousedown="javascript:if(navigator.appName=='Microsoft Internet Explorer'){this.style.width='auto'}" 
onchange="this.style.width='35%'"
onblur="this.style.width='35%'"






Pensé en arrojar mi sombrero al ring. Hago una aplicación SaaS y tenía un menú selecto incrustado dentro de una mesa. Este método funcionó, pero sesgó todo en la tabla.

onmousedown="if(navigator.appName=='Microsoft Internet Explorer'){this.style.position='absolute';this.style.width='auto'}
onblur="if(navigator.appName=='Microsoft Internet Explorer'){this.style.position=''; this.style.width= '225px';}"

Entonces, lo que hice para mejorarlo fue arrojar la selección dentro de una divinidad z-indexada.

<td valign="top" style="width:225px; overflow:hidden;">
    <div style="position: absolute; z-index: 5;" onmousedown="var select = document.getElementById('select'); if(navigator.appName=='Microsoft Internet Explorer'){select.style.position='absolute';select.style.width='auto'}">
        <select name="select_name" id="select" style="width: 225px;" onblur="if(navigator.appName=='Microsoft Internet Explorer'){this.style.position=''; this.style.width= '225px';}" onChange="reportFormValues('filter_<?=$job_id?>','form_values')">
            <option value="0">All</option>
            <!--More Options-->
        </select>
    </div>
</td>



esta es la mejor manera de hacer esto:

select:focus{
    min-width:165px;
    width:auto;
    z-index:9999999999;
    position:absolute;
}

es exactamente lo mismo que la solución BalusC. Solo que esto es más fácil. ;)




Tenemos lo mismo en una lista desplegable asp:

En Firefox (3.0.5) el menú desplegable es el ancho del elemento más largo en el menú desplegable, que es como 600 píxeles de ancho o algo así.




He tenido que solucionar este problema y una vez se me ocurrió una solución bastante completa y escalable para IE6, 7 y 8 (y compatible con otros navegadores, obviamente). He escrito un artículo completo al respecto aquí: http://www.edgeoftheworld.fr/wp/work/dealing-with-fixed-sized-dropdown-lists-in-internet-explorer

Pensé que compartiría esto con las personas que todavía tienen este problema, ya que ninguna de las soluciones anteriores funciona en todos los casos (en mi opinión).




Usé la siguiente solución y parece funcionar bien en la mayoría de las situaciones.

<style>
select{width:100px}
</style>

<html>
<select onmousedown="if($.browser.msie){this.style.position='absolute';this.style.width='auto'}" onblur="this.style.position='';this.style.width=''">
  <option>One</option>
  <option>Two - A long option that gets cut off in IE</option>
</select>
</html>

Nota: el $ .browser.msie requiere jquery.




Esto es algo que he hecho tomando partes de las cosas de otras personas.

        $(document).ready(function () {
        if (document.all) {

            $('#<%=cboDisability.ClientID %>').mousedown(function () {
                $('#<%=cboDisability.ClientID %>').css({ 'width': 'auto' });
            });

            $('#<%=cboDisability.ClientID %>').blur(function () {
                $(this).css({ 'width': '208px' });
            });

            $('#<%=cboDisability.ClientID %>').change(function () {
                $('#<%=cboDisability.ClientID %>').css({ 'width': '208px' });
            });

            $('#<%=cboEthnicity.ClientID %>').mousedown(function () {
                $('#<%=cboEthnicity.ClientID %>').css({ 'width': 'auto' });
            });

            $('#<%=cboEthnicity.ClientID %>').blur(function () {
                $(this).css({ 'width': '208px' });
            });

            $('#<%=cboEthnicity.ClientID %>').change(function () {
                $('#<%=cboEthnicity.ClientID %>').css({ 'width': '208px' });
            });

        }
    });

donde cboEthnicity y cboDisability son listas desplegables con texto de opción más ancho que el ancho de la selección en sí.

Como puede ver, he especificado document.all ya que esto solo funciona en IE. Además, encerré las listas desplegables dentro de los elementos div como este:

<div id="dvEthnicity" style="width: 208px; overflow: hidden; position: relative; float: right;"><asp:DropDownList CssClass="select" ID="cboEthnicity" runat="server" DataTextField="description" DataValueField="id" Width="200px"></asp:DropDownList></div>

Esto se ocupa de los otros elementos que se mueven fuera de lugar cuando se expande tu menú desplegable. El único inconveniente aquí es que la imagen visual menulista desaparece cuando está seleccionando, pero regresa tan pronto como lo haya seleccionado.

Espero que esto ayude a alguien.




Related