简体   繁体   English

JQuery选择框和循环帮助

[英]JQuery Select Box and Loop Help

Thanks for reading. 谢谢阅读。 I'm a bit new to jQuery, and am trying to make a script I can include in all my websites to solve a problem that always drives me crazy... 我对jQuery有点新鲜,我正在尝试创建一个脚本,我可以在我的所有网站中包含这个脚本来解决一个让我疯狂的问题......

The problem: Select boxes with long options get cut off in Internet Explorer. 问题:选择具有长选项的框在Internet Explorer中被切断。 For example, these select boxes: http://discoverfire.com/test/select.php 例如,这些选择框: http//discoverfire.com/test/select.php

In Firefox they are fine, but in IE, the options are cut off to the width of the select when they drop down. 在Firefox中它们很好,但在IE中,当选项下拉时,选项被切断为选择的宽度。

The solution: What I am looking to do, is create a script that I can include in any page that will do the following: 解决方案:我要做的是创建一个脚本,我可以将其包含在将执行以下操作的任何页面中:

  1. Loop through all the selects on the page. 遍历页面上的所有选择。

  2. For each select: A. Loop through its options. 对于每个选择:A。循环选择它。 B. Find the width of the longest option. B.找到最长选项的宽度。 C. Bind a function to expand the select to that width on focus (or maybe click...). C.绑定一个函数,将select扩展到焦点上的宽度(或者点击......)。 D. Bind a function to shrink to it's original width on blur. D.绑定一个函数以缩小到模糊时的原始宽度。

I've managed to do most of step #2 for one select box. 我已经成功完成了一个选择框的第2步的大部分工作。

I found that getting the options width was a problem (especially in IE), so I looped through and copied the text of each option to a span, measured the span width, and used the longest one as the width the select will be expanded to. 我发现获取选项宽度是一个问题(特别是在IE中),所以我循环并将每个选项的文本复制到跨度,测量跨度宽度,并使用最长的选项作为宽度,选择将扩展到。 Perhaps somebody has a better idea. 也许有人有更好的主意。

Here is the code 这是代码

<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>

and the select: 和选择:

<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>

Hopefully this will run for you if you want to run it, or you can see it in action here: http://discoverfire.com/test/select.php . 希望如果你想运行它,它会为你运行,或者你可以在这里看到它: http//discoverfire.com/test/select.php

What I need help with: This needs a bit of polish, but seems to work ok if you specify the select box. 我需要帮助:这需要一点点润色,但如果指定选择框似乎可以正常工作。

However, I don't seem to be able to figure out how to apply it to all select boxes on the page with a loop. 但是,我似乎无法弄清楚如何将它应用于带有循环的页面上的所有选择框。 So far, I have this: 到目前为止,我有这个:

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

Also, is there a better way to get the length of the longest option for each select? 另外,有没有更好的方法来获得每个选择的最长选项的长度? The span is close, but not very exact. 跨度很接近,但不是很精确。 The problem is that IE returns zero for the option widths of the actual selects. 问题是IE为实际选择的选项宽度返回零。

Any ideas are very welcome, both for the questions asked, and any other improvements to my code. 对于提出的问题以及对我的代码的任何其他改进,非常欢迎任何想法。

Thanks!! 谢谢!!

To modify each select, try this: 要修改每个选择,请尝试以下操作:

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

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

  })

});

The second parameter (this) on the second jQuery call scopes the selecter ('option'), so it is essentially 'all option elements within this select'. 第二个jQuery调用的第二个参数(this)作用于选择器('option'),因此它基本上是'this select中的所有选项元素'。 You can think of that second parameter defaulting to 'document' if it's not supplied. 您可以将第二个参数默认为“文档”(如果未提供)。

I was able to replicate your results for all selects on a page in IE7 using this code, which I find much simpler than the span method you are using, but you can replace the "resize" function with whatever code suits your needs. 我能够使用此代码复制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);
    });
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM