之前做一个云计算的项目,涉及到一个安全组自动联想的功能,思想是这样的:

安全组规则之间是可以相互引用的,也可以自己是自己手动输入的ip/mask,这时候可以加一个功能,实现securityGroupId和securityGroupName以及ip/mask之间随意的联想输入。 
主要实现方式是:后台处理securityGroupName和SecurityGroupName的组合列表,并且在前台做相应的处理,处理为数组对象,此时对名称和id的联想基本实现,如果再加上ip/task,只需做一些处理,创建一个新数组,拼接到之前的name和id的数组上,这时候就实现了securityGroupId和securityGroupName以及ip/mask之间随意的联想输入。
以下主要是实现ip/mask的转换,涉及一个最小掩码的算法,比如当前ip是10.12.0.0,这个时候需要计算出最小掩码,算法是:将该ip分段处理,如果第一个数不为0(,此处单纯的理解为10进制,也可以处理成2进制数之后相应的判断),那么查看后一位是否为0,这里以第二位为例(12)。因为第一位10后面的数(12)不为零,第二位12的后面的数(0)为零,则对12处理。12处理成2进制数为:00001100,掩码可最后一个1的位置有关,此时得出的数是6,那么第一位后面不为0,则第一位取全掩8,此时得出的值为8+6=14,也就是说该ip最后取出的最小掩码为14,还有三个是固定的,大家都会(14,16,24,34),如果不是以此往下类推。
  1. /**
  2. * IP自动联想
  3. *
  4. * @param input IP
  5. * @return IP/Task
  6. */
  7. function getIpArray(input){
  8. var ipArray = input.split('.');
  9. for( var i = 0; i < 4; i++){
  10. if (ipArray[i] == undefined || ipArray[i] == ''){
  11. ipArray[i] = 0;
  12. }
  13. //
  14. //      if(ipArray[i].indexOf('0') == 0 && ipArray[i].length > 1){
  15. //          ipArray[i] = ipArray[i].substring(1, ipArray[i].length);
  16. //      }
  17. }
  18. return ipArray;
  19. }
  20. function every(arr, func){
  21. var aa = [];
  22. for( var i = 0; i < arr.length; i++){
  23. aa.push(func(arr[i]));
  24. }
  25. return aa;
  26. }
  27. function indexOfEnd(str){
  28. for( var i = str.length - 1; i >= 0; i--){
  29. if (str.charAt(i) == '1') {
  30. return 8 - (str.length - i) + 1;
  31. }
  32. }
  33. return 0;
  34. }
  35. function getPermissions(input){
  36. var ipArray = getIpArray(input);
  37. var ip = ipArray.join('.');
  38. var binaryIpArray = every(ipArray, function(oct){
  39. return Number(oct).toString(2);
  40. });
  41. var yanma = 0;
  42. for( var i = binaryIpArray.length - 1; i >= 0; i--){
  43. if(binaryIpArray[i] != 0){
  44. yanma = indexOfEnd(binaryIpArray[i]) + i * 8;
  45. break;
  46. }
  47. }
  48. var abc = [ 8, 16, 24, 32 ];
  49. var rstArray = [ ip + '/' + yanma ];
  50. for( var i = 0; i < abc.length; i++){
  51. if(abc[i] > yanma){
  52. rstArray.push(ip + '/' + abc[i]);
  53. }
  54. }
  55. return rstArray;
  56. }

这里主要是在键盘事件触发的时候的一个脚本,实现自动联想

  1. /**
  2. * 创建安全组自动联想DOM
  3. */
  4. function createSgDom(input){
  5. var arrayObj = new Array();
  6. var ary = new Array();
  7. this.setNewAry([]);
  8. this.setAry([]);
  9. var autoData = jsonData.substring(1, jsonData.length -1).split(', ');
  10. for ( var element in autoData) {
  11. arrayObj.push(autoData[element]);
  12. }
  13. var permissions = /^((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))$/;
  14. var ip_1 = /^((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))[\.]?){1,3})$/;
  15. var str = /^[a-zA-Z]*([a-zA-Z]|[-])*$/;
  16. if(null != input && !str.test(input)){
  17. if(ip_1.test(input) || permissions.test(input)){
  18. var except = false;
  19. if(input.indexOf('.') > -1){
  20. var value = input.split('.');
  21. for(var val in value){
  22. var inVal = value[val];
  23. if(inVal.indexOf('0') == 0 && inVal.length > 1){
  24. except = true;
  25. }
  26. if(inVal>255){
  27. except = true;
  28. }
  29. }
  30. } else {
  31. if(input>255){
  32. except = true;
  33. }
  34. }
  35. if(!except){
  36. var ips = getPermissions(input);
  37. for(var ip in ips){
  38. ary.push(ips[ip]);
  39. }
  40. }
  41. }
  42. }
  43. if(ary != null){
  44. newAry = arrayObj.concat(ary);
  45. } else {
  46. newAry = arrayObj;
  47. }
  48. this.setNewAry(newAry);
  49. $('#suggest_value').autocomplete({
  50. source: this.getNewAry(),
  51. minLength: 0,
  52. close: function(event, ui){
  53. },
  54. focus: function(event, ui){
  55. return false;
  56. },
  57. change: function(event, ui){
  58. },
  59. select: function(event, ui){
  60. if(ui.item.label.indexOf('(') > -1 && ui.item.label.indexOf(')') > -1){
  61. ui.item.value = ui.item.label.substring(0, ui.item.label.indexOf('('));
  62. }else{
  63. ui.item.value = ui.item.label.substring(0, ui.item.label.length);
  64. }
  65. }
  66. });
  67. }

最后:

    1. //在输入框加上一个keyup事件,指定执行脚本:createSgDom($('#suggest_value').val());
    2. // 引入自动联想插件和上面处理ip掩码的脚本
    3. <script type="text/javascript" src="theme/default/js/cbms/ip-permissions.js"></script>
    4. <%-- <script src="theme/default/jquery-ui/js/jquery-1.8.3.js" type="text/javascript"></script> --%>
    5. <script src="theme/default/jquery-ui/js/jquery-ui-1.8.24.custom.min.js" type="text/javascript"></script>

jQuery/javascript实现IP/Mask自动联想功能的更多相关文章

  1. Java开发工具MyEclipse的设置自动联想功能

    最近初学Java,正在使用MyEclipse来编写新的项目,刚开始打开MyEclipse感觉这个工具既陌生又熟悉,熟悉之处在于编辑器的几大共通之处它都具备,比如说基本的设置.编辑区.调试区都是类似的, ...

  2. UITextField关闭自动联想功能

    在textField输入内容时,如果内容为英文,输入的英文如果不正确的单词就是有红色的线报警,关闭英文自动联想功能 self.autocorrectionType = UITextAutocorrec ...

  3. Java初学者不可不知的MyEclipse的设置技巧(自动联想功能)

    最近初学Java,正在使用MyEclipse来编写新的项目,刚开始打开MyEclipse感觉这个工具既陌生又熟悉,熟悉之处在于编辑器的几大共通之处它都具备,比如说基本的设置.编辑区.调试区都是类似的, ...

  4. Myeclipse设置自动联想功能

    ///声明,博客园暂无转载功能,这篇博客是转载自贞心真义. 最近初学Java,正在使用MyEclipse来编写新的项目,刚开始打开MyEclipse感觉这个工具既陌生又熟悉,熟悉之处在于编辑器的几大共 ...

  5. IDEA 代码自动补全/自动联想 功能

    IDEA 的代码补全/自动联想功能,可以仅仅输入几个字母,自动补全一整段代码,非常舒服. 代码自动联想功能在 设置 -> Editor -> Live Templates 查看,很多都非常 ...

  6. 基于JQuery实现的文本框自动填充功能

    1. 实现的方法 /* * js实现的文本框的自动完成功能 */ function doAutoComplete(textid,dataid,url){ $("#" + texti ...

  7. 使用TaskManager爬取2万条代理IP实现自动投票功能

    话说某天心血来潮想到一个问题,朋友圈里面经常有人发投票链接,让帮忙给XX投票,以前呢会很自觉打开链接帮忙投一票.可是这种事做多了就会考虑能不能使用工具来进行投票呢,身为一名程序猿决定研究解决这个问题. ...

  8. Ajax实现搜索栏中输入时的自动提示功能

    使用 jQuery(Ajax)/PHP/MySQL实现自动完成功能 JavaScript代码: <script src="jquery-1.2.1.pack.js" type ...

  9. salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现

    项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...

随机推荐

  1. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) F - Uniformly Branched Trees 无根树->有根树+dp

    F - Uniformly Branched Trees #include<bits/stdc++.h> #define LL long long #define fi first #de ...

  2. Spark 源码解析:TaskScheduler的任务提交和task最佳位置算法

    上篇文章<  Spark 源码解析 : DAGScheduler中的DAG划分与提交 >介绍了DAGScheduler的Stage划分算法. 本文继续分析Stage被封装成TaskSet, ...

  3. Django 和 html

    下面是对应的形式,自定义的forms

  4. 最大流KK算法

    最大流KK算法 #include<iostream> #include<stdio.h> #include<string.h> #include<math.h ...

  5. dp洋洋散散的知识+code

    /*在数轴上有0-N的位置 从0出发每次可以向右走 2 23 233步*/ // 1 总共的方案数 f[i]=f[i-]+f[i-]+f[i-]; f[]=; ;a<=n;a++) { ) f[ ...

  6. BZOJ1935 园丁的烦恼

    一个二维偏序的问题,学过了三维偏序cdq分治之后觉得这个题非常的水.只需按一维排序之后再用树状数组操作即可.——by VANE #include<bits/stdc++.h> using ...

  7. BZOJ1509 [NOI2003]逃学的小孩 树型DP

    题目: 分析: 首先明确我们是要求 min(dist[C][A],dist[C][B])+dist[A][B]. 我们把C当成树根,第一我们可以发现min里面取dist[C][A]或者dist[C][ ...

  8. [UOJ50]链式反应

    这个题意说人话就是:一棵带标号的有根树,编号满足堆性质,根节点有$x$个儿子是叶子($x\in A$),另外的$2$个儿子也是这样的一棵树,求不同的树的个数 设$f_n$为答案,枚举那两棵子树的大小$ ...

  9. PIL The _imaging C module is not installed

    今天在WIN 7 64位用PIL的时候,提示 The _imaging C module is not installed ,原来是需要安装64位的. 刚开始安装的是这个:http://www.pyt ...

  10. ACM -- 算法小结(一)利用数组存放实现排序

    利用数组存放实现排序    hodj1425   321MS   2011/08 题意:输入n个数字,要求输出从大到小排序的前m个数 解题技巧:利用大数存储在数组后面,小数存储在前面,倒序输出完成从大 ...