Advertisement
dokin

Untitled

Sep 10th, 2013
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.09 KB | None | 0 0
  1. $(function init(){
  2. if($('select').size()) var select=$('select').select();
  3. });
  4. //version 1.0.2
  5. $.fn.select=function(o){
  6. var callMethod=$.fn.select.method,
  7. itemClick=jQuery.Event("itemClick"),
  8. selectReady=jQuery.Event("selectReady"),
  9. enabled=jQuery.Event("enabled"),
  10. disabled=jQuery.Event("disabled"),
  11. destroyed=jQuery.Event("destroyed");
  12. //destroyed=jQuery.Event("destroy");
  13. //console.log(o);
  14. //alert(o);
  15.  
  16. if(typeof o=="string"){
  17. var select=$(this);
  18. /*if(o!='destroy')*/ callMethod[o](select);
  19. return select;
  20. }
  21.  
  22.  
  23. if(!("method" in $.fn.select)){
  24. //alert(o);
  25. $.fn.select.method={
  26. "destroy":function(select){
  27. if(select.data('customized')){
  28. select.off('change.select');
  29. $(document).off('click.select');
  30. select.each(function(){
  31. $(this).data('customSelect').off('click.select').remove();
  32. });
  33. select.removeData();
  34. select.trigger('destroyed');
  35. }else{
  36. throw new Error('объект не проинициализирован');
  37. }
  38. },
  39. "enable":function(select){
  40. if(select.data('disable')){
  41. select.attr('disabled',false);
  42. select.data('customSelect').first().on('click.select',select.data('openerHandler')).removeClass('disabled');
  43. select.trigger('enabled');
  44. }
  45. },
  46. "disable":function(select){
  47. if(!select.data('disable')){
  48. select.data('disable',true);
  49. select.attr('disabled',true);
  50. select.data('openerHandler',$._data(select.data('customSelect').first().get(0),"events").click[0].handler);
  51. select.data('customSelect').first().off('click').addClass('disabled');
  52. select.trigger('disabled');
  53. }
  54. }
  55. };
  56. callMethod=$.fn.select.method;
  57. }
  58.  
  59.  
  60. o=$.extend({
  61. "list":"ul",
  62. "item":"li",
  63. "itemHTML":"li",
  64. "openerClass":"ui-selectmenu",
  65. "icoClass":"ui-selectmenu-icon",
  66. "selectedClass":"ui-selectmenu-status",
  67. "activeItemClass":"active",
  68. "dropDownClass":"ui-selectmenu-menu",
  69. "style":"dropdown", //popup,dropdown
  70. "transferClass":true,
  71. "dropdownHasBorder":true,
  72. "hasIcons":false,
  73. "resizable":true,
  74. "triggerEvents":false,
  75. "autocomplete":false
  76. },o);
  77. var select=[],
  78. body=$('body'),
  79. openerHTML=$('<a class="'+o.openerClass+'"><span class="'+o.icoClass+'"></span><span class="'+o.selectedClass+'"></span></a>'),
  80. dropdownHTML=$('<div class='+o.dropDownClass+'>'+
  81. '<div class="select-top">'+
  82. '<div class="select-l"></div>'+
  83. '<div class="select-r"></div>'+
  84. '</div>'+
  85. '<div class="select-c">'+
  86. '<div class="c appendHere">'+
  87. '</div>'+
  88. '</div>'+
  89. '<div class="select-bottom">'+
  90. '<div class="select-l"></div>'+
  91. '<div class="select-r"></div>'+
  92. '</div>'+
  93. '</div>');
  94. $(this).each(function(i){
  95. if(!$(this).data('customized')){
  96. select.push(this);
  97. }
  98. });
  99. if(select.length){
  100. $(select).each(function(){
  101. var opener = openerHTML.clone(),
  102. nativeSelect = $(this),
  103. title=nativeSelect.find("option[title]").text(),
  104. options=nativeSelect.find("option[title]").attr('disabled',true).end().find('option'),
  105. optionSize = options.size() - 1,
  106. dropdown = dropdownHTML.clone(),
  107. itemTree=o.itemHTML.split(' '),
  108. hasChild=itemTree.length>=2,
  109. list = "<" + o.list + ">";
  110. nativeSelect.find('option').each(function(i, data){
  111. if($(this).attr('title')){
  112. list += "<" + o.item + " class='title' style='display:none;'>" + data.childNodes[0].nodeValue + "</" + o.item + ">";
  113. }else{
  114. if(!hasChild){
  115. list += "<" + o.item + ">" + data.childNodes[0].nodeValue + "</" + o.item + ">";
  116. }else{
  117. var buffer='';
  118. for(var k=itemTree.length-1;k!=0;k--){
  119. if(!buffer){
  120. buffer+="<" + itemTree[k] + ">"+ data.childNodes[0].nodeValue +"</" + itemTree[k] + ">";
  121. }else if(k!=0 && itemTree.length>2){
  122. buffer="<" + itemTree[k] + ">"+buffer+"</" + itemTree[k] + ">";
  123. }
  124. }
  125. buffer="<" + itemTree[0] + ">"+buffer+"</" + itemTree[0] + ">";
  126. list+=buffer;
  127. }
  128. }
  129. if (i == optionSize) {
  130. list += "</" + o.list + ">";
  131. }
  132. });
  133. list = $(list);
  134. dropdown = dropdown.find('.appendHere').removeClass('appendHere').append(list).end();
  135. opener.insertAfter(nativeSelect);
  136. opener.find('.'+o.selectedClass).text(nativeSelect.find('option:selected').text());
  137. body.append(dropdown);
  138. (o.dropdownHasBorder) ? dropdown.width(opener.width()) : dropdown.width(opener.outerWidth());
  139. if(o.transferClass){
  140. opener.addClass(opener.attr('class') + " " + nativeSelect.attr('class'));
  141. dropdown.addClass(dropdown.attr('class') + " " + nativeSelect.attr('class'));
  142. }
  143. $(this).data('customSelect', opener.add(dropdown));
  144. $(this).data('customized', true);
  145. var listItems = list.find(">" + o.item),
  146. dropdownWidth = dropdown.outerWidth(),
  147. dropdownHeight = dropdown.outerHeight();
  148. selectedByHover='',
  149. selected='';
  150. if(!o.resizable){
  151. opener.width(nativeSelect.width());
  152. (o.dropdownHasBorder) ? dropdownWidth=dropdown.width(opener.width()) : dropdownWidth=dropdown.width(opener.outerWidth());
  153. }else{
  154. $(window).on('resize.opener',function(){
  155. (o.dropdownHasBorder) ? dropdownWidth=dropdown.width(opener.width()) : dropdownWidth=dropdown.width(opener.outerWidth());
  156. }).trigger('resize.opener');
  157. }
  158. if(title){
  159. opener.find('.'+o.selectedClass).text(title);
  160. nativeSelect.trigger('change.select',[options.filter(':selected').index()]);
  161. }
  162. //autocomplete section
  163. if(o.autocomplete){
  164. if(title) opener.find('.'+o.selectedClass).get(0).defaultValue=title;
  165. opener.find('.'+o.selectedClass).html('<input type="text" />');
  166. opener.find('.'+o.selectedClass).find('input').keyup(function(e){
  167. var searchVal=$.trim($(this).val()),
  168. matched=[];
  169. dropdown.show();
  170. listItems.not('.title').each(function(){
  171. var text=$(this).text();
  172. if((new RegExp(searchVal,'ig')).test(text)){
  173. matched.push(this);
  174. }
  175. });
  176. matched=$(matched);
  177. matched.show().first().addClass(o.activeItemClass).siblings().removeClass(o.activeItemClass);
  178. listItems.not(matched).hide();
  179. $(this).off('keydown').keydown(function(e){
  180. if(e.keyCode==13){
  181. matched.first().trigger('click');
  182. $(this).blur();
  183. }
  184. });
  185. if(!listItems.filter(':visible').size()){
  186. dropdown.hide();
  187. }
  188. });
  189. }
  190. nativeSelect.on("change.select", function(e, selectedIndex,dontHide){
  191. if (!selectedIndex && selectedIndex !== 0) selectedIndex = this.selectedIndex;
  192. listItems.removeClass(o.activeItemClass).eq(selectedIndex).addClass(o.activeItemClass);
  193. selected=options.removeAttr('selected').eq(selectedIndex);
  194. selected.get(0).selected=true;
  195. selectedByHover=selected;
  196. if(o.autocomplete) {
  197. opener.find('input').val(selected.text());
  198. }else{
  199. opener.find('.'+o.selectedClass).text(selected.text());
  200. }
  201. if(!dontHide){
  202. dropdown.hide();
  203. $(document).off('keydown.select');
  204. }
  205. });
  206. if(o.hasIcons){
  207. options.each(function(i){
  208. listItems.eq(i).prepend('<span class="'+this.className+'"></span>');
  209. });
  210. nativeSelect.on("change.select",function(e, selectedIndex,dontHide){
  211. opener.find('.'+o.selectedClass).prepend('<span class="'+selected.attr('class')+'"></span>');
  212. });
  213. }
  214. nativeSelect.hide();
  215. listItems.click(function(e){
  216. nativeSelect.trigger("change.select", [$(this).index()]);
  217. dropdown.hide();
  218. });
  219. listItems.hover(function(){
  220. selectedByHover=$(this);
  221. },function(){
  222. selectedByHover="";
  223. });
  224. opener.click(function(e){
  225. if(dropdown.is(':hidden')){
  226. dropdown.show();
  227. alignDropDown();
  228. $(document).off('keydown.select');
  229. $(document).on('keydown.select',function(e){
  230. if(e.keyCode==13 && selectedByHover){
  231. nativeSelect.trigger("change.select",[selectedByHover.index()]);
  232. e.preventDefault();
  233. }
  234. if(e.keyCode==38 && selected.prev().size() && !selected.prev().is(':disabled')){
  235. nativeSelect.trigger("change.select",[selected.prev().index(),true]);
  236. if(o.style=="popup"){
  237. alignDropDown();
  238. }
  239. e.preventDefault();
  240. }else if(e.keyCode==40 && selected.next().size() && !selected.next().is(':disabled')){
  241. nativeSelect.trigger("change.select",[selected.next().index(),true]);
  242. alignDropDown();
  243. e.preventDefault();
  244. }
  245. });
  246. }else{
  247. dropdown.hide();
  248. }
  249. });
  250. $(window).on('resize.select', function(){
  251. if (dropdown.is(':visible')){
  252. alignDropDown();
  253. }
  254. });
  255. $(document).on('mousedown.select', function(e){
  256. if (!$(e.target).closest(dropdown).size() && !$(e.target).closest(opener).size()) {
  257. dropdown.hide();
  258. $(document).off('keydown.select');
  259. }
  260. });
  261. //event section
  262. if(o.triggerEvents){
  263. listItems.click(function(e){
  264. nativeSelect.trigger(itemClick, [$(this).text()]);
  265. });
  266. nativeSelect.trigger(selectReady,[dropdown]);
  267. }
  268. function alignDropDown(){
  269. if(o.style=="dropdown"){
  270. var top = opener.offset().top + opener.outerHeight(),
  271. left = opener.offset().left;
  272. /*
  273. if(top + dropdownHeight > $(window).height() && top - dropdownHeight - opener.outerHeight() > 0){
  274. dropdown.css({
  275. 'top': top - dropdownHeight - opener.outerHeight(),
  276. 'left': left
  277. });
  278. }else{
  279. */
  280. dropdown.css({
  281. 'top': top,
  282. 'left': left
  283. });
  284. /*
  285. }
  286. */
  287. }else{
  288. var top = opener.offset().top-listItems.filter("."+o.activeItemClass).position().top,
  289. left = opener.offset().left;
  290. dropdown.css({
  291. 'top': top,
  292. 'left': left
  293. });
  294. }
  295. }
  296. if(nativeSelect.is(':disabled')) nativeSelect.select('disable');
  297. });
  298. }else{
  299. throw Error('селект/ы уже проинициализирован/ы');
  300. }
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement