使用HTML5(datalist)自动填充’包含’方法,而不只是’开始’

前端之家收集整理的这篇文章主要介绍了使用HTML5(datalist)自动填充’包含’方法,而不只是’开始’前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
(我找不到,但是我又不知道如何搜索它。)

我想使用< input list = xxx>和< datalist id = xxx>要获得自动完成,但是我希望浏览器通过“包含”方法匹配所有选项,而不是“开始”,这似乎是标准的。有办法吗

如果不是简单的,有没有办法强制显示我想显示的建议,而不是浏览器匹配的建议?假设我正在键入“foo”,我想显示选项“bar”和“baz”。我可以强迫用户使用吗?如果我只是用这些(用JS)填写数据记录器,浏览器仍然会执行“开始”检查,并将其过滤掉。

我想要最终控制datalist选项显示。不是在它的UI,灵活性,可访问性等,所以我不想完全重画。甚至不建议一个jQuery插件

如果我能最终控制表单元素验证,为什么不自动完成,对吧?

编辑:我现在看到,Firefox确实使用’包含’方法…这甚至不是一个标准?有什么办法强制这个吗我可以改变Firefox的方式吗?

编辑:我做了这个来说明我想要的:http://jsfiddle.net/rudiedirkx/r3jbfpxw/

> HTMLWG’s specs on [list]
> W3’s specs on datalist
> DavidWalsh example
> HONGKIAT’s summary on behaviors..?

解决方法

‘包含’的方法

也许这是你正在寻找(你的问题的第1部分)。

它伴随着“开始”的限制,并在进行选择时进行更改。

  1. 'use strict';
  2. function updateList(that) {
  3. if (!that) {
  4. return;
  5. }
  6. var lastValue = that.lastValue,value = that.value,array = [],pos = value.indexOf('|'),start = that.selectionStart,end = that.selectionEnd,options;
  7.  
  8. if (that.options) {
  9. options = that.options;
  10. } else {
  11. options = Object.keys(that.list.options).map(function (option) {
  12. return that.list.options[option].value;
  13. });
  14. that.options = options;
  15. }
  16.  
  17. if (lastValue !== value) {
  18. that.list.innerHTML = options.filter(function (a) {
  19. return ~a.toLowerCase().indexOf(value.toLowerCase());
  20. }).map(function (a) {
  21. return '<option value="' + value + '|' + a + '">' + a + '</option>';
  22. }).join();
  23. updateInput(that);
  24. that.lastValue = value;
  25. }
  26. }
  27.  
  28. function updateInput(that) {
  29. if (!that) {
  30. return;
  31. }
  32. var value = that.value,end = that.selectionEnd;
  33.  
  34. if (~pos) {
  35. value = value.slice(pos + 1);
  36. }
  37. that.value = value;
  38. that.setSelectionRange(start,end);
  39. }
  40.  
  41. document.getElementsByTagName('input').browser.addEventListener('keyup',function (e) {
  42. updateList(this);
  43. });
  44. document.getElementsByTagName('input').browser.addEventListener('input',function (e) {
  45. updateInput(this);
  46. });
  1. <input list="browsers" name="browser" id="browser" onkeyup="updateList();" oninput="updateInput();">
  2. <datalist id="browsers">
  3. <option value="Internet Explorer">
  4. <option value="Firefox">
  5. <option value="Chrome">
  6. <option value="Opera">
  7. <option value="Safari">
  8. </datalist>

编辑

显示搜索内容的一种不同的方法,以说明发生了什么。这也适用于Chrome。灵感来自Show datalist labels but submit the actual value

  1. 'use strict';
  2. var datalist = {
  3. r: ['ralph','ronny','rudie'],ru: ['rudie','rutte','rudiedirkx'],rud: ['rudie',rudi: ['rudie'],rudo: ['rudolf'],foo: [
  4. { value: 42,text: 'The answer' },{ value: 1337,text: 'Elite' },{ value: 69,text: 'Dirty' },{ value: 3.14,text: 'Pi' }
  5. ]
  6. },SEPARATOR = ' > ';
  7.  
  8. function updateList(that) {
  9. var lastValue = that.lastValue,array,key,end = that.selectionEnd;
  10.  
  11. if (lastValue !== value) {
  12. if (value !== '') {
  13. if (value in datalist) {
  14. key = value;
  15. } else {
  16. Object.keys(datalist).some(function (a) {
  17. return ~a.toLowerCase().indexOf(value.toLowerCase()) && (key = a);
  18. });
  19. }
  20. }
  21. that.list.innerHTML = key ? datalist[key].map(function (a) {
  22. return '<option data-value="' + (a.value || a) + '">' + value + (value === key ? '' : SEPARATOR + key) + SEPARATOR + (a.text || a) + '</option>';
  23. }).join() : '';
  24. updateInput(that);
  25. that.lastValue = value;
  26. }
  27. }
  28.  
  29. function updateInput(that) {
  30. var value = that.value,pos = value.lastIndexOf(SEPARATOR),end = that.selectionEnd;
  31.  
  32. if (~pos) {
  33. value = value.slice(pos + SEPARATOR.length);
  34. }
  35. Object.keys(that.list.options).some(function (option) {
  36. var o = that.list.options[option],p = o.text.lastIndexOf(SEPARATOR);
  37. if (o.text.slice(p + SEPARATOR.length) === value) {
  38. value = o.getAttribute('data-value');
  39. return true;
  40. }
  41. });
  42. that.value = value;
  43. that.setSelectionRange(start,end);
  44. }
  45.  
  46. document.getElementsByTagName('input').xx.addEventListener('keyup',function (e) {
  47. updateList(this);
  48. });
  49. document.getElementsByTagName('input').xx.addEventListener('input',function (e) {
  50. updateInput(this);
  51. });
  1. <input list="xxx" name="xx" id="xx">
  2. <datalist id="xxx" type="text"></datalist>

猜你在找的HTML5相关文章