代码之家  ›  专栏  ›  技术社区  ›  Cay

HTML select元素在您键入时使用哪种算法来显示结果?

  •  1
  • Cay  · 技术社区  · 15 年前

    我尝试在flash(as3)中复制HTML选择元素(下拉列表或组合框)。

    在大多数浏览器中,当您有一个焦点并且键入了一些内容时,组合框将尝试在其选项中查找值并显示最近的值。我想知道用什么样的算法来解决这个问题。 我不认为 Levenshtein 或者类似的,因为它只适用于字符串的开头。

    我在想,它的工作原理是保存一个已经写入内容的缓冲区,并试图从中找到一个字符串…如果找不到任何内容,它将清除缓冲区,并搜索以最后一个按下的字符开头的字符串。

    我已经制作了这个模型,它工作得很好,但有一点需要注意…在HTML中,当您重复按同一个键时,它将在以该字符开头的所有选项之间旋转。我想我可以解决这个问题,但我想知道是否有人已经完成了,来比较算法…它变成了一个非常复杂的代码来测试和调试,我不确定我是否涵盖了所有的可能性…

    4 回复  |  直到 15 年前
        1
  •  4
  •   bobince    15 年前

    表单小部件对键盘交互的反应是不标准的,不同的浏览器也不一致。从脚本创建Ersatz表单控件时,这始终是一个问题。

    在HTML中,当您重复按同一个键时,它将在以该字符开头的所有选项之间旋转。

    这项功能来自于Windows,非常不直观。确切的规则不是那样的,非常模糊,并且在IE和Opera中与其他浏览器相比有不同的结果。

    依我看,这种行为是非常不可取的。因为没有一个普通用户能够预测规则的工作方式,所以我个人会把它忽略掉,只选择第一个选项来匹配键入的leftstring。这对您来说更容易编码,也更容易让用户理解。

        2
  •  2
  •   Alex Bagnolini    15 年前

    刚刚在火狐上做了一些测试,我注意到(这不是官方信息,只是猜测):

    • Key 按下事件:
      • Esc(仅限Firefox):清除缓冲区
      • 向上/向下箭头:在列表上向上/向下移动,清除缓冲区
      • 向上/向下翻页:在列表上向上/向下移动20,清除缓冲区
      • 主页:移到列表顶部,清除缓冲区
      • 结束:移动到列表末尾,清除缓冲区
      • 其他:
        • 空缓冲区?
          • 是的:添加 key 缓冲器
        • buffer.length == 1 钥匙 与上次按下的键相同吗?
          • 是:从开始进行下一项 钥匙 .
          • 不:添加 钥匙 buffer 搜索下一个项目,从 缓冲区 .
    • 1.5秒通过事件:清除缓冲区

    当然,这需要一个计时器。

        3
  •  0
  •   Matti Lyra    15 年前

    我不知道浏览器中使用的是什么算法,但我想知道的是序列对齐或最长的通用子序列算法。它允许您将字符串的任何部分与字符串的任何其他部分匹配(匹配的子字符串之间可能有间隙)。但速度不是很快。

    http://en.wikipedia.org/wiki/Sequence_alignment

    麻省理工学院开放课程软件网站上也有一些非常好的讲座视频。

    http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-046JFall-2005/VideoLectures/detail/embed15.htm

        4
  •  0
  •   Boolean    15 年前

    在HTML中,当您重复按同一个键时,它将在以该字符开头的所有选项之间旋转。我想我可以解决这个问题,但我想知道是否有人已经完成了,来比较算法。

    您可能希望在每次按键后重置到下拉列表的顶部,然后搜索附加的缓冲区。