跨帧结构无限级菜单

解释地址
写点东西不容易啊 真的就这么杯具了 杯具啊

杯具的菜单

body{margin:0px; padding:0px; font-size:12px;}
*{margin:0; padding:0;}
.de{ background-image:url(http://paui.52done.cn/demos/menu/images/nav_bg.gif);}
#demo1{list-style:none; height:26px; cursor:pointer; background-image:url(http://paui.52done.cn/demos/menu/images/nav_bg.gif); color:#FFFFFF; margin-left:20px;}
#demo1 li{float:left; height:25px; line-height:25px; padding:0 15px; margin-top:1px;}
#demo1 li.focus{ color:#FE6100; background-color:#fcfcfc;}

  • 人族
  • 兽族
  • 不死族

(function(window,undefined){
window.Sys = function (ua){
var b = {
ie: /msie/.test(ua) && !/opera/.test(ua),
opera: /opera/.test(ua),
safari: /webkit/.test(ua) && !/chrome/.test(ua),
firefox: /firefox/.test(ua),
chrome: /chrome/.test(ua)
},vMark = "";
for (var i in b) {
if (b[i]) { vMark = "safari" == i ? "version" : i; break; }
}
b.version = vMark && RegExp("(?:" + vMark + ")[\\/: ]([\\d.]+)").test(ua) ? RegExp.$1 : "0";
b.ie6 = b.ie && parseInt(b.version, 10) == 6;
b.ie7 = b.ie && parseInt(b.version, 10) == 7;
b.ie8 = b.ie && parseInt(b.version, 10) == 8;
return b;
}(window.navigator.userAgent.toLowerCase());
window.Sys.ie6&&document.execCommand("BackgroundImageCache", false, true);
window.$ = function(Id){
return document.getElementById(Id);
};
window.addListener = function(element,e,fn){
!element.events&&(element.events = {});
element.events[e]&&(element.events[e][addListener.guid++]=fn)||(element.events[e] = {'0':fn});
element.addEventListener?element.addEventListener(e,fn,false):element.attachEvent("on" + e,fn);
};
window.addListener.guid = 1;
window.removeListener = function(element,e,fn){
var handlers = element.events[e],type;
if(fn){
for(type in handlers)
if(handlers[type]===fn){
element.removeEventListener?element.removeEventListener(e,fn,false):element.detachEvent("on" + e,fn);
delete handlers[type];
}
}else{
for(type in handlers){
element.removeEventListener?element.removeEventListener(e,handlers[type],false):element.detachEvent("on" + e,handlers[type]);
delete handlers[type];
}
}
};
window.setStyle = function(elems, style, value){
if( !elems.length ) elems = [elems];
if( typeof style == "string"){
style = value === undefined?{cssText:style}:(function(o){
return (o[style] = value,o);
})({});
};
each(elems,function(i,elem,style){
var value,name,ie=Sys.ie ;
for(name in style){
value = style[name];
if (name === "opacity" && ie) {
elem.style.filter = (elem.currentStyle.filter || "").replace( /alpha\([^)]*\)/, "" ) + "alpha(opacity=" + value * 100 + ")";
}else if(name === "float"){
elem.style[ ie ? "styleFloat" : "cssFloat" ] = value;
}else{
name = name.replace(/-([a-z])/ig, function(all, letter){
return letter.toUpperCase();
});
elem.style[name] = value;
}
}
},style);
};
var slice = Array.prototype.slice;
window.Bind = function(object, fun) {
var args = slice.call(arguments).slice(2);
return function() {
return fun.apply(object, args);
};
};
window.BindAsEventListener = function(object, fun,args) {
var args = slice.call(arguments).slice(2);
return function(event) {
return fun.apply(object, [event || window.event].concat(args));
}
};
//copy from jQ
window.extend = function(){
var target = arguments[0] || {}, i = 1, length = arguments.length, deep = true, options;
if ( typeof target === "boolean" ) {
deep = target;
target = arguments[1] || {};
i = 2;
}
if ( typeof target !== "object" && Object.prototype.toString.call(target)!="[object Function]")
target = {};
for(;i"+menu.txt+"

";
});
var cul = cDoc.getElementsByTagName('ul')[0];
//第一次的时候生成ul 之后就一直用之前的ul
if(cul){
cul.innerHTML = str;
//为什么要删除事件了 因为一只都是用的 一个popup 但是参数不同 所以只要删除后重新绑定 来跟新数据
removeListener(cul,'mouseover');
removeListener(cul,'mouseout');
removeListener(cul,'click');
}else{
//一样要添加样式 本页面的样式是去不到的 因为popup本身也相当于一个页面
var style=cDoc.createStyleSheet();
style.addRule('ul',this.style.ul);
style.addRule('ul li',this.style.li);
style.addRule('ul li.focus',this.style.focus);
cDoc.body.innerHTML = "

    "+str+"

";
cul = cDoc.getElementsByTagName('ul')[0];
}
popup&&popup.hide();
//显示的位置和大小
if(this.ul===ul){
var ret = objPos(li);
popup.show(ret.left+1,ret.top+li.offsetHeight,140,data.length*22+2,cDoc.body);
}else{
popup.show(140-2,22*num,140,data.length*22+2,cDoc.body);
}
//把显示出来的 popup放到this.list中 如果已经添加了 就不要重复添加了
this.findul(cul)?(this.findul(cul).obj.is=false):this.list.push({ul:cul,is:false});
addListener(cul,'mouseover',BindAsEventListener(this,this.openPopup,cul,cDoc,data));
addListener(cul,'click',BindAsEventListener(this,this.reUrl));
addListener(cul,'mouseout',BindAsEventListener(this,this.hidea,this.ul,cul));
}
},
reUrl : function(e){
if(e.srcElement.nodeName.toLowerCase() ==='li')
alert(e.srcElement.getAttribute('pa_ui_menuie_url'))
},
clear : function(){
clearTimeout(this.time);
this.time = null;
},
hidea : function(e,ul,cul){
var li = e.srcElement,self=this,callback=this.findul(cul||'');
if(!cul){
this.isOver = false;
this.list.length>0&&this.list[0].is===true?this.foucsLi.push(li):removeClass(li,'focus');
}else{
var i=callback.id+1,l=this.list.length,p=false;
for(;i

[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]

(0)

相关推荐

  • 跨帧结构无限级菜单

    解释地址 写点东西不容易啊 真的就这么杯具了 杯具啊 杯具的菜单 body{margin:0px; padding:0px; font-size:12px;} *{margin:0; padding:0;} .de{ background-image:url(http://paui.52done.cn/demos/menu/images/nav_bg.gif);} #demo1{list-style:none; height:26px; cursor:pointer; background-im

  • Vue3.0实现无限级菜单

    业务需求 菜单项是业务系统的重要组成部分,一般业务系统都要支持显示多级业务菜单,但是根据每个业务人员的权责不同,看到的的菜单项也是不同的. 这就要求页面可以支持无限极菜单显示,根据每个用户的权限不同,后台服务返回对应的菜单项. 本文基于Vue 3.0实现了一个可配置的无限等级菜单,关键代码如下: 后端返回的菜单项数据结构 后端服务一般不会直接返回一个树型结构菜单集合给前端,这样做也不合理.前端应该根据自己的具体需求,构建自己的菜型单树.后端返回的数据结构一般包含以下一个字段: Id 菜单ID,

  • Vue3 封装 Element Plus Menu 无限级菜单组件功能的详细代码

    目录 1 数据结构定义 1.1 菜单项数据结构 1.2 菜单配置数据结构 2 使用 tsx 实现封装 2.1 tsx 基本结构 2.2 定义 prop 2.3 递归实现组件 3 使用 SFC 实现菜单封装 3.1 封装菜单项的渲染 3.2 封装菜单组件 4 测试组件 4.1 菜单测试数据 4.2 测试页面 4.3 运行效果 总结: 本文分别使用 SFC(模板方式)和 tsx 方式对 Element Plus el-menu 组件进行二次封装,实现配置化的菜单,有了配置化的菜单,后续便可以根据路由

  • jQuery 无限级菜单的简单实例

    我将CSS完全分离出来用jQuery附加式样,就是为了多级染色,并且生成目录树和控制式样也很容易,生成时也不需要考虑式样.数据表建议用事先Order排序的方式,不要读取数据的时候才分级排序,这样性能会较佳. 我把它做成了个.Net的控件,作为轻量级的无限目录树,还是相当好用的.只是还不完善,我先慢慢修改,等差不多了再发布出来. 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu

  • 使用jquery菜单插件HoverTree仿京东无限级菜单

    效果图: 看了上面效果图,你或许已经明白为什么是仿京东菜单.如果还不明白,请访问http://list.jd.com/list.html?cat=9987,653,655 看看左上的菜单.当然这个HoverTree菜单的功能更加强大,可以实现无限级菜单. HTML代码: 复制代码 代码如下: <!DOCTYPE html> <html> <head> <title>HoverTree - jquery菜单插件</title> <base t

  • vue Element左侧无限级菜单实现

    最近项目中,要用到element-ui的无限级分类菜单,根据角色生成不同的递归数据,查阅了网上很多资料,发现很多都不太完整并且没有很多的延伸性. 梳理递归数据 我们一般拿到后台的数据是:1.扁平化数据格式2.递归式数据格式 let arr = [ { name:小七, id:1 }, { name:小八, id:2 }, { name: 小九, id:3 } ] 我们从后台拿到的是这种扁平化处理数据,那我们实现递归菜单的话需要什么数据格式呢,需要格式如下: let menuItems = [ {

  • Angluar+zorro实现无限级菜单

    关于Angular + zorro 实现无限级菜单,供大家参考,具体内容如下 该文章为思路+代码,为通用式前端无限级菜单. 首先通过后台接收到的数据是这样的 "table":[     {     "id": 1017.0,     "menuName": "用户管理",         "child":[{             "id": 23.0,             &qu

  • AngularJS实现树形结构(ztree)菜单示例代码

    树形结构 树形结构有多种形式和实现方式,zTree可以说得上是一种比较简洁又美观的且实现起来也相对简单.zTree是一个依靠jQuery实现的多功能"树插件".它最大的优点是配置灵活,只要id与pid的值相同就可形成一个简单的父子结构.再加上免费开源,使用zTree的人越来越多. 效果图如下 首先你需要知道AngularJS的双向数据绑定是什么才可以更好的理解下面的代码,想了很久才想出用下面的代码来实现左侧菜单树形结构 要实现上面的功能你需要操作如下步骤: 在HTML标签内添加ng-a

  • 基于 Ajax 的无限级菜单

    支持Form的无闪提交(方法有点笨)支持MVC框架,即支持传统网页架构多线程并发请求(要语言支持线程)动态加载文件,只加载有用的!处理了Ajax框架臃肿的JS文件问题.采用no table的全div + css布局 a. 获得XMLHTTPRequest对象,网上到处都找得到了,不多说: function newXMLHttpRequest() {var xmlreq = false;if (window.XMLHttpRequest) {xmlreq = new XMLHttpRequest(

  • 无限级别菜单的实现

    <?  /* 看到很多朋友问过无限级别菜单的的问题(其实理论上还是有级别的,毕竟要受到个方便的条件的限制,比如: 数据库字段的类型等),我曾经用老大(唠叨)提供的代码写出来过无限级别的菜单,但是感觉效果不是很好(视觉上),于是趁着"夜深人静"就写这个"无限制级别的菜单",其实道理很简单,主要是数据表的设计,还有递归方法的使用(如果有时间我会用中值排序法来做),我会在下面给出数据结构的设计(非常简单),这里我没有加上竖直的虚线(windows资源管理器的虚线),

随机推荐