【问题标题】:How to force JS to ignore a li element如何强制 JS 忽略一个 li 元素
【发布时间】:2021-07-21 05:20:09
【问题描述】:

我已经实现jquery autocomplete

(这只是一个模拟真实代码的例子)

let availableTags = [   
      undefined,    // this is only a header and its results to undefined due to a lack of Id
      "AppleScript",
      "Asp",
      "BASIC",
      "C",
      "C++",
      "Clojure",
      "COBOL",
      "ColdFusion",
      "Erlang",
      "Fortran",
      "Groovy",
      "Haskell",
      "Java",
      "JavaScript",
      "Lisp",
      "Perl",
      "PHP",
      "Python",
      "Ruby",
      "Scala",
      "Scheme"
    ];

    $('#tags').autocomplete({
            source: availableTags,
                                                    
              minLength: 0,
                        
              focus: function (event, ui) { 
                                              
                       if(!ui.item){ 

                          // add code here

                       }
                                                                                        
              },
                        
              select: function (event, ui) {                                            

                    //...    

              },
      })
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <link rel="stylesheet" href="/resources/demos/style.css">

 <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
 <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<div class="ui-widget">
  <label for="tags">Tags: </label>
  <input id="tags">
</div>

ul 的第一个 li 元素只是一个标题(不是真正的 li 选项) ,因此我根本不希望它被选中。

我设法阻止了click events,但它仍然对其他事件“敏感”mouseenter mouseover 等等我可以使用键盘激活这些事件 keydown

如何强制JS 忽略第一个li 元素被触发 甚至不通过键盘?

编辑: 顺便说一句,我可以控制第一个li标签为div\span或 任何其他标签(请记住,该标签将包含在 ul 中)

EDIT-2: 标头只应显示以完全由没有 JS event(鼠标、键盘等)操作,并且标头应为 undefined 以匹配真实代码

【问题讨论】:

  • 应该显示但没有选中..对吗?
  • 是的,只显示正确

标签: javascript html jquery jquery-ui-autocomplete


【解决方案1】:

您需要将数据定义为对象,categorylabel 作为availableTags 数据数组中的属性;并且还需要实现您的自定义自动完成功能的_renderMenu

$.widget("custom.mycomplete", $.ui.autocomplete, {
  _create: function () {
    this._super();
    this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)");
  },
  _renderMenu: function (ul, items) {
    var that = this,
      currentCategory = "";
    $.each(items, function (index, item) {
      var li;
      if (item.category != currentCategory) {
        ul.append("<li class='ui-autocomplete-category'>" + item.category + "</li>");
        currentCategory = item.category;
      }
      li = that._renderItemData(ul, item);
      if (item.category) {
        li.attr("aria-label", item.category + " : " + item.label);
      }
    });
  }
});

let availableTags = [
  { label: "AppleScript", category: "Langauges" },
  { label: "Asp", category: "Langauges" },
  { label: "BASIC", category: "Langauges" },
  { label: "C", category: "Langauges" },
  { label: "C++", category: "Langauges" },
  { label: "Clojure", category: "Langauges" },
  { label: "COBOL", category: "Langauges" },
  { label: "ColdFusion", category: "Langauges" },
  { label: "Erlang", category: "Langauges" },
  { label: "Fortran", category: "Langauges" },
  { label: "Groovy", category: "Langauges" },
  { label: "Haskell", category: "Langauges" },
  { label: "Java", category: "Langauges" },
  { label: "JavaScript", category: "Langauges" },
  { label: "Lisp", category: "Langauges" },
  { label: "Perl", category: "Langauges" },
  { label: "PHP", category: "Langauges" },
  { label: "Python", category: "Langauges" },
  { label: "Ruby", category: "Langauges" },
  { label: "Scala", category: "Langauges" },
  { label: "Scheme", category: "Langauges" }
];

$('#tags').mycomplete({
  source: availableTags,
  minLength: 0,
  focus: function (event, ui) {
    if (!ui.item) {
      //code goes here
    }
  },
  select: function (event, ui) {
    //code goes here
  }
});
.ui-autocomplete-category {
    font-weight: bold;
    padding: .2em .4em;
    margin: .6em 0 .2em;
    line-height: 1.5;
  }
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <link rel="stylesheet" href="/resources/demos/style.css">

 <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
 <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<div class="ui-widget">
  <label for="tags">Tags: </label>
  <input id="tags">
</div>

【讨论】:

  • 谢谢,但问题仍然是如何强制标签(如 li)对任何 JS event 不响应?
【解决方案2】:

通过autocomplete("widget").addClass("whatever"); ul添加一些类,然后在css中添加pointer-events: none;

let availableTags = [
            "header",    // this is only a header and its results to undefined due to a lack of Id
            "AppleScript",
            "Asp",
            "BASIC",
            "C",
            "C++",
            "Clojure",
            "COBOL",
            "ColdFusion",
            "Erlang",
            "Fortran",
            "Groovy",
            "Haskell",
            "Java",
            "JavaScript",
            "Lisp",
            "Perl",
            "PHP",
            "Python",
            "Ruby",
            "Scala",
            "Scheme"
        ];

        $('#tags').autocomplete({
            source: availableTags,
            minLength: 0,
            focus: function (event, ui) {
                debugger

                if (!ui.item) {
                   // add code here
                }
            },
            select: function (event, ui) {
                //...
            },
        }).autocomplete("widget").addClass("whatever"); 
 ul.whatever li:first-child {
            background-color:red;
            pointer-events: none;
        }
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
  <link rel="stylesheet" href="/resources/demos/style.css">

 <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
 <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>

<div class="ui-widget">
  <label for="tags">Tags: </label>
  <input id="tags">
</div>

【讨论】:

  • 对不起,不好我仍然可以通过键盘在标题上运行,只需按下箭头。并且不要将标题更改为string 以类似于真实代码,它应该导致未定义
  • @Ben.S 好的,您必须覆盖自动完成的_renderItem。这是工作示例:jsfiddle.net/m6zvf/12
【解决方案3】:

您可以在 availableTags 中传递一个disabled 属性来指示是否应该选择它,并在自动完成调用的source() 方法中处理选择结果。

$(function() {
  var availableTags = [
    {value: "COBOL", disabled: false},
    {value: "JAVA", disabled: false},
    {value: "PHP", disabled: false},
    {value: "ReactJS", disabled: false},
    {value: "NodeJS", disabled: true},
    {value: "ActionScript", disabled: true},
  ];
  $("#tags").autocomplete({
    source: availableTags,
    select: function(event, ui) {
      if (ui.item.disabled) {
        alert('Please choose a valid option')
        //  suppress disabled items
        event.preventDefault();
      }
    },
  });
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="http://code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
<link href="http://code.jquery.com/ui/1.9.2/themes/base/jquery-ui.css" rel="stylesheet" />

<input id="tags" />

View on JSFiddle

【讨论】:

  • 这不好,因为我仍然可以将鼠标悬停在该禁用选项上,我需要 所有事件完全忽略该禁用选项,并且我需要未定义该禁用选项模仿真实的代码
  • 当然你可以自定义这个来实现你想要的..这只是给一个想法
猜你喜欢
  • 2023-03-22
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多