menu.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. //禁止鼠标选中文字。点选的时候容易选中文字
  2. document.onselectstart = function(event) {
  3. event = window.event || event;
  4. event.returnValue = false;
  5. }
  6. var Float_menu = (function() {
  7. var FloatObject = null;
  8. var Args = {};
  9. var MenuManager = function(o) {
  10. Args._window = o._window;
  11. Args.mainDiv = o.mainDiv || '#main';
  12. Args.menuDiv = o.menuDiv || '#float_menu';
  13. Args.rightMenuDiv = o.rightMenuDiv || '#my_menu';
  14. Args.smallDiv = o.smallDiv || '.cardList-div';
  15. Args.checkboxDiv = o.checkboxDiv || '.xzzt';
  16. Args.rightMenuHtml = $(Args.rightMenuDiv).html();
  17. Args.mainHtml = $(Args.mainDiv).html();
  18. Args.hasInit = false;
  19. //事件需要通过在部件内初始化的时候传递过来
  20. Args.ctrlCancelFunction = o.ctrlCancelFunction; //ctrl取消事件
  21. Args.ctrlFunction = o.ctrlFunction; //ctrl多选事件
  22. Args.clickCancelFunction = o.clickCancelFunction; //左右键取消事件
  23. Args.clickFunction = o.clickFunction; //左右键选中事件
  24. Args.shiftCancelFunction = o.shiftCancelFunction; //shift取消选中事件
  25. Args.shiftFunction = o.shiftFunction; //shift选中事件
  26. Args.stackNumber = 0; //用于记录shift选中的个数
  27. Args.indexArray = [];
  28. Args.lastClickDiv; //记录上次点击的下标
  29. Args.currentClickIndex; //shift点击的下标
  30. Args.endIndex = 0; //结束下标
  31. Args.clickTarget = "";
  32. $(Args.checkboxDiv).unbind("mousedown").bind("mousedown", function(e) {
  33. return false;
  34. });
  35. //this.handleEvent();
  36. Args._window.document.onkeydown = this.handleEvent;
  37. $(Args._window.document).find(Args.mainDiv).mouseup(function(e){
  38. MenuManager.prototype.handleEvent(e);
  39. });
  40. //Args._window.document.onclick = this.handleEvent;
  41. Args._window.document.ondblclick = this.handleDbclick;
  42. //给checkbox绑定事件
  43. /*var checkboxList = Args._window.document.getElementsByClassName("xzzt");
  44. for(var index in checkboxList){
  45. checkboxList[index].onmousedown = this.checkboxHandle;
  46. }*/
  47. };
  48. MenuManager.prototype = {
  49. findSmallDiv: function(dom, i) {
  50. if (i > 5 || !dom.parentElement) {
  51. return;
  52. } else {
  53. if (dom.parentElement.className.indexOf(Args.smallDiv.substr(1)) > -1) {
  54. return dom.parentElement;
  55. } else {
  56. return MenuManager.prototype.findSmallDiv(dom.parentElement, i++);
  57. }
  58. }
  59. },
  60. handleDbclick: function(evt) {
  61. console.log("dbclick");
  62. var dom = MenuManager.prototype.findSmallDiv(evt.srcElement, 0);
  63. if (dom) {
  64. MenuManager.prototype.checked(dom);
  65. $("input[value=查看]").click();
  66. }
  67. console.log(Args);
  68. },
  69. handleEvent: function(evt) {
  70. Args.hasInit = true;
  71. evt = (evt) ? evt : this.window.event;
  72. if (Args.clickTarget == "checkbox") {
  73. Args.clickTarget = "smallDiv";
  74. return false;
  75. }
  76. var items = $(Args.mainDiv).find(Args.smallDiv);
  77. if (evt.button == 0 && evt.ctrlKey) { //ctrl+左键
  78. MenuManager.prototype.ctrlHandle(evt, items);
  79. } else if (evt.button == 0 && evt.shiftKey) { //shift+左键
  80. MenuManager.prototype.shiftHandle(evt, items);
  81. } else {
  82. if ($(evt.target) && $(evt.target).hasClass("xzzt")) { //如果左键单击事件的触发对象是"checkbox"
  83. MenuManager.prototype.checkboxHandle(evt);
  84. } else {
  85. MenuManager.prototype.clickHandle(evt, items);
  86. }
  87. }
  88. },
  89. checkboxHandle: function(evt) { //点击checkbox处理函数
  90. Args.clickTarget = "checkbox";
  91. evt = (evt) ? evt : this.window.event;
  92. evt.stopPropagation(); //阻止事件冒泡
  93. var items = $(Args.mainDiv).find(Args.smallDiv);
  94. MenuManager.prototype.ctrlHandle(evt, items);
  95. return false;
  96. },
  97. checked: function(dom) {
  98. var _this = this;
  99. Args.checkType && Args.checkType();
  100. if ($(dom).children('div.xzzt').hasClass("icon-checked")) { //已被选定的情况下触发点击事件,则取消选择
  101. $(dom).children('div.xzzt').removeClass("icon-checked");
  102. _this.handleTargetClass(this, 'single', 'cancel');
  103. Args.clickCancelFunction && Args.clickCancelFunction();
  104. } else {
  105. Args.clickCancelFunction && Args.clickCancelFunction();
  106. $(dom).siblings().children('div.xzzt').removeClass("icon-checked");
  107. $(dom).children('div.xzzt').addClass("icon-checked");
  108. _this.handleTargetClass(dom, 'single', "choice");
  109. Args.clickFunction && Args.clickFunction(dom);
  110. }
  111. _this.handleMenu(dom);
  112. Args.lastClickDiv = dom;
  113. },
  114. clickHandle: function(evt, items) { //click处理函数
  115. var _this = this;
  116. for (var i = 0; i < items.length; i++) {
  117. items[i].onclick = function() { //左键
  118. Args.indexArray.push($(Args.mainDiv).find(Args.smallDiv).index(this));
  119. _this.checked(this);
  120. };
  121. items[i].oncontextmenu = function() { //右键
  122. Args.indexArray.push($(Args.mainDiv).find(Args.smallDiv).index(this));
  123. _this.checked(this);
  124. };
  125. }
  126. },
  127. ctrlHandle: function(evt, items) { //ctrl处理函数
  128. var _this = this;
  129. for (var i = 0; i < items.length; i++) {
  130. items[i].onclick = function() {
  131. Args.indexArray.push($(Args.mainDiv).find(Args.smallDiv).index(this));
  132. Args.checkType && Args.checkType();
  133. if ($(this).children('div.xzzt').hasClass("icon-checked")) { //已被选定的情况下触发点击事件,则取消选择
  134. $(this).children('div.xzzt').removeClass("icon-checked");
  135. _this.handleTargetClass(this, 'multiple', "cancel");
  136. Args.ctrlCancelFunction && Args.ctrlCancelFunction(this);
  137. } else {
  138. Args.ctrlCancelFunction && Args.ctrlCancelFunction(this);
  139. //$(this).siblings().removeClass("icon-checked");
  140. $(this).children('div.xzzt').addClass("icon-checked");
  141. _this.handleTargetClass(this, 'multiple', "choice");
  142. Args.ctrlFunction && Args.ctrlFunction(this);
  143. }
  144. _this.handleMenu(this);
  145. Args.lastClickDiv = this;
  146. };
  147. }
  148. },
  149. shiftHandle: function(evt, items) { //shift处理函数
  150. var _this = this;
  151. for (var i = 0; i < items.length; i++) {
  152. items[i].onclick = function() {
  153. Args.indexArray.push($(Args.mainDiv).find(Args.smallDiv).index(this));
  154. if (Args.indexArray.length > 1) {
  155. console.log("shiftHandle");
  156. //调用多选的清空
  157. _this.clearFunction();
  158. var iMin = Math.min(Args.indexArray[Args.indexArray.length - 2], Args.indexArray[Args.indexArray.length - 1]);
  159. var iMax = Math.max(Args.indexArray[Args.indexArray.length - 2], Args.indexArray[Args.indexArray.length - 1]);
  160. for (var i = iMin; i <= iMax; i++) {
  161. $($(Args.mainDiv).find(Args.smallDiv).children('div.xzzt')[i]).addClass("icon-checked");
  162. _this.handleTargetClass($(Args.mainDiv).find(Args.smallDiv)[i], 'multiple', 'choice');
  163. }
  164. Args.shiftFunction && Args.shiftFunction();
  165. if (Args.indexArray[Args.indexArray.length - 2] > Args.indexArray[Args.indexArray.length - 1]) {
  166. _this.handleMenu($(Args.mainDiv).find(Args.smallDiv)[iMin]);
  167. } else {
  168. _this.handleMenu($(Args.mainDiv).find(Args.smallDiv)[iMax]);
  169. }
  170. }
  171. };
  172. }
  173. },
  174. handleTargetClass: function(obj, type, operation, isShiftKey) { //处理div的class
  175. var _this = this;
  176. if (type == 'single') { //单选操作对应的处理
  177. if (operation == 'cancel') { //管理二数据块div对应的class :cardList-div/iconList-div
  178. $('div.xzzt').attr("class", "xzzt icon-unchecked");
  179. $($(obj).children('div.xzzt').get(0)).attr("class", "xzzt icon-unchecked");
  180. } else {
  181. $('div.xzzt').attr("class", "xzzt icon-unchecked");
  182. $($(obj).children('div.xzzt').get(0)).attr("class", "xzzt icon-checked");
  183. }
  184. } else { //多选操作处理class
  185. if (operation == 'cancel') {
  186. $($(obj).children('div.xzzt').get(0)).attr("class", "xzzt icon-unchecked");
  187. } else {
  188. $($(obj).children('div.xzzt').get(0)).attr("class", "xzzt icon-checked");
  189. }
  190. }
  191. },
  192. handleMenu: function(obj) {
  193. var allCardListDiv = $(".cardList-div");
  194. var falg=-1;
  195. var rowCount=0;
  196. var allCardListDivLength=allCardListDiv.length;
  197. for(var i = 0; i < allCardListDivLength; i++){
  198. var itemTop=$(allCardListDiv[i]).offset().top;
  199. if(falg>-1&&itemTop>falg){
  200. break;
  201. }
  202. rowCount=rowCount+1;
  203. falg=itemTop;
  204. }
  205. //最后一行添加标识
  206. var remainder = allCardListDivLength % rowCount;
  207. for (var i = allCardListDivLength - remainder ; i < allCardListDivLength; i++) {
  208. $(allCardListDiv[i]).addClass("lastCardList");
  209. }
  210. if ($(obj).children('div.xzzt').hasClass("icon-checked")) {
  211. var menu_width = $(Args.menuDiv).width();
  212. var leftX = ($(obj).offset().left + $(obj).width() / 2) - $(Args.menuDiv).width() / 2 - 8;
  213. if (((menu_width > $(obj).width()) && $(obj).offset().left == 1) || (menu_width > ($(obj).width() + $(obj).offset().left))) {
  214. $(Args.menuDiv).css("left", 1).css("top", $(obj).offset().top + $(obj).height()).show();
  215. } else {
  216. var leftX = ($(obj).offset().left + $(obj).width() / 2) - $(Args.menuDiv).width() / 2 - 8;
  217. if ($(obj).hasClass("lastCardList")) {
  218. console.log("kukuku")
  219. $(Args.menuDiv).css("left", leftX).css("top", $(obj).offset().top + $(obj).height() - 36).show();
  220. } else {
  221. console.log("就我")
  222. $(Args.menuDiv).css("left", leftX).css("top", $(obj).offset().top + $(obj).height()).show();
  223. }
  224. }
  225. }
  226. },
  227. clearFunction: function() {
  228. var _this = this;
  229. for (var i = 0; i < $(Args.mainDiv).find(Args.smallDiv).length; i++) {
  230. _this.handleTargetClass($(Args.mainDiv).find(Args.smallDiv)[i], 'single', 'cancel');
  231. }
  232. $(Args.rightMenuDiv).html(Args.rightMenuHtml); //还原右部分菜单
  233. $(Args.menuDiv).hide();
  234. }
  235. };
  236. //返回对象的初始化接口、提供获取最后一个点击的dom对象接口
  237. return {
  238. init: function(o) {
  239. FloatObject = new MenuManager(o);
  240. },
  241. getLastCheckedDom: function() {
  242. if (FloatObject) {
  243. return Args.lastClickDiv;
  244. }
  245. }
  246. };
  247. })();
  248. //version2.0