JQuery选择框和循环帮助

时间:2008-10-13 19:05:52

标签: javascript jquery forms elements

感谢阅读。我对jQuery有点新鲜,我正在尝试创建一个脚本,我可以在我的所有网站中包含这些脚本来解决一个让我疯狂的问题......

问题: 选择具有长选项的框在Internet Explorer中被截断。例如,这些选择框: http://discoverfire.com/test/select.php

在Firefox中它们很好,但在IE中,当选项下拉时,选项被切断为选择的宽度。

解决方案: 我想要做的是创建一个脚本,我可以将其包含在任何将执行以下操作的页面中:

  1. 循环浏览页面上的所有选项。

  2. 对于每个选择: A.循环选择。 B.找到最长选项的宽度。 C.绑定一个函数,将select扩展到焦点上的宽度(或者点击......)。 D.将函数绑定到模糊时缩小到原始宽度。

  3. 我已经设法为一个选择框执行步骤#2的大部分工作。

    我发现获取选项宽度是一个问题(特别是在IE中),所以我循环并将每个选项的文本复制到跨度,测量跨度宽度,并使用最长的选项作为选择的宽度扩大到。也许有人有更好的主意。

    这是代码

    <script type='text/javascript'>
    
          $(function() {
    
             /*
             This function will:
                1. Create a data store for the select called ResizeToWidth.
                2. Populate it with the width of the longest option, as approximated by span width.
    
             The data store can then be used
             */
             // Make a temporary span to hold the text of the options.
             $('body').append("<span id='CurrentOptWidth'></span>");
    
             $("#TheSelect option").each(function(i){
    
                // If this is the first time through, zero out ResizeToWidth (or it will end up NaN).
                if ( isNaN( $(this).parent().data('ResizeToWidth') ) ) {
                   $(this).parent().data( 'OriginalWidth', $(this).parent().width() );
                   $(this).parent().data('ResizeToWidth', 0);
    
                   $('CurrentOptWidth').css('font-family', $(this).css('font-family') );
                   $('CurrentOptWidth').css('font-size', $(this).css('font-size') );
                   $('CurrentOptWidth').css('font-weight', $(this).css('font-weight') );
    
                }
    
                // Put the text of the current option into the span.
                $('#CurrentOptWidth').text( $(this).text() );
    
                // Set ResizeToWidth to the longer of a) the current opt width, or b) itself. 
                //So it will hold the width of the longest option when we are done
                ResizeToWidth = Math.max( $('#CurrentOptWidth').width() , $(this).parent().data('ResizeToWidth') );
    
                // Update parent ResizeToWidth data.
                $(this).parent().data('ResizeToWidth', ResizeToWidth)
    
              });
    
             // Remove the temporary span.
             $('#CurrentOptWidth').remove();
    
             $('#TheSelect').focus(function(){
                $(this).width( $(this).data('ResizeToWidth') );
             });
    
             $('#TheSelect').blur(function(){
                $(this).width( $(this).data('OriginalWidth') );
             });
    
    
               alert( $('#TheSelect').data('OriginalWidth') );
               alert( $('#TheSelect').data('ResizeToWidth') );
    
          });
    
    
       </script>
    

    和选择:

    <select id='TheSelect' style='width:50px;'>
       <option value='1'>One</option>
       <option value='2'>Two</option>
       <option value='3'>Three</option>
       <option value='42,693,748,756'>Forty-two billion, six-hundred and ninety-three million, seven-hundred-forty-some-odd..... </option>
       <option value='5'>Five</option>
       <option value='6'>Six</option>
       <option value='7'>Seven...</option>
    </select>
    

    希望如果你想运行它,它会为你运行,或者你可以在这里看到它:http://discoverfire.com/test/select.php

    我需要帮助: 这需要一点点润色,但如果指定选择框似乎可以正常工作。

    但是,我似乎无法弄清楚如何将它应用于带有循环的页面上的所有选择框。到目前为止,我有这个:

    $('select').each(
       function(i, select){
          // Get the options for the select here... can I use select.each...?
       }
    );
    

    另外,有没有更好的方法来获得每个选择的最长选项的长度?跨度很接近,但不是很精确。问题是IE为实际选择的选项宽度返回零。

    对于提出的问题以及对我的代码的任何其他改进,非常欢迎任何想法。

    谢谢!

2 个答案:

答案 0 :(得分:11)

要修改每个选择,请尝试以下操作:

$('select').each(function(){

  $('option', this).each(function() {
    // your normalizing script here

  })

});

第二个jQuery调用的第二个参数(this)是selecter('option')的范围,因此它实际上是'this select中的所有选项元素'。如果没有提供,你可以想到第二个参数默认为'document'。

答案 1 :(得分:5)

我能够使用此代码复制IE7页面上所有选择的结果,我发现它比您使用的span方法简单得多,但您可以用适合您需要的任何代码替换“resize”函数

function resize(selectId, size){
    var objSelect = document.getElementById(selectId);
    var maxlength = 0;
    if(objSelect){
        if(size){
            objSelect.style.width = size;
        } else {
            for (var i=0; i< objSelect.options.length; i++){
                if (objSelect[i].text.length > maxlength){
                    maxlength = objSelect[i].text.length;
                }
            }
            objSelect.style.width = maxlength * 9;
        }
    } 
}

$(document).ready(function(){
    $("select").focus(function(){
        resize($(this).attr("id"));
    });
    $("select").blur(function(){
        resize($(this).attr("id"), 40);
    });
});