jquery.inputbox.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /**
  2. * jQuery InputBox - A Custom Select/Checkbox/Radio Plugin
  3. * ------------------------------------------------------------------
  4. *
  5. * jQuery InputBox is a plugin for custom Select/Checkbox/Radio Plugin.
  6. *
  7. * @version 1.1.0
  8. * @since 2013.09.27
  9. * @author charles.yu
  10. *
  11. * ------------------------------------------------------------------
  12. *
  13. * eg:
  14. * 1、Select
  15. * //class: selected 表示默认选中,如有多个selected默认选中第一个
  16. * <div name="city" type="selectbox">
  17. * <div class="opts">
  18. * <a href="javascript:;" val="050101">苏州</a>
  19. * <a href="javascript:;" val="050101" class="selected">无锡</a>
  20. * <a href="javascript:;" val="050101" class="selected">常州</a>
  21. * </div>
  22. * </div>
  23. * $('div[name="city"]').inputbox();
  24. *
  25. * 2、Checkbox
  26. * //class: all 表示是全选|全不选按钮,如果是全选按钮,则其"name"为控制对象的"name+All"; checked 表示默认选中
  27. * <div class="cbt all" name="checkAll" type="checkbox"></div>
  28. * <div class="cbt checked" name="check" type="checkbox" val="1" ></div>
  29. * <div class="cbt checked" name="check" type="checkbox" val="2" ></div>
  30. * <div class="cbt" name="check" type="checkbox" val="3"></div>
  31. * $('.cbt').inputbox();
  32. *
  33. * 3、Radio
  34. * //class: checked 表示默认选中,如有多个selected默认选中最后一个
  35. * <div name="rbt checked" type="radiobox" val="cn"></div><span>中文</span>
  36. * <div name="rbt" type="radiobox" val="en"></div><span>英文</span>
  37. * $('div[name="rbt"]').inputbox();
  38. */
  39. ;(function($){
  40. var opts = {};
  41. var selectbox = {
  42. //初始化自定义selectbox
  43. init: function(o) {
  44. var $o = $(o),
  45. _name = $o.attr('name'),
  46. _selectValue = $o.find('.opts > a.selected').attr('val')? $o.find('.opts > a.selected').attr('val'):$o.find('.opts > a:first').attr('val'),
  47. _selectHtml = $o.find('.opts > a.selected').html()? $o.find('.opts > a.selected').html():$o.find('.opts > a:first').html();
  48. $o.addClass('sb');
  49. $o.append($('<div class="sb_icon arrow" />')).append($('<input type="hidden" name="' + _name + '" value="' + _selectValue + '">'));
  50. $('<div class="selected">' + _selectHtml + '</div>').insertBefore($o.children(':first'));
  51. $o.children('.opts').show();
  52. var optsWidth = $o.children('.opts').width();
  53. if(optsWidth == 0){
  54. var optsChildWidth = [];
  55. var tempWidth = 0;
  56. $o.children('.opts').children('a').each(function(){
  57. optsChildWidth.push($(this).width());
  58. });
  59. for(var i=0; i<optsChildWidth.length ; i++){
  60. if(optsChildWidth[i] > tempWidth)
  61. tempWidth = optsChildWidth[i]
  62. }
  63. optsWidth = tempWidth + 10;
  64. }
  65. $o.children('.opts').hide();
  66. $o.children('.opts').css('width', (optsWidth + 15));
  67. var _width = (opts.width != 'auto')? opts.width : $o.children('.opts').width();
  68. //var _width = (opts.width != 'auto')? opts.width : ($o.width() > 0 ? $o.width() : $o.children('.opts').width());
  69. $o.css({'width': _width, 'height': opts.height}).find('div.selected').css({'height': opts.height, 'line-height': opts.height +'px'});
  70. $o.find('.sb_icon').css({'top': ($o.height() - $o.find('.sb_icon').height())/2});
  71. $o.off('click').on('click', selectbox.toggle);
  72. $o.off('click', '.opts > a').on('click', '.opts > a', selectbox.select);
  73. $o.find('.opts').off('mouseenter mouseleave').on('mouseenter', selectbox.mouseenter).on('mouseleave', selectbox.mouseleave);
  74. $(document).off('click', selectbox.hide).on('click', selectbox.hide);
  75. },
  76. toggle: function(e) {
  77. e.stopPropagation();
  78. var $o = $(this);
  79. var $opts = $o.children('.opts');
  80. $o.find('a.selected').removeClass('none');
  81. selectbox.hide(null, $('.sb').not($o));
  82. $o.toggleClass('sb_active');
  83. $opts.css({
  84. 'width': Math.max($opts.width(), $o.width()),
  85. 'top': $o.height(),
  86. 'left': - parseInt($o.css('border-left-width'))
  87. }).toggle($o.hasClass('sb_active'));
  88. },
  89. hide: function(e, objs) {
  90. var $o = objs ? objs : $('.sb');
  91. $o.removeClass('sb_active').children('.opts').hide().find('a.selected').removeClass('none');
  92. },
  93. select: function(e) {
  94. e.stopPropagation();
  95. var $o = $(this).parents('.sb:first');
  96. $o.trigger('click');
  97. $o.find('a.selected').removeClass('selected');
  98. $(this).addClass('selected');
  99. $o.find('div.selected').html($(this).html());
  100. $o.find('input').val($(this).attr('val'));
  101. },
  102. mouseenter: function(e){
  103. e.stopPropagation();
  104. var $o = $(this);
  105. $o.find('a.selected').addClass('none');
  106. },
  107. mouseleave: function(e){
  108. e.stopPropagation();
  109. var $o = $(this);
  110. $o.find('a.selected').removeClass('none');
  111. }
  112. };
  113. var checkbox = {
  114. //初始化checkbox
  115. init: function(o) {
  116. var $o = $(o),
  117. _name = $o.attr('name'),
  118. _value = $o.attr('val')? $o.attr('val'): '',
  119. _isChecked = $o.hasClass('checked')? true : false;
  120. $o.addClass('cb');
  121. $o.append($('<input type="hidden" name="' + _name + '" value="' + _value + '" />'));
  122. $o.click(checkbox.toggle);
  123. if($o.hasClass('all')) $o.click(checkbox.allOrNone);
  124. if(_isChecked){
  125. $o.removeClass('checked');
  126. $o.click();
  127. }
  128. },
  129. toggle: function(e) {
  130. $(this).toggleClass('cb_active').children().attr('checked', ($(this).hasClass('cb_active') ? true : false));
  131. },
  132. allOrNone: function(e) {
  133. var cbAllName = $(this).attr('name');
  134. if(cbAllName.length > 3){
  135. var cbOneName = cbAllName.substring(0, cbAllName.length - 3);
  136. var isChecked = $(this).hasClass('cb_active')? true : false;
  137. if(isChecked){
  138. $('.cb[name='+ cbOneName +']').not($('.cb_active[name='+ cbOneName +']')).click();
  139. }else{
  140. $('.cb_active[name='+ cbOneName +']').click();
  141. }
  142. }
  143. }
  144. };
  145. var radiobox = {
  146. //初始化radiobox
  147. init: function(o) {
  148. var $o = $(o),
  149. _name = $o.attr('name'),
  150. _value = $o.attr('val')? $o.attr('val'): '';
  151. _isChecked = $o.hasClass('checked')? true : false;
  152. $o.addClass('rb');
  153. $o.append($('<input type="hidden" name="' + _name + '" value="' + _value + '" />'));
  154. $o.click(radiobox.toggle);
  155. if(_isChecked){
  156. $o.removeClass('checked');
  157. $o.click();
  158. }
  159. },
  160. toggle: function() {
  161. var $o = $(this),
  162. _name = $o.attr('name');
  163. $('[name="'+ _name +'"]').removeClass('rb_active').children().attr('checked', false);
  164. $o.addClass('rb_active').children().attr('checked', true);
  165. }
  166. },
  167. _init = function(o){
  168. var type = $(o).attr('type');
  169. if(type == 'selectbox'){
  170. selectbox.init(o);
  171. }else if(type == 'checkbox'){
  172. checkbox.init(o);
  173. }else if(type == 'radiobox'){
  174. radiobox.init(o);
  175. }
  176. };
  177. $.fn.inputbox = function(options){
  178. opts = $.extend({}, $.fn.inputbox.defaults, options);
  179. return this.each(function(){
  180. _init(this);
  181. });
  182. };
  183. $.fn.inputbox.defaults = {
  184. //type: 'selectbox',//selectbox|checkbox|radiobox
  185. width : 'auto',
  186. height : 24
  187. };
  188. })(jQuery);