【问题标题】:jQuery setting prop("selected", true) on multi select list in Chrome only works onceChrome中多选列表上的jQuery设置prop(“selected”,true)仅适用一次
【发布时间】:2012-09-25 22:24:17
【问题描述】:

当尝试将选择列表选项设置为选中以将选择列表滚动到该选项时,它适用于除 Chrome 之外的所有浏览器。在 Chrome 中它只工作一次,但连续的时间在 Chrome 中不起作用。如何确保在选择列表中设置选项的 selected 属性会将该选项滚动到视图中?

这是我的问题的一个例子 - http://jsfiddle.net/Z2rQG/

我用来在列表中选择一个选项以滚动查看的代码如下:

(function ($) {
    $.fn.scrollToOption = function (option) {
        var _option = $(option, this);
        // if option is in list
        if(_option) {
            // store the selection state
            var isSelected = _option.is(":selected");

            _option.prop("selected", true); // scroll to the option
            _option.prop("selected", isSelected);  // restore the selection state
        }
        return this;
    };
})(jQuery); 

编辑:我也尝试过scrollTo jQuery 插件,它在Chrome 中效果不佳。这是一个例子 - http://jsfiddle.net/kavun/TW4XK/

编辑:这是我正在尝试做的更清晰的示例。从选择列表中选择两个选项,然后将列表滚动到最后选择的选项。这适用于除 Chrome 和 Safari 之外的所有浏览器。在 Chrome 中,第一个选择滚动到选项,但第二个 $('#select option[value=""].prop('selected', true); 不滚动列表 - http://jsfiddle.net/kavun/uhnZH/

【问题讨论】:

  • 我开始认为这是 Chrome 的一个错误 - code.google.com/p/chromium/issues/detail?id=138217
  • 您的 jsfiddle 不包含带有 ID 测试的 HTML 元素,并且非常不清楚您希望它做什么。您是否尝试按照您的建议滚动到页面上的“元素”或下拉菜单中的选项值?
  • 它确实包含一个ID为test的元素,

标签: javascript jquery google-chrome scroll multi-select


【解决方案1】:

如果您的目标只是滚动到下拉列表中的某个值,您可以简单地使用valas demonstrated in this updated fiddle

$('#selectList').val(51);

这适用于任何浏览器。

如果您尝试根据下拉菜单中的值滚动到页面上的某个元素,您必须提供一个示例,让我们更接近您想要的内容,以便我们解决该特定场景.

【讨论】:

  • 是的,我的目标是滚动到下拉列表中的某个值。您的解决方案有效,但它取消了所有其他选项。我怎样才能保持所有以前选择的选项都被选中?
  • 我可以像这样保存状态,但即使最后一行代码也没有最终在 Chrome 中滚动列表 - jsfiddle.net/kavun/gbyjK
  • 在 IE9、Firefox 15、Opera 12 中测试。将列表滚动到最后选择的值,但 Chrome 22 和 Safari 5 不会将列表滚动到最后选择的值。
  • 是的,你是对的,我不明白你想保留选定的值并简单地附加一个新值。 @TimDown 似乎有答案! :)
【解决方案2】:

浏览器行为在选择多个选项时,滚动到哪个选项会滚动到哪个选项。但是,使用其selected 属性选择选项并设置<select> 元素的selectedIndex 属性似乎可以确保选择在所有主要浏览器中滚动到正确的位置。使用它,您可以获得正确的垂直滚动,选择您想要的选项,然后手动滚动选择。

Opera 似乎不完全支持 scrollTop 选择元素,因此该解决方案在 Opera 中不起作用。

演示:http://jsfiddle.net/uhnZH/10/

代码:

function selectAndScrollToOption(select, option) {
    $select = $(select);

    // Store the currently selected options
    var $selectedOptions = $select.find("option:selected");

    // Select the new option using its selected property and selectedIndex.
    // This seems to make the select scroll to the desired place in all major
    // browsers
    option.selected = true; // Required for old IE
    select.selectedIndex = option.index;

    // Measure the vertical scrolling
    var scrollTop = $select.scrollTop();

    // Re-select the original options
    $selectedOptions.prop("selected", true);

    // Scroll to the correct place
    $select.scrollTop(scrollTop);
}

【讨论】:

  • 这可以如我所愿,谢谢。所以关键是取消全选并设置selectedIndex。
  • 设置selectedIndex 实际上会自动取消选择所有,因此您可以删除$selectedOptions.prop("selected", false); 行。我会更新的。
  • 为什么这个解决方案对我不起作用?如果我选择一个值,我可以控制台记录正确的值,但我在浏览器中看到第一个元素...
  • @TakácsZsolt:哪个浏览器?
  • 任何 borwser... 我们可以用其他解决方案解决这个问题:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-16
相关资源
最近更新 更多