如何通过ajax使用Materialize自动完成插件?

2024-01-22

我正在努力共同努力MaterializeCSS 自动完成插件 http://materializecss.com/forms.html#autocomplete使用我的 ajax 调用,以便根据输入字段中键入的内容动态加载数据。

我的 ajax 请求是在 keydown 事件中调用的。所有获取的数据都会自动推送到键/值对象数组中。

然后,我将自动完成函数放入ajax的成功函数中,键“data”的值是之前构建的对象数组。

看来我进展顺利,但是当我在浏览器中测试时,每次我输入一些内容时,建议下拉列表都会按预期显示结果,但不是在每次按键后更新,而是另一个下拉列表与前一个列表重叠,并且那么一个...

所以这是我的问题:如何避免下拉建议列表重叠,而是在每次按下按键时使其更新?

感谢您的帮助。

var dat = {};
$("input").on("keydown", function(e) {
    var d = {
        query: {
            prefix: {
                body: e.target.value
            }
        }
    };

    $.ajax({
        url: "https://xxxxxxxxxxxxxxx.eu-west-1.es.amazonaws.com/xxxxxxxxxxxxx",
        type: "POST",
        contentType: "application/json",
        crossDomain: true,
        data: JSON.stringify(d),
        dataType: "JSON",
        async: true,
        success: function(da) {
            var c = da.hits.hits.length;
            for (var i = 0; i < c; i++) {
                dat[da.hits.hits[i]._source.body] = null;
            }

            $("input").autocomplete({
                data: dat
            });
        },
        error: function(jqXHR, errorStatus, errorThrown) {
            console.log(jqXHR);
            console.log(errorStatus);
            console.log(errorThrown);
        }
    });
});

这是一个更清晰的例子。

  • 它基于Materialized.js原始功能
  • 在您键入时取消现有的 ajax 请求,这样您就不会得到重复的结果
  • 如果删除“timeout”注释行,则只会在按键后经过“x”时间后调用 ajax 调用。当您快速打字以避免每次按键时调用 ajax(即使它们被取消)时,这可能很有用。

见下文:

initAutoComplete({inputId:'autocomplete-input',ajaxUrl:'/search/my-auto-complete-results'})


function initAutoComplete(options)
{  
  var defaults = {
    inputId:null,
    ajaxUrl:false,    
    data: {}
  };

  options = $.extend(defaults, options);
  var $input = $("#"+options.inputId);

  if (options.ajaxUrl !== false)
  {
    var $autocomplete = $('<ul id="myId" class="autocomplete-content dropdown-content"></ul>'),   
        $inputDiv = $input.closest('.input-field'),
        //timeout,
        runningRequest = false,
        request;

    if ($inputDiv.length) {
      $inputDiv.append($autocomplete); // Set ul in body
    } else {      
      $input.after($autocomplete);
    }

    var highlight = function(string, $el) {
      var img = $el.find('img');
      var matchStart = $el.text().toLowerCase().indexOf("" + string.toLowerCase() + ""),
          matchEnd = matchStart + string.length - 1,
          beforeMatch = $el.text().slice(0, matchStart),
          matchText = $el.text().slice(matchStart, matchEnd + 1),
          afterMatch = $el.text().slice(matchEnd + 1);
      $el.html("<span>" + beforeMatch + "<span class='highlight'>" + matchText + "</span>" + afterMatch + "</span>");
      if (img.length) {
        $el.prepend(img);
      }
    };

    $autocomplete.on('click', 'li', function () {
      $input.val($(this).text().trim());
      $autocomplete.empty();
    });

    $input.on('keyup', function (e) {

      //if(timeout){ clearTimeout(timeout);}
      if(runningRequest) request.abort();      

      if (e.which === 13) {
        $autocomplete.find('li').first().click();
        return;
      }

      var val = $input.val().toLowerCase();
      $autocomplete.empty();

      //timeout = setTimeout(function() {

        runningRequest=true;

        request = $.ajax({
          type: 'GET', // your request type
          url: options.ajaxUrl,        
          success: function (data) {
            if (!$.isEmptyObject(data)) {
              // Check if the input isn't empty
              if (val !== '') {
                for(var key in data) {
                  if (data.hasOwnProperty(key) &&
                      key.toLowerCase().indexOf(val) !== -1 &&
                      key.toLowerCase() !== val) {
                    var autocompleteOption = $('<li></li>');
                    if(!!data[key]) {
                      autocompleteOption.append('<img src="'+ data[key] +'" class="right circle"><span>'+ key +'</span>');
                    } else {
                      autocompleteOption.append('<span>'+ key +'</span>');
                    }
                    $autocomplete.append(autocompleteOption);

                    highlight(val, autocompleteOption);
                  }
                }
              }
            }                    
          },
          complete:function(){
            runningRequest = false;
          }        
        });
      //},250);
    });
  }
  else 
  {
    $input.autocomplete({
      data: options.data
    });
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过ajax使用Materialize自动完成插件? 的相关文章

随机推荐

  • 尝试向 Web 服务发送 SOAP 请求时出现 WS 安全错误

    这是我使用肥皂 UI 发送的 SOAP 请求 但收到一条错误消息 消息不符合配置的策略
  • Puppeteer:Element.hover() 不存在

    我正在使用 puppeteer 从网站上抓取一些图像以及其他一些数据 要更改图像 我需要将鼠标悬停在列表项上 我不断遇到有关 hover 的文档 但没有成功 然而 click 非常适合我的抓取的另一部分 const pptr require
  • Android 关闭键盘

    按下按钮时如何关闭键盘 您想禁用或关闭虚拟键盘吗 如果您只想关闭它 您可以在按钮的单击事件中使用以下代码行 InputMethodManager imm InputMethodManager getSystemService Context
  • UserWarning:pyarrow.open_stream 已弃用,请使用 pyarrow.ipc.open_stream 警告

    我在跑步spark 2 4 2本地通过pyspark用于 NLP 中的 ML 项目 Pipeline 中的部分预处理步骤涉及使用pandas udf功能优化通过pyarrow 每次我使用预处理的 Spark 数据框进行操作时 都会出现以下警
  • 安卓倒计时

    我想在android中写一个倒计时 从3开始计数到0 就像最初3出现然后消失 2出现等等 我进行了很多搜索 但找不到任何好的样本 你能帮我看看我该怎么办吗 使用倒计时器 例如 import android os CountDownTimer
  • 金字塔 1.3 和 Google 应用引擎 1.7

    我设法使 Pyramid 1 2 WSGI 应用程序在 Google App Engine SDK 1 7 上运行 然而 我当前的项目使用了几个新的 Pyramid 1 3 功能 并且我陷入了 WebOb 版本问题 这是错误消息 Versi
  • 无法联系 reCAPTCHA。检查您的连接并重试

    我正在使用react google invisible recaptcha 但当页面加载时它不起作用 它会显示 无法联系 reCAPTCHA 请检查您的连接并重试 之类的警报 即使互联网速度更快 我怎样才能使用invisible reCAP
  • VS2010 中缺少 ws2_32.lib。该怎么办?

    我正在尝试着手 Windows 套接字编程 我知道你必须 include winsock2 h然后链接到ws2 32 lib 问题是我没有ws2 32 lib在我的 Visual Studio 2010 终极版本中 我应该做什么才能让它启动
  • 在Matlab中将导数值保存在ode45中

    我正在模拟一个带有质量弹簧和双摆的 有点奇怪 系统的运动方程 我有一个质量矩阵和函数 f x 并调用 ode45 来求解 M x f x t 我有5个状态变量 q QDot phi phiDot r rDot 删除了 Q 因为没有任何东西依
  • C 中的连续空格删除 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 文本文件包含一堆字符 文件中没有制表
  • Javacv Blob 检测

    我想在我的应用程序中使用一些用 Java 编写的斑点检测 因此使用JavaCV代替OpenCV 我发现很多课程 例如 SimpleBlobDetector CvBlobDetector CvBlob 但我找不到任何教程或演示 示例代码来在
  • UINavigationController:相反方向弹出视图控制器

    我正在尝试打电话 self navigationController popViewControllerAnimated YES 但使动画从右向左滑动而不是从左向右滑动 有什么简单的方法可以做到这一点吗 我想回到之前的观点 任何帮助表示赞赏
  • 如何向 R matplot 添加颜色匹配的图例

    我使用 matplot 在图表上绘制几条线 matplot cumsum as data frame daily pnl type l 这给了我每行的默认颜色 这很好 但我现在想添加一个反映相同颜色的图例 我怎样才能实现这一点 请注意 我首
  • 为什么Flow需要对导出函数的参数进行注释?

    以下代码 流动游乐场 https flowtype org try 0PQKgBAAgZgNg9gdzCYAoVUCuA7AxgFwEs5swBDACgAcBKMAbwF9UBbOAE0xgFMA6bgB5U4AJ3wBnMAF5yQA f
  • 将 CollectionView Item VisualElement 的 VisualState 传递给其子 VisualElements

    我遇到以下情况 CollectionView 每一项都是Border 包含其他控件 选择后 边框的 VisualState 更改为已选择 然而 子控件的状态没有改变 有没有一种简单的方法可以将这些 VisualStates 链接 传递给所有
  • 使用递推方程的程序的时间复杂度

    我想使用递归方程找出程序的时间复杂度 那是 int f int x if x lt 1 return 1 else return f x 1 g x int g int x if x lt 2 return 1 else return f
  • 如何在 AntD Reactjs 中打开表格行按钮上的模态并访问模态中的表格数据

    我在 antd 表中显示用户数据 并在表中为每行创建了编辑按钮来访问每行记录 我想在 编辑 按钮单击时打开模态并在模态中获取相应的行数据 但无法 因为它给出了错误 showModal 未定义 版本 antd 4 18 9 axios 0 2
  • 在IOS中使用Web服务时出现NSURLSession内存泄漏

    我正在构建一个使用 Web 服务的应用程序 并从我使用的 Web 服务中获取信息NSURLSession and NSURLSessionDataTask 我现在处于内存测试阶段 我发现NSURLSession正在导致内存泄漏 这还不是所有
  • 使用 htaccess 文件删除文件扩展名 .php

    我想通过 htaccess 文件从 url 中删除 php 例如 home php 到 home 我在 htaccess 文件中使用以下重写规则 RewriteRule 1 php L 我还想将登录名指定为索引 我该如何改变它 这是可用于隐
  • 如何通过ajax使用Materialize自动完成插件?

    我正在努力共同努力MaterializeCSS 自动完成插件 http materializecss com forms html autocomplete使用我的 ajax 调用 以便根据输入字段中键入的内容动态加载数据 我的 ajax