jquery - Chrome 的 offset() 返回选项的空值

标签 jquery google-chrome firefox

我无法计算选择中选项的偏移位置:

<select multiple="true">
    <option>asdf</option>
    <option id="bar">qwer</option>
</select>

$("#bar").offset()

Chrome 返回(任何 jQuery 版本,如 1.7.2、1.9 已测试):

{top: 0, left: 0} 

FF 返回:

{top: 26, left: 9}

我需要FF返回之类的职位。 Chrome 有解决方法吗?

http://jsfiddle.net/YrRLx/

最佳答案

啊...我能想到的一个解决方案是用 ul 对象替换 select,并附加事件处理程序以将 select 同步到 ul。在 li 元素上调用 .offset() 在 FF 和 Chrome 上都能按预期工作。

因此,如果单击 li 元素,它将更新其背景颜色并更新隐藏选择的选定值。这样,当提交表单时,会发送正确的值。

http://jsfiddle.net/hqYqh/

HTML:

<select id="mySelect" multiple="true">
    <option>2011</option>
    <option>2012</option>
    <option>2013</option>
    <option>2014</option>
    <option>2015</option>
    <option>2016</option>
    <option>2017</option>
    <option>2018</option>
    <option>2019</option>
</select>

CSS:

ul.select {
    display: inline-block;
    border: 1px solid black;
    list-style: none;
    margin: 0;
    padding: 2px;
    height: 80px;
    overflow: auto;
    width: 50px;
}

ul.select li {
    background-color: none;
    cursor: pointer;
}

ul.select li.selected {
    background-color: skyblue;
}

JS:

var $select = $('#mySelect');
var $ul = $('<ul class="select">').on('click', 'li', function() {
    $(this).parent().find('li').removeClass('selected');
    $(this).addClass('selected');
    $select.val($(this).text()).change();
});

$select.find('option').each(function() {
    var $li = $('<li>').text($(this).text());
    $ul.append($li);
});

$select.hide().after($ul);

$select.change(function() {
    alert('Offset of ' + $(this).val() + ' is ' + JSON.stringify($('li.selected').offset()));
});

已编辑

所以,我按照Huangism的建议尝试了另一种方法,使用选择元素的offset()和scrollTop()。

唯一不可用的是选项元素的高度。所以我尝试使用 font-size 进行估计,但它并不完美,我必须在 Chrome 上添加魔数(Magic Number) 3 才能获得准确的偏移量。如果你能算出option元素的高度,就不用处理上面所有的ul/li业务了。

这里是:

http://jsfiddle.net/hqYqh/2/

optionOffset = function($option) {
    var i = $option.index();
    var h = Number($option.css('font-size').replace(/px/, '')) + 3; // Cannot get the height of the option element :(
    var $select = $option.parent();
    var offset = $select.offset();
    offset.top += i*h - $select.scrollTop();
    return offset;
}

关于jquery - Chrome 的 offset() 返回选项的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15357993/

相关文章:

javascript - 如何在 HTML5 中不使用 flash 将文本复制到剪贴板?

javascript - S.browser_fallback_url 是什么时候在 Chrome 中引入的?

google-chrome - 如何使用开发者工具在 Chrome 中保存所有缓存的图像

javascript - 在 Chrome 和 Firefox 中的 Javascript 中报告了 Cryptic "Script Error."

javascript - 如何在 mysql 查询中使用 jquery 变量

jquery - 使用 `Deferred` 进行错误处理

javascript - 如何使用 jquery 使 jquery 旋钮只读?

c# - mvc Controller 返回 'html data' 而不是 View

javascript - 如何使用 Javascript 作为 accesskey 覆盖/禁用 Firefox 菜单快捷键

jquery - 使用 jquery 获取左边距在 Firefox 中不起作用