-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathjquery.sMenus.js
154 lines (117 loc) · 3.76 KB
/
jquery.sMenus.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
jQuery 右键自定义菜单插件 ver 0.1
https://github.com/28269890/sMenus
Demo:https://28269890.github.io/sMenus
*/
(function($){
$.fn.sMenus = function(options) {
var o = $.extend({}, $.fn.sMenus.defaults,options);
if($("#_sMenus").size()==0){ //添加一个菜单
$("body").append("<div id='_sMenus' class='"+o.css+"'></div>");
}
$("#_sMenus").on({ //移除菜单右键
contextmenu:function(){
return false;
},
})
$(document).click(function(e){ //菜单外点击关闭菜单
var target = $(e.target);
if(target.closest("#_sMenus").length != 0){
return true;
}
$("#_sMenus").fadeOut(o.outTime);
})
var makeMenu = function(d){ //生成菜单元素
var div = $("<div>")//菜单元素
if(d.text){ //菜单名称
div.addClass("menu")
}else{
div.addClass("hr") //无效名称视为间隔线
return div;
}
if(d.css){
div.addClass(d.css)//添加独立的css样式
}
var span = $("<span>"+d.text+"</span>") //菜单点击元素
if(d.close!=undefined){ //检查【是否关闭菜单】项是否设置
span.data("close",d.close)//使用菜单项中的【是否关闭菜单】选项
}else{
span.data("close",o.close)//使用配置中的【是否关闭菜单】选项
}
if(typeof(d.fn)=="function"){//点击事件
span.data("fn",d.fn)//保存点击事件配置
span.click(function(){//点击事件
$(this).data("fn")()//执行点击事件
if($(this).data("close")){//检测【是否关闭菜单】
$("#_sMenus").fadeOut(o.outTime);
}
})
}
div.append(span)//将点击元素放入菜单元素中
if(Array.isArray(d.data)){//检测是否有子菜单
if(d.data.length>0){
var subDiv = $("<div class='"+o.css+"'>")
for(var i in d.data){
subDiv.append(makeMenu(d.data[i]))
}
div.append(subDiv)
div.addClass("main")
}
}
return div;//返回菜单元素
}
this.each(function(){//循环选择器选中的元素
if(!Array.isArray($(this).data("sMenu"))){//如果菜单数据不为数组
if($(this).attr("sMenu")){//元素中的菜单数据存在
$(this).data("sMenu",eval($(this).attr("sMenu")))
}else{
$(this).data("sMenu",o.data)
}
}
if(!Array.isArray($(this).data("sMenu"))){
return false;
}
$(this).on({
contextmenu:function(){//关闭元素右键默认菜单
return false;
},
mouseup:function(e){//鼠标按键弹起
if(3 != e.which){ //不是右键,结束功能
return true;
}
$("#_sMenus").html("")//清空菜单
var d = $(this).data("sMenu")
var menuDiv = $("<div>")
for(var i in d){
menuDiv.append(makeMenu(d[i]))
}
$("#_sMenus").append(menuDiv.children())
var x = e.pageX + 1
var y = e.pageY + 1
if(x + $("#_sMenus").outerWidth() >= document.body.clientWidth){ //菜单已横向超出边界
x -= $("#_sMenus").outerWidth() ;//将菜单显示在鼠标左侧
};
if(y + $("#_sMenus").outerHeight() >= document.body.clientHeight){//菜单已超出纵向边界
y -= $("#_sMenus").outerHeight() ;//将菜单显示在鼠标上方
};
if (x < 0){x=0}
if (y < 0){y=0}
$("#_sMenus").css({
"left": x,
"top": y
});
$("#_sMenus").fadeTo(o.inTime,o.phy);
}
})
});
};
//--这里的都是初始值,能够设定的内容也都在这里
$.fn.sMenus.defaults = {
data:[],
phy:1, //透明度 0-1
inTime:200,//淡入时间
outTime:200,//淡出时间
css:"sMenus",//指定css样式
close:true,//点击菜单项目后是否关闭菜单
};
})(jQuery);