directives.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  1. import Vue from 'vue';
  2. export default {
  3. install() {
  4. Vue.directive('view', {
  5. inserted(el, binding) {
  6. el.onclick = (e) => {
  7. let url = e.target.getAttribute('url');
  8. let $div = document.createElement('div');
  9. $div.setAttribute('id', 'img-view');
  10. document.body.appendChild($div);
  11. $div.innerHTML = `<i class="el-icon-error"></i>
  12. <span>滚动鼠标滚轮可以放大、缩小图片;点击关闭预览。</span>
  13. <img src="` + url + `" width="800"/>`
  14. $div.onclick = (e) => {
  15. $div.removeEventListener('DOMMouseScroll', scrollFunc);
  16. window.onmousewheel = document.onmousewheel = null;
  17. document.body.removeChild($div)
  18. }
  19. let i = 800;
  20. function scrollFunc(e) {
  21. e = e || window.event;
  22. if(e.wheelDelta) {
  23. //IE/Opera/Chrome
  24. if(parseInt(e.wheelDelta) > 0) {
  25. if(i < document.body.clientWidth - 100) {
  26. i += 20;
  27. }
  28. } else {
  29. if(i > 100) {
  30. i -= 20;
  31. }
  32. }
  33. } else if(e.detail) {
  34. //Firefox
  35. if(parseInt(e.wheelDelta) > 0) {
  36. if(i < document.body.clientWidth - 50) {
  37. i += 20;
  38. }
  39. } else {
  40. if(i > 100) {
  41. i -= 20;
  42. }
  43. }
  44. }
  45. $div.getElementsByTagName('img')[0].setAttribute('style','width: ' + i +'px')
  46. }
  47. $div.addEventListener('DOMMouseScroll', scrollFunc, false)
  48. window.onmousewheel = document.onmousewheel = scrollFunc
  49. }
  50. }
  51. })
  52. // 提示框,需要绑定data-txt
  53. Vue.directive('tip', {
  54. inserted(el, binding) {
  55. let $div;
  56. el.addEventListener('mouseover', e => {
  57. const curStyle = window.getComputedStyle(el, ''); // 获取当前元素的style
  58. const textSpan = document.createElement('span'); // 创建一个容器来记录文字的width
  59. // 设置新容器的字体样式,确保与当前需要隐藏的样式相同
  60. textSpan.style.fontSize = curStyle.fontSize;
  61. textSpan.style.fontWeight = curStyle.fontWeight;
  62. textSpan.style.fontFamily = curStyle.fontFamily;
  63. // 将容器插入body,如果不插入,offsetWidth为0
  64. document.body.appendChild(textSpan);
  65. // 设置新容器的文字
  66. textSpan.innerHTML = el.innerText;
  67. let flag = textSpan.offsetWidth >= el.offsetWidth;
  68. if(binding.modifiers.same) {
  69. flag = textSpan.offsetWidth > el.offsetWidth;
  70. }
  71. if (flag) {
  72. let text = e.target.getAttribute('data-txt') || el.innerText,
  73. top = e.clientY - e.offsetY,
  74. left = e.clientX - e.offsetX + e.target.clientWidth/2;
  75. $div = document.createElement('div');
  76. $div.setAttribute('class', 'site-tips');
  77. $div.setAttribute('style', 'top:' + top + 'px;left:' + left + 'px');
  78. $div.innerHTML = text;
  79. document.body.appendChild($div);
  80. }
  81. // 移除刚刚创建的记录文字的容器
  82. document.body.removeChild(textSpan);
  83. })
  84. el.addEventListener('mouseout', e => {
  85. if($div) {
  86. try {
  87. document.body.removeChild($div);
  88. } catch(e) {
  89. }
  90. }
  91. })
  92. }
  93. })
  94. Vue.directive('number-input', {
  95. inserted: (el, binding) => {
  96. el.addEventListener("keypress", (e) =>{
  97. e = e || window.event;
  98. let charcode = e.keyCode || e.which || e.charCode;
  99. if(charcode == 45) {
  100. if(e.target.value && (e.target.value[0] !== '-' || e.target.value[0] === '-')) {
  101. e.preventDefault();
  102. }
  103. return
  104. }
  105. if(binding.modifiers.float && charcode == 46) {
  106. if(!e.target.value || (e.target.value && ((e.target.value[0] === '-' && e.target.value.length < 2) || (e.target.value.length >= 2 && e.target.value.includes('.'))))) {
  107. e.preventDefault();
  108. }
  109. return
  110. }
  111. if(!binding.modifiers.float && charcode == 46) {
  112. e.preventDefault();
  113. return;
  114. }
  115. if(charcode!=8 && charcode!=46 && charcode!=45 && (charcode<48 || charcode>57)){
  116. if(e.preventDefault){
  117. e.preventDefault();
  118. }else{
  119. e.returnValue = false;
  120. }
  121. }
  122. });
  123. el.addEventListener("paste", () => false);
  124. el.addEventListener("dragenter", () => false);
  125. el.addEventListener("keyup", (e) => {
  126. e.target.value = e.target.value.replace(/[^\d.-]/gi,'');
  127. });
  128. }
  129. })
  130. Vue.directive('trim', {
  131. inserted: (el) => {
  132. el.addEventListener("keypress", (e) =>{
  133. e = e || window.event;
  134. let charcode = e.keyCode || e.which || e.charCode;
  135. if(charcode === 32) {
  136. if(e.preventDefault){
  137. e.preventDefault();
  138. }else{
  139. e.returnValue = false;
  140. }
  141. return;
  142. }
  143. })
  144. }
  145. })
  146. Vue.directive('loadmore', {
  147. bind(el, binding) {
  148. el.addEventListener('scroll', function() {
  149. let sign = 100
  150. const scrollDistance = this.scrollHeight - this.scrollTop - this.clientHeight
  151. if (scrollDistance <= sign) {
  152. binding.value()
  153. }
  154. }, true)
  155. }
  156. })
  157. // 输入框输入校验
  158. Vue.directive('float', {
  159. inserted: (el) =>{
  160. el.addEventListener("keypress", (e) =>{
  161. e = e || window.event;
  162. let charcode = e.keyCode || e.which || e.charCode;
  163. let val = e.target.value
  164. if(val === '-') {
  165. if(charcode < 48 || charcode > 57) {
  166. e.preventDefault()
  167. e.returnValue = false;
  168. return
  169. }
  170. } else if(val === '-0' || val === '0') {
  171. if(charcode !== 46) {
  172. e.preventDefault()
  173. e.returnValue = false
  174. return
  175. }
  176. } else {
  177. if(val.indexOf('.') !== -1) {
  178. // 只能输入0-9
  179. if(charcode < 48 || charcode > 57) {
  180. e.preventDefault()
  181. e.returnValue = false;
  182. return
  183. }
  184. } else {
  185. if(val.length) {
  186. // 只能输入0-9和.
  187. if((charcode < 48 || charcode > 57) && charcode != 46) {
  188. e.preventDefault()
  189. e.returnValue = false
  190. return
  191. }
  192. } else {
  193. // 只能输入0-9 . -
  194. if((charcode < 48 || charcode > 57) && charcode != 46 && charcode != 45) {
  195. e.preventDefault()
  196. e.returnValue = false
  197. return
  198. }
  199. }
  200. }
  201. }
  202. });
  203. el.addEventListener("paste", () => {
  204. // el.addEventListener('keyup', e => {
  205. // setTimeout(() => {
  206. // }, 100);
  207. // })
  208. // el.addEventListener('blur', e => {
  209. // e.target.value = e.target.value.replace(/[^0-9-]*((0{1}|[1-9]\d*)(\.\d{1,})?).*$/, '$1')
  210. // })
  211. // e.preventDefault()
  212. // e.returnValue = false
  213. // return
  214. });
  215. el.addEventListener("dragenter", () => false);
  216. }
  217. })
  218. Vue.directive('txt-tip',{
  219. inserted(el, binding) {
  220. let $div;
  221. el.addEventListener('mouseover', e => {
  222. // alert("111")
  223. const curStyle = window.getComputedStyle(el, ''); // 获取当前元素的style
  224. const textSpan = document.createElement('span'); // 创建一个容器来记录文字的width
  225. // 设置新容器的字体样式,确保与当前需要隐藏的样式相同
  226. textSpan.style.fontSize = curStyle.fontSize;
  227. textSpan.style.fontWeight = curStyle.fontWeight;
  228. textSpan.style.fontFamily = curStyle.fontFamily;
  229. textSpan.style.color = curStyle.color;
  230. // 将容器插入body,如果不插入,offsetWidth为0
  231. document.body.appendChild(textSpan);
  232. // 设置新容器的文字
  233. textSpan.innerHTML = el.innerText;
  234. let flag = textSpan.offsetWidth >= el.offsetWidth;
  235. if(binding.modifiers.same) {
  236. flag = textSpan.offsetWidth > el.offsetWidth;
  237. }
  238. // if (flag) {
  239. let text = e.target.getAttribute('data-txt') || el.innerText,
  240. top = e.clientY+10,
  241. left = e.clientX+10;
  242. $div = document.createElement('div');
  243. $div.setAttribute('class', 'text-tips');
  244. $div.setAttribute('style', 'top:' + top + 'px;left:' + left + 'px');
  245. $div.innerHTML = text;
  246. $div.style.color=curStyle.color;
  247. $div.style.borderColor=curStyle.color
  248. document.body.appendChild($div);
  249. // }
  250. // 移除刚刚创建的记录文字的容器
  251. document.body.removeChild(textSpan);
  252. })
  253. el.addEventListener('mouseout', e => {
  254. if($div) {
  255. try {
  256. document.body.removeChild($div);
  257. } catch(e) {
  258. }
  259. }
  260. })
  261. }
  262. })
  263. Vue.directive('left-txt-tip',{
  264. inserted(el, binding) {
  265. let $div;
  266. el.addEventListener('mouseover', e => {
  267. const curStyle = window.getComputedStyle(el, ''); // 获取当前元素的style
  268. const textSpan = document.createElement('span'); // 创建一个容器来记录文字的width
  269. // 设置新容器的字体样式,确保与当前需要隐藏的样式相同
  270. textSpan.style.fontSize = curStyle.fontSize;
  271. textSpan.style.fontWeight = curStyle.fontWeight;
  272. textSpan.style.fontFamily = curStyle.fontFamily;
  273. textSpan.style.color = curStyle.color;
  274. // 将容器插入body,如果不插入,offsetWidth为0
  275. document.body.appendChild(textSpan);
  276. // 设置新容器的文字
  277. textSpan.innerHTML = el.innerText;
  278. let flag = textSpan.offsetWidth >= el.offsetWidth;
  279. if(binding.modifiers.same) {
  280. flag = textSpan.offsetWidth > el.offsetWidth;
  281. }
  282. let text = e.target.getAttribute('data-txt') || el.innerText,
  283. top = e.clientY+10,
  284. left = e.clientX-40;
  285. $div = document.createElement('div');
  286. $div.setAttribute('class', 'text-tips');
  287. $div.setAttribute('style', 'top:' + top + 'px;left:' + left + 'px');
  288. $div.innerHTML = text;
  289. $div.style.color=curStyle.color;
  290. $div.style.borderColor=curStyle.color
  291. document.body.appendChild($div);
  292. document.body.removeChild(textSpan);
  293. })
  294. el.addEventListener('mouseout', e => {
  295. if($div) {
  296. try {
  297. document.body.removeChild($div);
  298. } catch(e) {
  299. }
  300. }
  301. })
  302. el.addEventListener('click', e => {
  303. if($div) {
  304. try {
  305. document.body.removeChild($div);
  306. } catch(e) {
  307. }
  308. }
  309. })
  310. }
  311. })
  312. Vue.directive('bottom-txt-tip',{
  313. inserted(el, binding) {
  314. let $div;
  315. el.addEventListener('mouseover', e => {
  316. const curStyle = window.getComputedStyle(el, ''); // 获取当前元素的style
  317. const textSpan = document.createElement('span'); // 创建一个容器来记录文字的width
  318. // 设置新容器的字体样式,确保与当前需要隐藏的样式相同
  319. textSpan.style.fontSize = curStyle.fontSize;
  320. textSpan.style.fontWeight = curStyle.fontWeight;
  321. textSpan.style.fontFamily = curStyle.fontFamily;
  322. textSpan.style.color = curStyle.color;
  323. // 将容器插入body,如果不插入,offsetWidth为0
  324. document.body.appendChild(textSpan);
  325. // 设置新容器的文字
  326. textSpan.innerHTML = el.innerText;
  327. let flag = textSpan.offsetWidth >= el.offsetWidth;
  328. if(binding.modifiers.same) {
  329. flag = textSpan.offsetWidth > el.offsetWidth;
  330. }
  331. let text = e.target.getAttribute('data-txt') || el.innerText,
  332. top = e.clientY+20,
  333. left = e.clientX-40;
  334. $div = document.createElement('div');
  335. $div.setAttribute('class', 'text-gray-tips');
  336. $div.setAttribute('style', 'top:' + top + 'px;left:' + left + 'px');
  337. $div.innerHTML = text;
  338. $div.style.color=curStyle.color;
  339. document.body.appendChild($div);
  340. document.body.removeChild(textSpan);
  341. })
  342. el.addEventListener('mouseout', e => {
  343. if($div) {
  344. try {
  345. document.body.removeChild($div);
  346. } catch(e) {
  347. }
  348. }
  349. })
  350. el.addEventListener('click', e => {
  351. if($div) {
  352. try {
  353. document.body.removeChild($div);
  354. } catch(e) {
  355. }
  356. }
  357. })
  358. }
  359. })
  360. }
  361. }