javascript实现无限级select联动菜单


Posted in Javascript onJanuary 02, 2015

代码很简单,这里主要是给大家推荐一下本代码的实现思路,别具一格。

奉上代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

<title>Selects</title>

<style type="text/css">

*{font-size:14px;}

select{height:20px;font-size:12px;}

</style> 

</head>

<body >

<div style='color:red'>2级联动</div>

<div id='demo1'></div><br><br><br>

<div style='color:red'>3级联动</div>

<div id='demo2'></div><br><br><br>

<div style='color:red'>4级联动</div>

<div id='demo3'></div><br><br><br>

<div style='color:red'>5级联动</div>

<div id='demo4'></div><br><br><br>

<script language="javascript">

var Sys = (function(ua){

  var s = {};

  s.IE = ua.match(/msie ([\d.]+)/)?true:false;

  s.Firefox = ua.match(/firefox\/([\d.]+)/)?true:false;

  s.Chrome = ua.match(/chrome\/([\d.]+)/)?true:false;

  s.IE6 = (s.IE&&([/MSIE (\d)\.0/i.exec(navigator.userAgent)][0][1] == 6))?true:false;

  s.IE7 = (s.IE&&([/MSIE (\d)\.0/i.exec(navigator.userAgent)][0][1] == 7))?true:false;

  s.IE8 = (s.IE&&([/MSIE (\d)\.0/i.exec(navigator.userAgent)][0][1] == 8))?true:false;

  return s;

})(navigator.userAgent.toLowerCase());

Sys.IE6&&document.execCommand("BackgroundImageCache", false, true); 

function $(Id){

  return document.getElementById(Id);

};

function $$(p,e){

  return p.getElementsByTagName(e);

};

function addListener(element,e,fn){

  element.addEventListener?element.addEventListener(e,fn,false):element.attachEvent("on" + e,fn);

};

function removeListener(element,e,fn){

  element.removeEventListener?element.removeEventListener(e,fn,false):element.detachEvent("on" + e,fn);

};

var Bind = function(object, fun) {

  var args = Array.prototype.slice.call(arguments).slice(2);

  return function() {

    return fun.apply(object, args);

  };

};

var BindAsEventListener = function(object, fun) {

  var args = Array.prototype.slice.call(arguments).slice(2);

  return function(event) {

    return fun.apply(object, [event || window.event].concat(args));

  };

};

var Extend = function(destination, source){

  for (var property in source) {

    destination[property] = source[property];

  };

};

var Class = function(properties){

  var _class = function(){return (arguments[0] !== null && this.initialize && typeof(this.initialize) == 'function') ? this.initialize.apply(this, arguments) : this;};

  _class.prototype = properties;

  return _class;

};
//==========================================================================================================================

var Selects = new Class({

 initialize :function(container,data,title){

  this.container  = container;

  this.num = title.length;

  this.Events = new Array(title.length-1);

  var i,l,select;

  for(i=0; i<this.num ; i++)

  {

   container.innerHTML = container.innerHTML + " " + title[i];

   container.appendChild(document.createElement('select'));

  }

  select = $$(container,'select')[0];

  for(i=0,l=data.length;i<l;i++)

   select.options.add(new Option(data[i].txt,i)); 

  addListener(select,'change',Bind(this,this.Change,select,data,0));

  this.Change(select,data,0);

 },

 Change : function(obj,data,num){

  if(num == this.num-1)return;  

  var menu = data[obj.value].menu;

  select = $$(this.container,'select')[num+1];

  select.length = 0;  

  if(!menu)return;

  if(this.Events[num]!=undefined)removeListener(select,'change',this.Events[num])

  this.Events[num] = Bind(this,this.Change,select,menu,num+1)

  addListener(select,'change',this.Events[num]);  

  for(var i=0,l=menu.length;i<l;i++)

   select.options.add(new Option(menu[i].txt,i));

  this.Change(select,menu,num+1); 

 }

});
//==========================================================================================================================

window.onload = function(){

 var data=[{"txt":"人族","menu":[{"txt":"大法师","menu":[{"txt":"大法技能","menu":[{"txt":"水元素","menu":[{"txt":"召唤物"},{"txt":"穿刺攻击"},{"txt":"很好东西"}]},{"txt":"暴风雪","menu":[{"txt":"魔法攻击"},{"txt":"面积伤害"},{"txt":"很漂亮"},{"txt":"可被打断"}]},{"txt":"辉煌光环"},{"txt":"瞬间移动"}]},{"txt":"英雄说明","menu":[{"txt":"智力英雄"},{"txt":"强大光环"},{"txt":"辅助型"},]}]},{"txt":"山丘之王","menu":[{"txt":"山丘技能","menu":[{"txt":"风暴之锤"},{"txt":"锥地"},{"txt":"锥晕"},{"txt":"天神下凡"}]},{"txt":"英雄说明","menu":[{"txt":"力量英雄"},{"txt":"秒杀能力"},{"txt":"个子很矮"},{"txt":"大技变态"}]}]},{"txt":"圣骑士","menu":[{"txt":"圣骑技能","menu":[{"txt":"光"},{"txt":"无敌"},{"txt":"光环"},{"txt":"复活"}]},{"txt":"英雄说明","menu":[{"txt":"力量英雄"},{"txt":"辅助英雄"},{"txt":"人称奶妈"}]}]},{"txt":"血法师","menu":[{"txt":"血法技能","menu":[{"txt":"火焰"},{"txt":"吸蓝"},{"txt":"虚无"},{"txt":"神鸟凤凰"}]},{"txt":"英雄说明","menu":[{"txt":"智力英雄"},{"txt":"辅助英雄"},{"txt":"长的很帅"}]}]}]},{"txt":"兽族","menu":[{"txt":"贱圣","menu":[{"txt":"贱圣技能","menu":[{"txt":"疾风步"},{"txt":"影分身"},{"txt":"致命一击"},{"txt":"剑刃风暴"}]},{"txt":"英雄说明","menu":[{"txt":"敏捷英雄"},{"txt":"高攻英雄"},{"txt":"杀人越货"},{"txt":"猥亵无敌"},{"txt":"非常强大"}]}]},{"txt":"先知男","menu":[{"txt":"先知技能","menu":[{"txt":"狼"},{"txt":"日"},{"txt":"闪电链"},{"txt":"地震"}]},{"txt":"英雄说明","menu":[{"txt":"智力英雄"},{"txt":"骚扰英雄"}]}]},{"txt":"牛头人酋长","menu":[{"txt":"牛头技能","menu":[{"txt":"冲击波"},{"txt":"阵地"},{"txt":"耐久光环"},{"txt":"复活"}]},{"txt":"英雄说明","menu":[{"txt":"力量英雄"},{"txt":"魔法强大"},{"txt":"长的威猛"},{"txt":"一个肉盾"}]}]},{"txt":"小YY","menu":[{"txt":"小Y技能","menu":[{"txt":"变动物"},{"txt":"治疗波"},{"txt":"小蛇棒子"},{"txt":"全体无敌"}]},{"txt":"英雄说明","menu":[{"txt":"敏捷英雄"},{"txt":"魔法强大"},{"txt":"辅助英雄"}]}]}]},{"txt":"不死族","menu":[{"txt":"死亡骑士","menu":[{"txt":"亡骑技能","menu":[{txt:"大便一拓"},{txt:"邪恶光环"},{txt:"死亡契约"},{txt:"复活亡灵"}]},{"txt":"英雄说明","menu":[{txt:"骑的是羊"},{txt:"未老先衰"},{txt:"冰霜之哀"},{txt:"啊而塞思"}]}]},{"txt":"巫妖","menu":[{"txt":"巫妖技能","menu":[{txt:"暴冰"},{txt:"冰甲"},{txt:"契约"},{txt:"死亡凋零"}]},{"txt":"英雄说明","menu":[{txt:"穿裙子"},{txt:"全是骨头"},{txt:"不男不女"}]}]},{"txt":"恐惧魔王","menu":[{"txt":"魔王技能"},{"txt":"英雄说明"}]},{"txt":"小强王子","menu":[{"txt":"王子技能"},{"txt":"英雄说明"}]}]}];

 new Selects($('demo1'),data,["种族","英雄"]);

 new Selects($('demo2'),data,["种族","英雄","介绍"]);

 new Selects($('demo3'),data,["种族","英雄","介绍","技能"]);

 new Selects($('demo4'),data,["种族","英雄","介绍","技能","技能说明"]);

}

</script>

</body>

</html>

Javascript 相关文章推荐
jQuery学习总结之元素的相对定位和选择器(持续更新)
Apr 26 Javascript
如何获取select下拉框的值(option没有及有value属性)
Nov 08 Javascript
js+css 实现遮罩居中弹出层(随浏览器窗口滚动条滚动)
Dec 11 Javascript
JS实现很酷的水波文字特效实例
Feb 26 Javascript
Jquery实现仿腾讯娱乐频道焦点图(幻灯片)特效
Mar 06 Javascript
JS实现定时自动关闭DIV层提示框的方法
May 11 Javascript
详解javascript中的事件处理
Nov 06 Javascript
Node.js实现兼容IE789的文件上传进度条
Sep 02 Javascript
浅谈jquery拼接字符串效率比较高的方法
Feb 22 Javascript
vue动态组件实现选项卡切换效果
Mar 08 Javascript
Angular中的$watch方法详解
Sep 18 Javascript
JQuery复选框全选效果如何实现
May 08 jQuery
javascript实现表格排序 编辑 拖拽 缩放
Jan 02 #Javascript
原生javascript实现DIV拖拽并计算重复面积
Jan 02 #Javascript
javascript使用smipleChart实现简单图表
Jan 02 #Javascript
原生javascript实现简单的datagrid数据表格
Jan 02 #Javascript
浅谈jQuery事件绑定原理
Jan 02 #Javascript
js+jquery实现图片裁剪功能
Jan 02 #Javascript
javascript 构造函数方式定义对象
Jan 02 #Javascript
You might like
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
juqery 学习之六 CSS--css、位置、宽高
2011/02/11 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
jquery动态切换背景图片的简单实现方法
2016/05/14 Javascript
JS表格组件神器bootstrap table详解(强化版)
2016/05/26 Javascript
批量下载对路网图片并生成html的实现方法
2016/06/07 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
js时间戳格式化成日期格式的多种方法介绍
2017/02/16 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
JavaScript剩余操作符Rest Operator详解
2019/07/20 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
Python语言的面相对象编程方式初步学习
2016/03/12 Python
wxPython实现绘图小例子
2019/11/19 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
python通过matplotlib生成复合饼图
2020/02/06 Python
浅谈matplotlib.pyplot与axes的关系
2020/03/06 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
python判断是空的实例分享
2020/07/06 Python
美国时尚女装在线:Missguided
2016/12/03 全球购物
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
美国医疗用品、医疗设备和家庭保健用品商店:Medical Supply Depot
2018/07/08 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
《一个小村庄的故事》教学反思
2014/04/13 职场文书
房地产营销活动策划方案
2014/09/15 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2015年党员个人自我评价
2015/03/03 职场文书
电影雷锋观后感
2015/06/10 职场文书
七年级作文之雪景
2019/11/18 职场文书
用Python实现Newton插值法
2021/04/17 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
2021/11/11 Python
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python