Jsequencing.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. function Jsequencing(options) {
  2. var defaults = { listid: "img_ul", thumbherf: "", bigherf: options.thumbherf, imgsrcarr: [], jsondata: false, viewimg: true, view_toggle: true, view_zoom: true, view_rotate: true, showtitle: true, IdClass: "__item__", }; var opts = $.extend(defaults, options); if ((typeof opts.imgsrcarr[0] == 'string') && opts.imgsrcarr[0].constructor == String) { opts.jsondata = false; } else if ((typeof opts.imgsrcarr[0] == 'object') && opts.imgsrcarr[0].constructor == Object) { opts.jsondata = true; } else if (opts.imgsrcarr[0] !== undefined) { alert("数据格式不正确") }
  3. if (!opts.jsondata) opts.showtitle = false; var box = this.box = $("#" + opts.listid);
  4. box.append("<div class='itemlist' style='height:100%'></div>" +
  5. "<div class='ident'></div>" +
  6. "<div class='morexy'></div>");
  7. var itemlist = box.find(".itemlist");
  8. this.itemhtml = function (imgsrc, imgtitle) {
  9. var titlebox = opts.showtitle ? '<div class="textbox">' + imgtitle + '</div>' : "";
  10. return '<div class="picbox">' +
  11. '<a class="viewimg" href="' + opts.bigherf + imgsrc + '" title="' + imgtitle + '">' +
  12. '<img src="' + opts.thumbherf + imgsrc + '" ondragstart="return false;" />' +
  13. '</a>' +
  14. '</div>'
  15. };
  16. var html = '';
  17. for (var j = 0; j < opts.imgsrcarr.length; j++) {
  18. var vimgsrc = opts.showtitle ? opts.imgsrcarr[j].src : opts.imgsrcarr[j];
  19. var vimgtitle = opts.showtitle ? opts.imgsrcarr[j].title : "";
  20. html += '<div class="item ' + opts.IdClass + '" id="' + opts.listid + '_item' + j + '" item="' + j + '">'
  21. + this.itemhtml(vimgsrc, vimgtitle) + '</div>';
  22. }
  23. itemlist.html(html);
  24. // return false;
  25. var box_w = box.width(); var item_w, item_h, col_len, few_len, imgnum, box_h; this.info = function (fun) { if (item_w === undefined || item_w === null) { item_w = itemlist.find("." + opts.IdClass).outerWidth(true); item_h = itemlist.find("." + opts.IdClass).outerHeight(true); box.find(".ident").css({ height: item_h + "px" }); box.find(".morexy").css({ width: item_w + "px", height: item_h + "px" }); }; imgnum = itemlist.find("." + opts.IdClass).length; col_len = Math.floor(box_w / item_w); few_len = Math.ceil(imgnum / col_len); box_h = item_h * few_len + 20; box.height(box_h + "px"); return true; }.bind(this)
  26. var draw = this.draw = function (dom, col, few, slidetime) { dom.css({ "transition-duration": slidetime + "ms", "transform": "translate(" + col + "px," + few + "px)", }); }
  27. this.computat = function (index, domid, slidetime) {
  28. var item = $("#" + domid); item.attr({ "item": index, }); if (chekobj[domid] !== undefined) { chekobj[domid] = index; }
  29. var col_aliquot = index % col_len; var row_aliquot = Math.floor(index / col_len); var index_col = item_w * (col_aliquot); var index_few = item_h * row_aliquot; this.draw(item, index_col, index_few, slidetime); item.attr({ "col": index_col, "few": index_few })
  30. }.bind(this)
  31. var redraw = this.redraw = function (strati, ilen, slidetime) { for (var j = strati; j < strati + ilen; j++) { this.computat(j, opts.listid + "_item" + itemidarr[j], slidetime); } }.bind(this)
  32. if (this.info(this)) { var chekobj = {}; var itemidarr = []; this.imgnewarr = []; for (var i = 0; i < imgnum; i++) { itemidarr.push(i) }; this.redraw(0, itemidarr.length, 0); }
  33. $(window).resize(function () { box_w = box.width(); if (this.info(this)) { this.redraw(0, itemidarr.length, 0); } }.bind(this)); this.datadel = function () {
  34. if (!($.isEmptyObject(chekobj))) {
  35. for (indexi in chekobj) {
  36. var itemi = parseInt(itemlist.find("#" + indexi).attr("item")); var arr2 = []; for (var i = 0; i < itemidarr.length; i++) { if (i == itemi) { itemidarr[i] = null; } else if (itemidarr[i] != null) { arr2.push(itemidarr[i]); }; }
  37. itemlist.find("#" + indexi).remove(); delete chekobj.indexi;
  38. }
  39. itemidarr = arr2;
  40. }
  41. this.redraw(0, itemidarr.length, 200);
  42. }.bind(this)
  43. this.dataempty = function () { itemlist.find("." + opts.IdClass).remove(); opts.imgsrcarr.length = 0; itemidarr.length = 0; chekobj = {}; box_h = "20"; box.height(box_h + "px"); }.bind(this)
  44. this.addimg = function (imgsrc, imgtitle) {
  45. if (opts.jsondata) { opts.imgsrcarr.push({ src: imgsrc, title: imgtitle }); } else { opts.imgsrcarr.push(imgsrc); }
  46. var imgnum = opts.imgsrcarr.length - 1; itemidarr.push(imgnum); var titlebox = opts.showtitle ? '<div class="textbox">' + vimgtitle + '</div>' : ""; if (imgtitle === undefined) imgtitle = ""; itemlist.append('<div class="item ' + opts.IdClass + '" id="' + opts.listid + '_item' + imgnum + '" item="' + imgnum + '">' + this.itemhtml(imgsrc, imgtitle) + '</div>'); this.redraw(itemidarr.length - 1, 1, 0); this.info(this);
  47. }.bind(this)
  48. this.addimgarr = function (imgobj) {
  49. if (Object.prototype.toString.call(imgobj) == '[object Array]') {
  50. if (opts.jsondata) { if (!((typeof imgobj[0] == 'object') && imgobj[0].constructor == Object)) { alert("数据格式不正确,请传入json格式数据!"); return; } } else { if (!((typeof imgobj[0] == 'string') && imgobj[0].constructor == String)) { alert("数据格式不正确,请传入字符串格式数据!"); return; } }
  51. for (var i = 0; i < imgobj.length; i++) { if (opts.jsondata) { if (imgobj[i].title === undefined) imgobj[i].title = ""; this.addimg(imgobj[i].src, imgobj[i].title); } else { this.addimg(imgobj[i]); } }
  52. }
  53. }.bind(this)
  54. this.getnewarr = function () {
  55. this.imgnewarr.length = 0; for (var i = 0; i < itemidarr.length; i++) { this.imgnewarr.push(opts.imgsrcarr[itemidarr[i]]) }
  56. console.log(this.imgnewarr); return this.imgnewarr;
  57. }.bind(this)
  58. itemlist.on("click", "input.checkbox", function () { var thisid = $(this).parents("." + opts.IdClass).attr("id"); if ($(this).prop("checked")) { var index = parseInt($(this).parents("." + opts.IdClass).attr("item")); chekobj[thisid] = index; } else { delete chekobj[thisid]; } })
  59. var startX = null; var startY = null; var moveDom = null; var checkItem = null; var startIndex = null; var isSelected = false; var oldCol = null; var oldFew = null; var identDom = box.find(".ident"); var multipleBox = box.find(".morexy"); var isDrag = false; var identMobieX = null; var identMobieY = null; function mouseinit() { moveDom = null; isDrag = false; checkItem.css({ "opacity": "1", "z-index": "" }); multipleBox.hide(); identDom.hide(); }
  60. function getchekobj() {
  61. var domidarr = []; for (var key in chekobj) { domidarr.push("#" + key); }
  62. var chekDomObj = $(domidarr.join(',')); if (domidarr.length == 0) { chekDomObj = checkItem; }
  63. return chekDomObj;
  64. }
  65. $(document).on("mouseup", function () { if (moveDom != null) { draw(moveDom, oldCol, oldFew, 0); mouseinit(); if (isSelected) { for (arri in chekobj) { var elem = $("#" + arri); draw(elem, elem.attr("col"), elem.attr("few"), 300); } } } })
  66. box.on({
  67. mousedown: function (e) {
  68. e.preventDefault(); if (e.target.localName == "input") { return false; }
  69. var isIdclass = $(e.target).hasClass(opts.IdClass); var pIdClass = $(e.target).parents("." + opts.IdClass)[0]; if (!isIdclass && pIdClass == undefined) { return false; }
  70. if (isIdclass) { checkItem = $(e.currentTarget); } else { checkItem = $(pIdClass); }
  71. if (checkItem.find("input.checkbox").prop("checked")) { isSelected = true; moveDom = multipleBox; } else { isSelected = false; moveDom = checkItem; }
  72. startX = e.pageX; startY = e.pageY; startIndex = parseInt(checkItem.attr("item")); oldCol = parseInt(checkItem.attr("col")); oldFew = parseInt(checkItem.attr("few")); checkItem = getchekobj(); checkItem.css({ "opacity": "0.8", "z-index": "10" }); draw(identDom, oldCol, oldFew, 0);
  73. }, mousemove: function (e) {
  74. if (moveDom == null) { return; }
  75. if (e.which != 1) { return; }
  76. var gapX = e.pageX - startX; var gapY = e.pageY - startY; var mobiex = oldCol + gapX; var mobiey = oldFew + gapY; if (mobiex > box_w - item_w) { mobiex = box_w - item_w; } else if (mobiex < 0) { mobiex = 0; }
  77. if (mobiey > box_h - item_h) { mobiey = box_h - item_h; } else if (mobiey < 0) { mobiey = 0; }
  78. if (Math.abs(gapX) > 10 || Math.abs(gapY) > 10) {
  79. if (!isDrag) {
  80. if (isSelected) {
  81. draw(moveDom, oldCol, oldFew, 0); for (arri in chekobj) { $("#" + arri).css({ "opacity": "0.25", "z-index": "10" }); draw($("#" + arri), oldCol, oldFew, 300); }
  82. moveDom.show();
  83. }
  84. }
  85. draw(moveDom, mobiex, mobiey, 0); identMobieX = Math.abs(Math.ceil((mobiex - item_w / 2) / item_w)); identMobieY = Math.abs(Math.ceil((mobiey - item_h / 2) / item_h)); identDom.show(); draw(identDom, identMobieX * item_w, identMobieY * item_h, 0); isDrag = true;
  86. }
  87. }, mouseup: function (e) {
  88. if (moveDom == null) { return; } else if (isDrag) {
  89. draw(moveDom, oldCol, oldFew, 0); var toposion = identMobieY * col_len + identMobieX; if (isSelected) {
  90. var min = itemidarr.length; var max = 0; var transsh = []; for (indexi in chekobj) { itemlist.find("#" + indexi).css({ "opacity": "1", "z-index": "" }); for (var i = 0; i < itemidarr.length; i++) { if (i == chekobj[indexi]) { min = i < min ? i : min; max = i + 1 > max ? i + 1 : max; transsh.push(itemidarr[i]); itemidarr[i] = null; }; }; }
  91. for (var i = 0; i < transsh.length; i++) { itemidarr.splice(toposion + i, 0, transsh[i]); }
  92. for (var i = itemidarr.length - 1; i >= 0; i--) { if (itemidarr[i] == null) { itemidarr.splice(i, 1); }; }
  93. min = toposion < min ? toposion : min; max = toposion > max ? toposion : max; if (max - min != transsh.length) { redraw(min, max - min, 200); } else { for (arri in chekobj) { var elem = $("#" + arri); draw(elem, elem.attr("col"), elem.attr("few"), 300); } }
  94. } else { var difference = toposion - startIndex; if (difference > 1) { var changesitem = itemidarr.splice(startIndex, 1)[0]; itemidarr.splice(toposion - 1, 0, changesitem); redraw(startIndex, startIndex + difference, 200); } else if (difference < 0) { var changesitem = itemidarr.splice(startIndex, 1)[0]; itemidarr.splice(toposion, 0, changesitem); difference = Math.abs(difference) + 1; redraw(toposion, toposion + difference, 200); } }
  95. mouseinit();
  96. }
  97. }, mouseleave: function (e) { if (moveDom == null) { return; } },
  98. })
  99. var ismove = false; var eimgx, eimgy; itemlist.on({ click: function (e) { e.preventDefault(); if (!ismove) { var item = parseInt($(this).parents("." + opts.IdClass).attr("item")); chakshow(item) }; }, mousedown: function (e) { eimgx = e.pageX; eimgy = e.pageY; ismove = false; }, mouseup: function (e) { eimgx = Math.abs(e.pageX - eimgx); eimgy = Math.abs(e.pageY - eimgy); ismove = false; if (eimgx > 5 || eimgy > 5) ismove = true; }, mouseleave: function () { ismove = false; }, }, "a"); if (opts.viewimg) {
  100. var chak_btn = ""; if (opts.view_toggle) chak_btn += '<button class="chak_prev">上一个</button><button class="chak_next">下一个</button>'; if (opts.view_rotate) chak_btn += '<button class="chak_turn_l">向左转</button><button class="chak_turn_r">向右转</button>'; chak_btn += '<button class="chak_close">关闭</button>'; box.append('<div class="chak_box">' +
  101. '<div class="chak_title"></div>' +
  102. '<div class="chak_img">' +
  103. '<img draggable="false" src="" ondragstart="return false;" />' +
  104. '<p></p></div>' +
  105. '<div class="chak_btn">' + chak_btn + '</div>' +
  106. '</div>'); var chak_box = box.find(".chak_box"); chak_box.on({ click: function (e) { chakhide(); } }); chak_box.find(".chak_img > img").on({ click: function (e) { e.stopPropagation(); } }); if (opts.view_toggle) { chak_box.find(".chak_prev").on({ click: function (e) { e.stopPropagation(); var item = parseInt(chak_box.find(".chak_img").attr("item")) - 1; chakshow(item); } }); chak_box.find(".chak_next").on({ click: function (e) { e.stopPropagation(); var item = parseInt(chak_box.find(".chak_img").attr("item")) + 1; chakshow(item); } }); }; var isview = false; var pisshow = false; var chakshow = function (imgitem) {
  107. isview = true; var chak_ptog = function (text) { var chak_p = chak_box.find(".chak_img > p"); if (!pisshow) { pisshow = true; chak_p.html(text).show(); setTimeout(function () { pisshow = false; chak_p.hide(); }, 1000); } }
  108. if (imgitem < 0) { chak_ptog("已经是第一张图片"); return; } else if (imgitem > itemidarr.length - 1) { chak_ptog("已经是最后一张图片"); return; } else { chak_box.find(".chak_img > p").hide() }
  109. var viewimgdom = itemlist.find("." + opts.IdClass + "[item='" + imgitem + "'] .viewimg")
  110. var imgsrc = viewimgdom.attr("href"); var imgtitle = viewimgdom.attr("title"); chak_box.find(".chak_img").attr("item", imgitem); chak_box.find(".chak_img > img").attr({ "src": imgsrc, "style": "" }); chak_box.find(".chak_title").html(imgtitle); $("body").css({ "overflow": "hidden" }); $("body", parent.document).css({ "overflow": "hidden" }); chak_box.show();
  111. }; var chakhide = this.chakhide = function () { isview = false; chak_box.find(".chak_img").attr("item", ""); chak_box.find(".chak_img > img").attr("src", ""); $("body").css({ "overflow": "auto" }); chak_box.hide(); }; if (opts.view_zoom) { var viewimg_zoom = function (solls, zoomval) { var imgdom = chak_box.find(".chak_img > img"); var img = new Image(); img.src = imgdom.attr("src"); var imgWidth = img.width; var ckimg_w = parseInt(imgdom.width()); imgdom.css({ "max-width": imgWidth + "px", "max-height": "none" }); solls > 0 ? ckimg_w += zoomval : ckimg_w -= zoomval; imgdom.css({ "width": ckimg_w + "px" }); }; chak_box.find(".chak_img > img").on({ click: function (event) { event.stopPropagation(); }, mousedown: function (e) { viewmove = true; var marginx = parseInt($(this).css("margin-left")); var marginy = parseInt($(this).css("margin-top")); var _x = e.pageX - marginx; var _y = e.pageY - marginy; $(this).off("mousemove").on({ mousemove: function (e) { if (viewmove) { var x = e.pageX - _x; var y = e.pageY - _y; $(this).css({ "margin-top": y + "px", "margin-left": x + "px" }); } } }); }, mouseup: function (e) { viewmove = false; }, mouseout: function (e) { viewmove = false; }, }); $(document).on('mousewheel', function (event) { if (isview) { var solls = event.originalEvent.wheelDelta; viewimg_zoom(solls, 50); } }); document.addEventListener("DOMMouseScroll", function (event) { if (isview) { var solls = event.detail; solls = 0 - solls; viewimg_zoom(solls, 50); } }); }; if (opts.view_rotate) {
  112. function getmatrix(a, b, c, d, e, f) {
  113. var aa = Math.round(180 * Math.asin(a) / Math.PI); var bb = Math.round(180 * Math.acos(b) / Math.PI); var cc = Math.round(180 * Math.asin(c) / Math.PI); var dd = Math.round(180 * Math.acos(d) / Math.PI); var deg = 0; if (aa == bb || -aa == bb) { deg = dd; } else if (-aa + bb == 180) { deg = 180 + cc; } else if (aa + bb == 180) { deg = 360 - cc || 360 - dd; }
  114. return deg >= 360 ? 0 : deg;
  115. }
  116. var chak_turn = function (dom, step) { var _img = chak_box.find(".chak_img > img"); var deg = eval('get' + _img.css('transform')); _img.css({ 'transform': 'translate(-50%,-50%) rotate(' + (deg + step) % 360 + 'deg)' }); dom.attr({ "disabled": "true" }); setTimeout(function () { dom.removeAttr("disabled"); }, 60) }
  117. chak_box.find(".chak_turn_l").on({ click: function (e) { e.stopPropagation(); chak_turn($(this), -90) } }); chak_box.find(".chak_turn_r").on({ click: function (e) { e.stopPropagation(); chak_turn($(this), 90) } });
  118. }
  119. }
  120. }