【问题标题】:Undesired "flashing" in Jquery dropdown menu?Jquery下拉菜单中不需要的“闪烁”?
【发布时间】:2011-02-01 09:13:43
【问题描述】:

我有以下 Jquery:

$("#collapse-menu > li > a").click(function() {
    $(this).toggleClass("expanded").toggleClass("collapsed").find("+ ul").slideToggle("medium");
});

它的基本作用是展开或折叠包含下拉菜单的嵌套“列表”菜单(简化示例):

<ul id="collapse-menu">
   <li><a class="expanded">Basic Details</a>
      <ul>
         <li>
            <select> .... </select>
         </li>
         <li>
            <select> .... </select>
         </li>

除了在任何下拉菜单中选择了较大的值外,代码工作得非常好。此时,单击时,菜单仍会正确展开/折叠,但在此过程中会快速“闪烁”,就好像整个元素正在以某种方式被重置一样。数据本身很好,但不想要的是闪烁。

奇怪的是,如果在下拉列表中选择了一个小值,则没有闪烁。选择大值时(例如,在年龄下降到18-99的年龄下降)时,闪烁开始发生。

谁能告诉我为什么会这样?或者是否有导致此问题的 Jquery 有问题。

谢谢。

更新:

为此添加赏金。已经在网上尝试了一些类似的插件/解决方案,但是当默认选择大的下拉值时,它们似乎都遇到了这种“闪烁”的问题。

如果有帮助,这里有一个典型的类似解决方案:http://www.i-marco.nl/weblog/jquery-accordion-menu/index_collapsed.html# ...但是当在手风琴内添加下拉菜单时,它会遇到同样的问题。

我希望有人有一个干净的解决方案,而不是需要以某种方式破解它。

【问题讨论】:

  • 出于好奇,为什么要使用这么大的下拉菜单?还有其他(更好的)方法可以强制输入 2 位数字、最小值 18 等。这将使您提出的问题消失,并使您的应用程序更易于使用(恕我直言)启动。我的一般经验法则是下拉列表不应包含超过 10 个项目,绝对不要超过 20 个。
  • @GalacticCowboy:谢谢,但在这种情况下需要长下拉菜单。这是呈现所需表单元素的最简单的方式。例如,它包括一个国家下拉菜单(220 个选项)。
  • 我认为选择列表(下拉菜单)最多可以包含 100 个元素,只要它们按逻辑排序以便用户可以快速浏览它们。当您意识到可用性几乎消失时,选择具有 200 多个选项的列表。
  • 每种情况都不同。无论如何,问题不在于可用性。没有比在选择中列出国家更好的方法了,它超过了 200 个选项。
  • 不是一个真正的答案,但您是否考虑过至少为用户提供自动完成功能而不是正常的下拉菜单bassistance.de/jquery-plugins/jquery-plugin-autocomplete

标签: javascript jquery drop-down-menu toggle slide


【解决方案1】:

根据我的观察:这个问题似乎与操作系统有关。选择是由系统绘制的,因为它们是系统控件。在我的 Linux 机器上,http://jsbin.com/ixake 示例中的闪烁动画没有问题。我希望你在 Windows (r) 上测试过它

看起来每次重新绘制时,选择都会“滚动”到正确的值。这在制作动画时经常发生。

最简单的解决方案是将系统选择替换为基于 html 的选择以消除系统依赖性。有一些不显眼的 jquery 插件可以为你做这件事。

如果第一个不太好,请尝试 this 或从 here 中选择任何一个。

之后你的动画应该只依赖于 JS 和样式。

【讨论】:

  • 谢谢,使用一些插件是一种选择,但是对于这样一个简单的问题会产生很多麻烦。我有大约 20 个嵌套的下拉列表(必须是),所有这些都通过生成它们的 PHP 表单类获取特定于上下文的值,一些通过基于其他下拉选择的 ajax 加载动态内容,表单是可发布的等。当问题只是美学上的烦恼时,开始合并插件就变得太多了。
  • 你说的不对。你只需要调用 $('select').whateverThePluginIsCalled() 就可以了。这是jquery。没有合并任何东西。只需添加脚本标签并在就绪事件中运行该函数。从服务器上看不出任何区别
  • 如果您继续使用系统控件,您将永远无法摆脱这种影响。
  • 嗯……再看一遍,基本的组合框看起来确实很简单。将在截止日期前试一试并报告。
  • 解决这个问题的有效技巧(如果有的话)肯定会比这复杂得多。祝你在最后期限前好运。
【解决方案2】:

我认为问题在于每次调整元素大小时,下拉菜单都会滚动到所选元素,这会导致闪烁。

答案是将每个选择保存在 javascript 中(在更改时说),然后在动画开始时取消选择该值,然后在动画停止时恢复它。这将为您提供与选择较小值时相同的性能,同时保留用户的选择。

您可能还希望确保在过渡阶段不能提交表单,否则您将返回错误的值。

【讨论】:

  • 谢谢 - 我怀疑你是对的。如果没有更好的答案出现,将在截止日期前测试并报告。从理论上讲,这听起来是迄今为止最好的解决方案。
  • 这应该可行,但它会在应用程序中造成很多混乱,并且在未来开发中每次选择数量的变化都会导致复杂性。 (尤其是与调用 jquery 插件的单行代码相比)
【解决方案3】:

我个人认为自动完成可能真的是要走的路。但是,我有一个想法,通过替换一个假的短选择来隐藏长选择会使幻灯片更平滑。似乎在我测试的一个浏览器(Firefox 3.0.18)上工作得更好。代码可能会被清理,并且存在一个错误,即由于内部滚动条,有时选择默认情况下与大小不匹配,但这不应该太难伪造。

$("#collapse-menu > li > a").click(function() {
    var was_expanded = $(this).hasClass('expanded');
    var uls = $(this).toggleClass("expanded").toggleClass("collapsed").find('+ ul');
    if (was_expanded) {
        $(this).parent().find('select').each(function() {
            var fake = $('<select class="fake"><option>' + $(this).val() + '</option></select>');
            $(this).parent().append(fake);
            $(this).hide();
        })
        uls.slideUp('medium', function() { });
    } else {
        $('.fake').remove();
        $('select').show();
        uls.slideDown('medium', function() { });
     }
});

【讨论】:

  • 谢谢,但这个解决方案失败了。不幸的是,闪烁比不添加任何东西更糟糕。在这种情况下,自动完成不是一个合适的选项,因为我在手风琴中有几个选择。
【解决方案4】:

你可以做的是在动画 ul 之前禁用选择列表。

        $("#collapse-menu > li > a").click(function() {
            $(this)
                .toggleClass("expanded").toggleClass("collapsed")
                .find("+ ul").find("select").attr("disabled","disabled").end()
                .slideToggle("medium",function(){
                    $(this).find("select").each(function(){this.disabled=false;});
                });
        });

试一试并报告。

您可能希望设置 (CSS) 禁用选择列表的样式,使其看起来与非禁用选择列表相同。


注意事项

以上有一个副作用,即在提交表单时不提交所选值。如果这对您来说是个问题,那么我建议您在制作动画之前从选择列表中删除除所选选项之外的所有选项,然后在动画完成后将它们全部重新添加。如果这对您不起作用,naugtur 建议使用 HTML 样式的选择列表可能是最好的选择。

附注不要费心尝试使用选择列表上的只读属性...它不存在。

【讨论】:

  • 谢谢,但这个解决方案失败了。闪烁仍然存在,现在增加了等待禁用清除的“延迟”。如果只选择了选择中的小值,则闪烁消失,表明此解决方案没有达到预期的效果。
  • 嗯,对我有用。我不知道您所说的“等待残疾人清除”是什么意思
  • 我认为你应该接受 naugtur 对 HTML 选择列表的建议。
猜你喜欢
  • 1970-01-01
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多