ligerSpinner.js 12 KB

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