`
niuka
  • 浏览: 50822 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用jsonsuggest小小心得

阅读更多

jsonsuggest是一个不错的js插件,可以实现模糊联想查询,效果如图,

客户体验还是不错,不过我也是弄了一两天,基于我同事修改过的源码之上,我还修改了源码

(function($) {
 $.fn.jsonSuggest = function(searchData, settings) {
  var defaults = {
   minCharacters : 1,
   maxResults : undefined,
   wildCard : "",
   caseSensitive : false,
   notCharacter : "!",
   maxHeight : 350,
   highlightMatches : true,
   onSelect : undefined,
   ajaxResults : false,
   key : "id",
   value : "name",
   textId : ""
  };
  settings = $.extend(defaults, settings);
  return this.each(function() {
   function regexEscape(txt, omit) {
    var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[',
      ']', '{', '}', '\\'];
    if (omit) {
     for (var i = 0; i < specials.length; i++) {
      if (specials[i] === omit) {
       specials.splice(i, 1);
      }
     }
    }
    var escapePatt = new RegExp('(\\' + specials.join('|\\') + ')',
      'g');
    return txt.replace(escapePatt, '\\$1');
   }
   var obj = $(this), wildCardPatt = new RegExp(
     regexEscape(settings.wildCard || ''), 'g'), results = $('<div />'), currentSelection, pageX, pageY;
   function selectResultItem(item) {
    $(results).html('').hide();
    var tId = settings.textId;
    $('#' + tId).val(item.name);
    if (typeof settings.onSelect === 'function') {
     settings.onSelect(item, settings.textId);
    }
   }
   function setHoverClass(el) {
    $('div.resultItem', results).removeClass('hover');
    $(el).addClass('hover');
    currentSelection = el;
   }

   function buildResults(resultObjects, sFilterTxt) {
    var v1 = settings.key;
    var v2 = settings.value;
    sFilterTxt = "(" + sFilterTxt + ")";
    var bOddRow = true, i, iFound = 0, filterPatt = settings.caseSensitive
      ? new RegExp(sFilterTxt, "g")
      : new RegExp(sFilterTxt, "ig");
    $(results).html('').hide();
    for (i = 0; i < resultObjects.length; i += 1) {
     var item = $('<div />'), text = resultObjects[i][v1];
     // 楂樹寒鏄剧ず 杈撳叆鐨勫瓧绗�
     // if (settings.highlightMatches === true) {
     // text = text.replace(filterPatt,
     // "<strong>$1</strong>");
     // }
     $(item).append('<p class="text">' + text + ':'
       + resultObjects[i][v2]);
     $(item).append('</p>');
     if (typeof resultObjects[i].image === 'string') {
      $(item).prepend('<img src="' + resultObjects[i].image
          + '" />')
        .append('<br style="clear:both;" />');
     }
     $(item).addClass('resultItem').addClass((bOddRow)
         ? 'odd'
         : 'even').click(function(n) {
        return function() {
         selectResultItem(resultObjects[n]);
        };
       }(i)).mouseover(function(el) {
        return function() {
         setHoverClass(el);
        };
       }(item));
     $(results).append(item);
     bOddRow = !bOddRow;
     iFound += 1;
     if (typeof settings.maxResults === 'number'
       && iFound >= settings.maxResults) {
      break;
     }
    }
    if ($('div', results).length > 0) {
     currentSelection = undefined;
     $(results).show().css('height', 'auto');
     if ($(results).height() > settings.maxHeight) {
      $(results).css({
         'overflow' : 'auto',
         'height' : settings.maxHeight + 'px'
        });
     }
    }
   }
   function checkStr(str) {
    var iu, iuu, regArray = new Array("", "◎", "■", "●", "№", "↑",
      "→", "↓" + "!", "@", "#", "$", "%", "^", "&", "*", "(",
      ")", "_", "-", "+", "=", "|", "'", "[", "]", "?", "~",
      "`" + "!", "<", ">", "‰", "→", "←", "↑", "↓", "¤", "§",
      "#", "&", "&", "\", "≡", "≠" + "≈", "∈", "∪", "∏", "∑",
      "∧", "∨", "⊥", "∥", "∥", "∠", "⊙", "≌", "≌", "√", "∝",
      "∞", "∮" + "∫", "≯", "≮", ">", "≥", "≤", "≠", "±", "+",
      "÷", "×", "/", "Ⅱ", "Ⅰ", "Ⅲ", "Ⅳ", "Ⅴ", "Ⅵ", "Ⅶ", "Ⅷ",
      "Ⅹ", "Ⅻ", "㈠", "㈡" + "╄", "╅", "╇", "┻", "┻", "┇", "┭",
      "┷", "┦", "┣", "┝", "┤", "┷", "┷", "┹", "╉", "╇", "【",
      "】" + "㈢", "㈣", "㈤", "㈥", "㈦", "㈧", "㈨", "㈩", "①", "②",
      "③", "④", "⑤", "⑥", "⑦", "⑧", "⑨", "⑩", "┌", "├", "┬",
      "┼", "┍", "┕", "┗", "┏", "┅", "─" + "〖", "〗", "←", "〓",
      "☆", "§", "□", "‰", "◇", "︿", "@", "△", "▲", "#", "℃",
      "※", ".", "≈", "¢");
    iuu = regArray.length;
    for (iu = 1; iu <= iuu; iu++) {
     if (str.indexOf(regArray[iu]) != -1) {
      return false;
     }
    }
    return true;
   }
   function runSuggest(e) {
    if (this.value.length < settings.minCharacters) {
     $(results).html('').hide();
     return false;
    }
    var resultObjects = [], sFilterTxt = (!settings.wildCard)
      ? regexEscape(this.value)
      : regexEscape(this.value, settings.wildCard).replace(
        wildCardPatt, '.*'), bMatch = true, filterPatt, i;
    if (settings.notCharacter
      && sFilterTxt.indexOf(settings.notCharacter) === 0) {
     sFilterTxt = sFilterTxt.substr(
       settings.notCharacter.length, sFilterTxt.length);
     if (sFilterTxt.length > 0) {
      bMatch = false;
     }
    }
    sFilterTxt = sFilterTxt || '.*';
    sFilterTxt = settings.wildCard ? '^' + sFilterTxt : sFilterTxt;
    filterPatt = settings.caseSensitive
      ? new RegExp(sFilterTxt)
      : new RegExp(sFilterTxt, "i");
    if (settings.ajaxResults === true) {
     var JsonURL = searchData(this.value, settings.wildCard,
       settings.caseSensitive, settings.notCharacter);
     $.ajaxSetup({
        cache : false
       });
     if (checkStr(this.value)) {
      $.getJSON(JsonURL, function(data) {
         if (typeof data === 'string') {
          data = JSON.parse(data);
         }
         buildResults(data, sFilterTxt);
        });
     } else {
      alert("不允许包含非法字符" + this.value);
      this.value = "";
      this.focus();
     }
    } else {
     for (i = 0; i < searchData.length; i += 1) {
      if (filterPatt.test(searchData[i].text) === bMatch) {
       resultObjects.push(searchData[i]);
      }
     }
    }
    buildResults(resultObjects, sFilterTxt);
   }
   function keyListener(e) {
    switch (e.keyCode) {
     case 13 :
      $(currentSelection).trigger('click');
      return false;
     case 40 :
      if (typeof currentSelection === 'undefined') {
       currentSelection = $('div.resultItem:first',
         results).get(0);
      } else {
       currentSelection = $(currentSelection).next()
         .get(0);
      }
      setHoverClass(currentSelection);
      if (currentSelection) {
       $(results).scrollTop(currentSelection.offsetTop);
      }
      return false;
     case 38 :
      if (typeof currentSelection === 'undefined') {
       currentSelection = $('div.resultItem:last', results)
         .get(0);
      } else {
       currentSelection = $(currentSelection).prev()
         .get(0);
      }
      setHoverClass(currentSelection);
      if (currentSelection) {
       $(results).scrollTop(currentSelection.offsetTop);
      }
      return false;
     default :
      runSuggest.apply(this, [e]);
    }
   }
   $(results).addClass('jsonSuggestResults').css({
      'top' : (obj.position().top + obj.height() + 5) + 'px',
      'left' : obj.position().left + 'px',
      'width' : obj.width() + 'px'
     }).hide();
   obj.after(results).keyup(keyListener).blur(function(e) {
    var resPos = $(results).offset();
    resPos.bottom = resPos.top + $(results).height();
    resPos.right = resPos.left + $(results).width();
    if (pageY < resPos.top || pageY > resPos.bottom
      || pageX < resPos.left || pageX > resPos.right) {
     $(results).hide();
    }
   }).focus(function(e) {
    $(results).css({
       'top' : (obj.position().top + obj.height() + 5)
         + 'px',
       'left' : obj.position().left + 'px'
      });
    if ($('div', results).length > 0) {
     $(results).show();
    }
   }).attr('autocomplete', 'off');
   $().mousemove(function(e) {
      pageX = e.pageX;
      pageY = e.pageY;
     });
   if ($.browser.opera) {
    obj.keydown(function(e) {
       if (e.keyCode === 40) {
        return keyListener(e);
       }
      });
   }
   settings.notCharacter = regexEscape(settings.notCharacter || '');
   if (!settings.ajaxResults) {
    if (typeof searchData === 'function') {
     searchData = searchData();
    }
    if (typeof searchData === 'string') {
     searchData = JSON.parse(searchData);
    }
   }
  });
 };
})(jQuery);

 

 

以下是我调用的jsp页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'employeelist.jsp' starting page</title>
    
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">    
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.jsonSuggest-dev.js"></script>
<script type="text/javascript" src="js/jquery.jsonSuggest.js"></script>
<link rel="stylesheet" href="css/jsonSuggest.css" type="text/css"></link>

<script type="text/javascript">
    

$(function (){
    $('#empName').jsonSuggest(
 function(text, wildCard, caseSensitive, notCharacter) {
  var pin = $("#empName");
  var url = "ownerListAction.do?pin="+pin.val();
  return url;
 },{ajaxResults:true,minCharacters:1,key:"ename",value:"eenl",textId:"empName"});
})

</script>
 
  </head>
  
  <body>
       <input id="empName" />
  </body>
</html>

 

分享到:
评论
1 楼 autosuggestion 2017-06-23  
实现一个智能提示功能需要JavaScript、ajax、数据库、jsp/php很多知识,
如果数据量大还需要特殊优化,一个小功能,花费太大精力不合适

但这是个可有可无的功能吗,肯定不是
对用户而言,可以有效降低输入成本,在面对输入框时,获得更多提示,不用那么迷茫和无助
对站长而言,可以优先推送网站的关键信息,等于多了一个广告位。

一所大学图书馆的搜索框智能提示,大约50万个词条(书名)
他们使用的是www.92find.com的搜索框智能提示免费产品,
只要一行javascript代码,就可以实现baidu、淘宝搜索框提示的全部功能
比如:拼音匹配、拼音首字母匹配、模糊搜索、智能容错,
还可以自定义提示词汇及其排序权重
你只需要准备好自己的提示词汇表就可以了,
无需编写程序,
五分钟(真的是5分钟)就可以在线配置拥有
主流搜索引擎都有的自动提示(自动补全)功能

下面是92find.com的一个客户案例


相关推荐

    企业数字化转型暨数据仓库(数仓)建设方案.pptx

    企业数字化转型暨数据仓库(数仓)建设方案.pptx

    2024年中国LED切割灯行业研究报告.docx

    2024年中国LED切割灯行业研究报告

    目前世界上最好的机器学习&深度学习&神经网络&图神经网络&卷积网络&多层感知机画图工具&基于PPT

    在当今快速发展的人工智能领域中,一款集成了机器学习、深度学习、神经网络、图神经网络、卷积网络及多层感知机可视化功能的画图工具脱颖而出,成为全球范围内最受欢迎和认可的工具之一。这款工具不仅仅是一个简单的绘图软件,它的设计初衷是为了让复杂的网络结构和算法直观化,从而帮助研究者、学者及开发人员更容易地理解和分享他们的工作。 最令人印象深刻的特色之一是它基于PPT的编辑能力,这允许用户在熟悉的PPT编辑环境中创建、编辑和展示复杂的网络结构。用户可以利用拖拉组件、调整尺寸、修改颜色和形状等功能,无缝地将科研成果或项目展示集成到演示文稿中,极大地提高了工作的效率和表现力。 该工具不仅支持广泛的网络结构和模型,还包含丰富的库和模块,让用户能够轻松自定义和扩展自己的模型。它的用户界面友好、直观,无论是机器学习的新手还是资深研究员,都能快速上手,将精力更多地集中在创新和研究上,而不是图形的绘制和编辑上。 此外,它强大的共享和合作功能,使得团队成员可以实时共享他们的成果,促进了知识的交流和项目的进展。这款工具不仅改善了人工智能领域内部的工作方式,也为更广泛的受众提供了学习和理解复杂算法的窗口。 总

    2024年中国B型超声诊断设备行业研究报告.docx

    2024年中国B型超声诊断设备行业研究报告

    node-v11.0.0-linux-armv7l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v10.8.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    web javaScript 获取终端ip 获取本地ip 获取本机ip地址,403报错解决方案

    内容概要:通过带着读者手写简化版 ajax请求框架,了解网络请求核心原理。在手写ajax的过程中会摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:XMLHttpRequest、jsonp请求、作用域、资源处理等内容实现。 适用人群:具备一定编程基础,工作1-3年的大前端开发、网络安全的研发人员 适用场景:金融支付、设备识别、IP 限制、网络监控、技术测试 能学到什么:手写ajax请求、兼容jsonp请求、动态添加meta标签、动态获取本地ip、处理403网络请求报错。 阅读建议:可以在以下框架中使用:react、react-native、vue、javaScript、web、jquery框架。在webapp工程,获取终端ip 获取本地ip 获取本机ip地址,403报错解决方案。

    node-v4.4.6-x64.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    Stm32学习笔记,超详细.txt

    Stm32学习笔记,超详细

    halcon 3D图像重建

    halcon 3D图像重建。

    node-v8.16.2-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    虚拟网卡库,Python或者C都可以调用

    虚拟网卡库,Python或者C都可以调用,虚拟网卡

    IEC 60364-7-721-2017 低压电气装置.第7-721部分:特殊装置或场所的要求.房车和机动房车中的电气装置.

    IEC 60364-7-721-2017 低压电气装置.第7-721部分:特殊装置或场所的要求.房车和机动房车中的电气装置.pdf

    BS 1363-1-2023 :13A插头、插座、适配器和连接装置第1部分:可重新布线和不可重新布线的13A保险丝插头规范

    BS 1363-1-2023 :13A插头、插座、适配器和连接装置第1部分:可重新布线和不可重新布线的13A保险丝插头规范.pdf

    平安业研一体 BizDevOps—降本增效与业务价值最大化实践-龚明杰.pdf

    平安业研一体 BizDevOps—降本增效与业务价值最大化实践-龚明杰

    2021年美赛A~F题36篇特等奖论文合集.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,历年美赛特等奖O奖论文

    node-v8.12.0-linux-s390x.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2023年美赛特等奖论文-F-2311258-解密.pdf

    大学生,数学建模,美国大学生数学建模竞赛,MCM/ICM,2023年美赛特等奖O奖论文

    超低溫冷凍櫃 Revco RLE、Forma 89000、HERAfreeze HLE系列 安裝和操作

    超低溫冷凍櫃 Revco RLE 系列、Forma 89000 系列、HERAfreeze HLE 系列、 Thermo Scientific TLE 系列 安裝和操作

Global site tag (gtag.js) - Google Analytics