【问题标题】:JavaScript get position of option element?JavaScript获取选项元素的位置?
【发布时间】:2012-03-30 18:54:58
【问题描述】:

我有一个网络应用程序需要知道多选列表中选项元素的位置(x/y 不是索引!)。它在 Firefox 中运行良好,但在 Chrome 或 IE 中没有骰子。

是否可以使用 JavaScript 在 Chrome/IE 中获取选项的位置?

这是我显示问题的小提琴:http://jsfiddle.net/jamiller619/Kbh4g/3/ 适用于 Firefox,但不适用于 IE/Chrome。

【问题讨论】:

  • 为什么需要这样做?
  • @j08691 因为我让用户将选项添加到已定义的选择列表中。我认为在新选项元素上方附加一个文本框会很好,这样他们就可以输入一个新值。我的选择列表可以轻松更改为 UL,但可能比使用 SELECT multiple=multiple 需要更多的工作
  • 嗯位置对我来说也总是0,很奇怪!您可以在评论中做您想做的事,而无需使用该职位,这可能会容易得多。

标签: javascript html position option


【解决方案1】:

简短回答 - 你不能(webkit 问题)。

但你可以作弊!!!

HTML:

<div style="position:relative">
<select multiple="multiple">
    <option>Test 1</option>
    <option>Test 2</option>
    <option>Test 3</option>
    <option>Test 4</option>
    <option>Test 5</option>
    <option>Test 6</option>
    <option>Test 7</option>
    <option>Test 8</option>
    <option>Test 9</option>
    <option>Test 10</option>
</select>
</div>
<br />
option position:<br />
Left: <span id="pos-x"></span><br />
Top: <span id="pos-y"></span>

CSS:

select
{
    font-size:20px;    
}​

JQuery:

$(function()
{    
    $('select').change(function() {
        var optionHeight = 20; // or get this value from the stylesheet or inline-style
        var textIndent = 1; // best guess or work it out using coordinate crosshair tool
        $('#pos-y').text((this.selectedIndex + 1) * optionHeight);
        $('#pos-x').text(this.offsetLeft + textIndent);
    });
});

这是一个快速而肮脏的解决方案!

更新

CSS:

select
{
    height: 150px;
    font-size: 20px;        
}

​ jQuery:

$(function()
{    
    $('select').change(function() {
        var fontSize = 20; // or get this value from the stylesheet or inline-style
        var lineHeight = fontSize + 4 // need a better calculation here
        var optionHeight = lineHeight;
        var textIndent = 1; // best guess or work it out using coordinate crosshair tool
        var top = (this.selectedIndex * optionHeight) - this.scrollTop; 
        $('#pos-y').text(top);
        $('#pos-x').text(this.offsetLeft + textIndent);
    });
});

【讨论】:

  • 大多数情况下字体大小不等于高度!另外,边框宽度、填充和边距呢?你可以让它这样工作,但它需要更多的时间。
  • 如果选择列表会滚动,您的代码pos-y 会出错。
  • @TomSchoffelen 选项元素不应该有边框、填充或边距,并且无论如何都不能在 chrome 中工作 - 加上 line-height 并不难解决
  • @user1113426 感谢您指出该错误 - 已在帖子中更正!
  • 您可能还想top += this.offSetTop;
猜你喜欢
  • 2010-11-18
  • 2010-12-18
  • 1970-01-01
  • 1970-01-01
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
相关资源
最近更新 更多