yvanui.radiobutton.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /**
  2. * YvanUI
  3. *
  4. * Copyright (c) 2018 www.yvanui.com. All rights reserved.
  5. * @author luoyifan@qq.com
  6. * @time 2018-11-27 11:16:00
  7. */
  8. (function ($) {
  9. var idx = 1;
  10. function createBox(target) {
  11. //_2
  12. var $dom = $(
  13. '<div class="yvan-radio">\n' +
  14. '<input type="radio" class="radiobutton-value" style="display: none;">\n' +
  15. '<i class="fa fa-circle-o yvan-anim yvan-anim-scaleSpring"></i>\n' +
  16. '<div></div>\n' +
  17. '</div>'
  18. ).insertAfter(target);
  19. var t = $(target);
  20. t.addClass("radiobutton-f").hide();
  21. var name = t.attr("name");
  22. if (name) {
  23. //安排新的 input 框,取代他的名字
  24. t.removeAttr("name").attr("radiobuttonName", name);
  25. $dom.find(".radiobutton-value").attr("name", name);
  26. }
  27. return $dom;
  28. }
  29. function init(target) {
  30. //_6
  31. var state = $.data(target, "radiobutton");
  32. var opts = state.options;
  33. var $dom = state.radiobutton;
  34. var id = "_yvan_radiobutton_" + (++idx);
  35. $dom.find(".radiobutton-value").attr("id", id);
  36. if (opts.label) {
  37. $dom.find('div').html(opts.label);
  38. } else {
  39. $dom.find('div').html('');
  40. }
  41. $(target).radiobutton("setValue", opts.value);
  42. setValue(target, opts.checked);
  43. setDisable(target, opts.disabled);
  44. }
  45. function bindEvent(target) {
  46. //_e
  47. var state = $.data(target, "radiobutton");
  48. var opts = state.options;
  49. var $dom = state.radiobutton;
  50. $dom.unbind(".radiobutton").bind("click.radiobutton", function () {
  51. if (!opts.disabled) {
  52. setValue(target, true);
  53. }
  54. });
  55. }
  56. function setValue(target, value) {
  57. if (value) {
  58. var f = $(target).closest('form');
  59. var name = $(target).attr('radiobuttonName');
  60. f.find(".radiobutton-f[radiobuttonName=\"" + name + "\"]").each(function () {
  61. if (this !== target) {
  62. setV(this, false);
  63. }
  64. });
  65. setV(target, true);
  66. } else {
  67. setV(target, false);
  68. }
  69. function setV(b, value) {
  70. //_c
  71. var state = $.data(b, "radiobutton");
  72. var opts = state.options;
  73. var $dom = state.radiobutton;
  74. $dom.find(".radiobutton-value")._propAttr("checked", value);
  75. if (value) {
  76. $dom.addClass('yvan-radioed');
  77. $dom.find('i').remove();
  78. $('<i class="fa fa-dot-circle-o yvan-anim yvan-anim-scaleSpring"></i>')
  79. .insertAfter($dom.find(".radiobutton-value")[0]);
  80. } else {
  81. $dom.removeClass('yvan-radioed');
  82. $dom.find('i').remove();
  83. $('<i class="fa fa-circle-o"></i>')
  84. .insertAfter($dom.find(".radiobutton-value")[0]);
  85. }
  86. if (opts.checked !== value) {
  87. opts.checked = value;
  88. opts.onChange.call(b, value);
  89. }
  90. }
  91. }
  92. function setDisable(target, value) {
  93. //_d
  94. var state = $.data(target, "radiobutton");
  95. var opts = state.options;
  96. var $dom = state.radiobutton;
  97. var rv = $dom.find(".radiobutton-value");
  98. opts.disabled = value;
  99. if (value) {
  100. $(target).add(rv)._propAttr("disabled", true);
  101. $dom.addClass('yvan-radio-disabled').addClass('yvan-disabled');
  102. } else {
  103. $(target).add(rv)._propAttr("disabled", false);
  104. $dom.removeClass('yvan-radio-disabled').removeClass('yvan-disabled');
  105. }
  106. }
  107. $.fn.radiobutton = function (options, param) {
  108. if (typeof options == 'string') {
  109. return $.fn.radiobutton.methods[options](this, param);
  110. }
  111. options = options || {};
  112. return this.each(function () {
  113. var state = $.data(this, 'radiobutton');
  114. if (state) {
  115. $.extend(state.options, options);
  116. } else {
  117. state = $.data(this, 'radiobutton', {
  118. options: $.extend({},
  119. $.fn.radiobutton.defaults,
  120. $.fn.radiobutton.parseOptions(this), options),
  121. radiobutton: createBox(this)
  122. });
  123. }
  124. state.options.originalChecked = state.options.checked;
  125. init(this); //_6
  126. bindEvent(this); //_e
  127. //_13
  128. });
  129. };
  130. $.fn.radiobutton.methods = {
  131. options: function (jq) {
  132. var opts = jq.data("radiobutton");
  133. return $.extend(opts.options, { value: opts.radiobutton.find(".radiobutton-value").val() });
  134. }, radiobutton: function (jq, value) {
  135. var state = $.data(jq[0], "radiobutton");
  136. return state.radiobutton;
  137. }, setValue: function (jq, value) {
  138. return jq.each(function () {
  139. $(this).val(value);
  140. $.data(this, "radiobutton").radiobutton.find(".radiobutton-value").val(value);
  141. });
  142. }, isChecked: function (jq, value) {
  143. return $.data(jq[0], "radiobutton").radiobutton.find(".radiobutton-value").is(':checked');
  144. }, enable: function (jq) {
  145. return jq.each(function () {
  146. setDisable(this, false);
  147. });
  148. }, disable: function (jq) {
  149. return jq.each(function () {
  150. setDisable(this, true);
  151. });
  152. }, check: function (jq) {
  153. return jq.each(function () {
  154. setValue(this, true);
  155. });
  156. }, uncheck: function (jq) {
  157. return jq.each(function () {
  158. setValue(this, false);
  159. });
  160. }, clear: function (jq) {
  161. return jq.each(function () {
  162. setValue(this, false);
  163. });
  164. }, reset: function (jq) {
  165. return jq.each(function () {
  166. var _28 = $(this).radiobutton("options");
  167. setValue(this, _28.originalChecked);
  168. });
  169. }
  170. };
  171. $.fn.radiobutton.parseOptions = function (html) {
  172. var t = $(html);
  173. return $.extend({},
  174. $.parser.parseOptions(html, ["label", { labelWidth: "number" }]),
  175. {
  176. value: (t.val() || undefined),
  177. checked: (t.attr("checked") ? true : undefined),
  178. disabled: (t.attr("disabled") ? true : undefined)
  179. });
  180. };
  181. $.fn.radiobutton.defaults = {
  182. value: null,
  183. disabled: false,
  184. checked: false,
  185. label: null,
  186. onChange: function (value) {
  187. }
  188. };
  189. })(jQuery);