UU跑腿标准版

ligerSpinner.js 13KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. /**
  2. * jQuery ligerUI 1.2.4
  3. *
  4. * http://ligerui.com
  5. *
  6. * Author daomi 2014 [ gd_star@163.com ]
  7. *
  8. */
  9. (function ($)
  10. {
  11. $.fn.ligerSpinner = function ()
  12. {
  13. return $.ligerui.run.call(this, "ligerSpinner", arguments);
  14. };
  15. $.fn.ligerGetSpinnerManager = function ()
  16. {
  17. return $.ligerui.run.call(this, "ligerGetSpinnerManager", arguments);
  18. };
  19. $.ligerDefaults.Spinner = {
  20. type: 'float', //类型 float:浮点数 int:整数 time:时间
  21. isNegative: true, //是否负数
  22. decimalplace: 2, //小数位 type=float时起作用
  23. step: 0.1, //每次增加的值
  24. interval: 50, //间隔,毫秒
  25. onChangeValue: false, //改变值事件
  26. minValue: null, //最小值
  27. maxValue: null, //最大值
  28. disabled: false,
  29. readonly: false //是否只读
  30. };
  31. $.ligerMethos.Spinner = {};
  32. $.ligerui.controls.Spinner = function (element, options)
  33. {
  34. $.ligerui.controls.Spinner.base.constructor.call(this, element, options);
  35. };
  36. $.ligerui.controls.Spinner.ligerExtend($.ligerui.controls.Input, {
  37. __getType: function ()
  38. {
  39. return 'Spinner';
  40. },
  41. __idPrev: function ()
  42. {
  43. return 'Spinner';
  44. },
  45. _extendMethods: function ()
  46. {
  47. return $.ligerMethos.Spinner;
  48. },
  49. _init: function ()
  50. {
  51. $.ligerui.controls.Spinner.base._init.call(this);
  52. var p = this.options;
  53. if (p.type == 'float')
  54. {
  55. p.step = 0.1;
  56. p.interval = 50;
  57. } else if (p.type == 'int')
  58. {
  59. p.step = 1;
  60. p.interval = 100;
  61. } else if (p.type == 'time')
  62. {
  63. p.step = 1;
  64. p.interval = 100;
  65. } else
  66. {
  67. p.type = "int";
  68. p.step = 1;
  69. p.interval = 100;
  70. }
  71. },
  72. _render: function ()
  73. {
  74. var g = this, p = this.options;
  75. g.interval = null;
  76. g.inputText = null;
  77. g.value = null;
  78. g.textFieldID = "";
  79. if (this.element.tagName.toLowerCase() == "input" && this.element.type && this.element.type == "text")
  80. {
  81. g.inputText = $(this.element);
  82. if (this.element.id)
  83. g.textFieldID = this.element.id;
  84. }
  85. else
  86. {
  87. g.inputText = $('<input type="text"/>');
  88. g.inputText.appendTo($(this.element));
  89. }
  90. if (g.textFieldID == "" && p.textFieldID)
  91. g.textFieldID = p.textFieldID;
  92. g.link = $('<div class="l-trigger"><div class="l-spinner-up"><div class="l-spinner-icon"></div></div><div class="l-spinner-split"></div><div class="l-spinner-down"><div class="l-spinner-icon"></div></div></div>');
  93. g.wrapper = g.inputText.wrap('<div class="l-text"></div>').parent();
  94. g.wrapper.append('<div class="l-text-l"></div><div class="l-text-r"></div>');
  95. g.wrapper.append(g.link).after(g.selectBox).after(g.valueField);
  96. g.link.up = $(".l-spinner-up", g.link);
  97. g.link.down = $(".l-spinner-down", g.link);
  98. g.inputText.addClass("l-text-field");
  99. if (p.disabled)
  100. {
  101. g.wrapper.addClass("l-text-disabled");
  102. }
  103. //初始化
  104. if (!g._isVerify(g.inputText.val()))
  105. {
  106. g.value = g._getDefaultValue();
  107. g._showValue(g.value);
  108. }
  109. //事件
  110. g.link.up.hover(function ()
  111. {
  112. if (!p.disabled)
  113. $(this).addClass("l-spinner-up-over");
  114. }, function ()
  115. {
  116. clearInterval(g.interval);
  117. $(document).unbind("selectstart.spinner");
  118. $(this).removeClass("l-spinner-up-over");
  119. }).mousedown(function ()
  120. {
  121. if (!p.disabled)
  122. {
  123. g._uping.call(g);
  124. g.interval = setInterval(function ()
  125. {
  126. g._uping.call(g);
  127. }, p.interval);
  128. $(document).bind("selectstart.spinner", function () { return false; });
  129. }
  130. }).mouseup(function ()
  131. {
  132. clearInterval(g.interval);
  133. g.inputText.trigger("change").focus();
  134. $(document).unbind("selectstart.spinner");
  135. });
  136. g.link.down.hover(function ()
  137. {
  138. if (!p.disabled)
  139. $(this).addClass("l-spinner-down-over");
  140. }, function ()
  141. {
  142. clearInterval(g.interval);
  143. $(document).unbind("selectstart.spinner");
  144. $(this).removeClass("l-spinner-down-over");
  145. }).mousedown(function ()
  146. {
  147. if (!p.disabled)
  148. {
  149. g.interval = setInterval(function ()
  150. {
  151. g._downing.call(g);
  152. }, p.interval);
  153. $(document).bind("selectstart.spinner", function () { return false; });
  154. }
  155. }).mouseup(function ()
  156. {
  157. clearInterval(g.interval);
  158. g.inputText.trigger("change").focus();
  159. $(document).unbind("selectstart.spinner");
  160. });
  161. g.inputText.change(function ()
  162. {
  163. var value = g.inputText.val();
  164. g.value = g._getVerifyValue(value);
  165. g.trigger('changeValue', [g.value]);
  166. g._showValue(g.value);
  167. }).blur(function ()
  168. {
  169. g.wrapper.removeClass("l-text-focus");
  170. }).focus(function ()
  171. {
  172. g.wrapper.addClass("l-text-focus");
  173. });
  174. g.wrapper.hover(function ()
  175. {
  176. if (!p.disabled)
  177. g.wrapper.addClass("l-text-over");
  178. }, function ()
  179. {
  180. g.wrapper.removeClass("l-text-over");
  181. });
  182. g.set(p);
  183. },
  184. _setWidth: function (value)
  185. {
  186. var g = this;
  187. if (value > 20)
  188. {
  189. g.wrapper.css({ width: value });
  190. g.inputText.css({ width: value - 20 });
  191. }
  192. },
  193. _setHeight: function (value)
  194. {
  195. var g = this;
  196. if (value > 10)
  197. {
  198. g.wrapper.height(value);
  199. g.inputText.height(value - 2);
  200. g.link.height(value - 4);
  201. }
  202. },
  203. _setDisabled: function (value)
  204. {
  205. if (value)
  206. {
  207. this.wrapper.addClass("l-text-disabled");
  208. }
  209. else
  210. {
  211. this.wrapper.removeClass("l-text-disabled");
  212. }
  213. },
  214. _showValue: function (value)
  215. {
  216. var g = this, p = this.options;
  217. if (!value || value == "NaN") value = 0;
  218. if (p.type == 'float')
  219. {
  220. value = parseFloat(value).toFixed(p.decimalplace);
  221. }
  222. this.inputText.val(value)
  223. },
  224. _setValue: function (value)
  225. {
  226. this._showValue(value);
  227. },
  228. setValue: function (value)
  229. {
  230. this._showValue(value);
  231. },
  232. getValue: function ()
  233. {
  234. return this.inputText.val();
  235. },
  236. _round: function (v, e)
  237. {
  238. var g = this, p = this.options;
  239. var t = 1;
  240. for (; e > 0; t *= 10, e--) { }
  241. for (; e < 0; t /= 10, e++) { }
  242. return Math.round(v * t) / t;
  243. },
  244. _isInt: function (str)
  245. {
  246. var g = this, p = this.options;
  247. var strP = p.isNegative ? /^-?\d+$/ : /^\d+$/;
  248. if (!strP.test(str)) return false;
  249. if (parseFloat(str) != str) return false;
  250. return true;
  251. },
  252. _isFloat: function (str)
  253. {
  254. var g = this, p = this.options;
  255. var strP = p.isNegative ? /^-?\d+(\.\d+)?$/ : /^\d+(\.\d+)?$/;
  256. if (!strP.test(str)) return false;
  257. if (parseFloat(str) != str) return false;
  258. return true;
  259. },
  260. _isTime: function (str)
  261. {
  262. var g = this, p = this.options;
  263. var a = str.match(/^(\d{1,2}):(\d{1,2})$/);
  264. if (a == null) return false;
  265. if (a[1] > 24 || a[2] > 60) return false;
  266. return true;
  267. },
  268. _isVerify: function (str)
  269. {
  270. var g = this, p = this.options;
  271. if (p.type == 'float')
  272. {
  273. if (!g._isFloat(str)) return false;
  274. var value = parseFloat(str);
  275. if (p.minValue != undefined && p.minValue > value) return false;
  276. if (p.maxValue != undefined && p.maxValue < value) return false;
  277. return true;
  278. } else if (p.type == 'int')
  279. {
  280. if (!g._isInt(str)) return false;
  281. var value = parseInt(str);
  282. if (p.minValue != undefined && p.minValue > value) return false;
  283. if (p.maxValue != undefined && p.maxValue < value) return false;
  284. return true;
  285. } else if (p.type == 'time')
  286. {
  287. return g._isTime(str);
  288. }
  289. return false;
  290. },
  291. _getVerifyValue: function (value)
  292. {
  293. var g = this, p = this.options;
  294. var newvalue = null;
  295. if (p.type == 'float')
  296. {
  297. newvalue = g._round(value, p.decimalplace);
  298. }
  299. else if (p.type == 'int')
  300. {
  301. newvalue = parseInt(value);
  302. } else if (p.type == 'time')
  303. {
  304. newvalue = value;
  305. }
  306. if (!g._isVerify(newvalue))
  307. {
  308. return g.value;
  309. } else
  310. {
  311. return newvalue;
  312. }
  313. },
  314. _isOverValue: function (value)
  315. {
  316. var g = this, p = this.options;
  317. if (p.minValue != null && p.minValue > value) return true;
  318. if (p.maxValue != null && p.maxValue < value) return true;
  319. return false;
  320. },
  321. _getDefaultValue: function ()
  322. {
  323. var g = this, p = this.options;
  324. if (p.type == 'float' || p.type == 'int') { return 0; }
  325. else if (p.type == 'time') { return "00:00"; }
  326. },
  327. _addValue: function (num)
  328. {
  329. var g = this, p = this.options;
  330. var value = g.inputText.val();
  331. value = parseFloat(value) + num;
  332. if (g._isOverValue(value)) return;
  333. g._showValue(value);
  334. g.inputText.trigger("change");
  335. },
  336. _addTime: function (minute)
  337. {
  338. var g = this, p = this.options;
  339. var value = g.inputText.val();
  340. var a = value.match(/^(\d{1,2}):(\d{1,2})$/);
  341. newminute = parseInt(a[2]) + minute;
  342. if (newminute < 10) newminute = "0" + newminute;
  343. value = a[1] + ":" + newminute;
  344. if (g._isOverValue(value)) return;
  345. g._showValue(value);
  346. g.inputText.trigger("change");
  347. },
  348. _uping: function ()
  349. {
  350. var g = this, p = this.options;
  351. if (p.type == 'float' || p.type == 'int')
  352. {
  353. g._addValue(p.step);
  354. } else if (p.type == 'time')
  355. {
  356. g._addTime(p.step);
  357. }
  358. },
  359. _downing: function ()
  360. {
  361. var g = this, p = this.options;
  362. if (p.type == 'float' || p.type == 'int')
  363. {
  364. g._addValue(-1 * p.step);
  365. } else if (p.type == 'time')
  366. {
  367. g._addTime(-1 * p.step);
  368. }
  369. },
  370. _isDateTime: function (dateStr)
  371. {
  372. var g = this, p = this.options;
  373. var r = dateStr.match(/^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2})$/);
  374. if (r == null) return false;
  375. var d = new Date(r[1], r[3] - 1, r[4]);
  376. if (d == "NaN") return false;
  377. return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4]);
  378. },
  379. _isLongDateTime: function (dateStr)
  380. {
  381. var g = this, p = this.options;
  382. var reg = /^(\d{1,4})(-|\/)(\d{1,2})\2(\d{1,2}) (\d{1,2}):(\d{1,2})$/;
  383. var r = dateStr.match(reg);
  384. if (r == null) return false;
  385. var d = new Date(r[1], r[3] - 1, r[4], r[5], r[6]);
  386. if (d == "NaN") return false;
  387. return (d.getFullYear() == r[1] && (d.getMonth() + 1) == r[3] && d.getDate() == r[4] && d.getHours() == r[5] && d.getMinutes() == r[6]);
  388. }
  389. });
  390. })(jQuery);