JQuery SELECT单选模拟jQuery.select.js

  基于jQuery JavaScript Library v1.3.2 的单选模拟

  (本文件是跟据 zhangjingwei 的Jquery Select(单选) 模拟插件 V1.3.4 修改而来的)

  a. 修改的主要原因是,原来的zhangjingwei的模拟在显示方式上的问题。在跟文字交替出现时会出现错位。现将模拟DIV的display修改为inline方式。更自然的嵌入到文本行中。

  b.在加载文件后自动转化样式名为'commonselect' 的select。简化调用

  c.对select的onchange()事件的响应。以及宽度获取的小调整

  jquery.select.js

  

复制代码 代码如下:

  /*

  * jQuery.select.js

  */

  jQuery.fn.sSelect = function(){

  var selectId = $(this).attr('id');

  var selectZindex = $(this).css('z-index');

  var selectIndex = $('#'+selectId+' > select > option').index($('#'+selectId+' > select > option:selected')[0]);

  $('#'+selectId).append('<div class="dropselectbox"><h4></h4><span class="FixSelectBrowserSpan"></span><ul style="display:none" style="display:none"><li></li></ul></div>');

  $('#'+selectId+' > div > h4').empty().append($('#'+selectId+' > select > option:selected').text());

  $('.dropselectbox').css("display", 'block');

  //取select的宽度 优先级 select样式中的宽度 - select自动的宽度 - 默认为60

  var selectcssWidth = $('#'+selectId+'> select').css('width');

  selectcssWidth = typeof(selectcssWidth) =='undefined' ? 0 : parseInt(selectcssWidth.replace('px','')) +5 ;

  var selectWidth = selectcssWidth ? selectcssWidth : ( $('#'+selectId+'> select').width() > 0 ? $('#'+selectId+'> select').width() + 5 : 60);

  $('#'+selectId).css("margin-right",selectWidth);    //修改偏移量

  $('#'+selectId+' > div > h4').css("width", selectWidth); //将原select的宽度赋值给生成的select(并不是h4的总宽度)

  $('#'+selectId+' > div > ul').css("width",selectWidth); //将h4的总宽度赋值给Ul

  $('#'+selectId+' > select').hide();

  $('#'+selectId+' > div').hover(function(){

  $('#'+selectId+' > div > h4').addClass("over");

  $('#'+selectId+' > div > span').addClass("over");

  },function(){

  $('#'+selectId+' > div > h4').removeClass("over");

  $('#'+selectId+' > div > span').removeClass("over");

  });

  $('#'+selectId)

  .bind("focus",function(){

  __clearSelectMenu();

  $('#'+selectId+' > div > h4').addClass("over");

  $('#'+selectId+' > div > span').addClass("over");

  })

  .bind("click",function(e){

  //$('#value2').append('点击:'+selectIndex+'  <br>');

  if($('#'+selectId+' > div > ul').css("display") == 'block'){

  __clearSelectMenu(selectId);

  return false;

  }else{

  if ($.browser.opera){__clearSelectMenu();}

  $('#'+selectId+' > div > h4').addClass("current");

  $('#'+selectId+' > div > span').addClass("over").addClass("current");

  $('#'+selectId+' > div > ul').show();

  var selectZindex = $(this).css('z-index');

  if ($.browser.msie || $.browser.opera){

  $('.dropdown').removeClass('overclass');

  }

  $('#'+selectId).addClass('overclass');

  __setSelectValue(selectId);

  var windowspace = ($(window).scrollTop() + document.documentElement.clientHeight) - $(this).offset().top;

  var ulspace = $('#'+selectId+' > div > ul').outerHeight(true);

  var windowspace2 = $(this).offset().top - $(window).scrollTop() - ulspace;

  if (windowspace < ulspace && windowspace2 > 0) {

  $('#'+selectId+' > div > ul').css({top:-ulspace});

  }else{

  $('#'+selectId+' > div > ul').css({top:$('#'+selectId+' > div > h4').outerHeight(true)});

  }

  selectIndex = $('#'+selectId+' > div > ul > li').index($('.selectedli')[0]);

  $(window).scroll(function(){

  var windowspace = ($(window).scrollTop() + document.documentElement.clientHeight) - $('#'+selectId).offset().top;

  var ulspace = $('#'+selectId+' > div > ul').outerHeight(true);

  if (windowspace < ulspace) {

  $('#'+selectId+' > div > ul').css({top:-ulspace});

  }else{

  $('#'+selectId+' > div > ul').css({top:$('#'+selectId+' > div > h4').outerHeight(true)});

  }

  });

  //响应鼠标点击选择

  $('#'+selectId+' > div > ul > li').click(function(e){

  selectIndex = $('#'+selectId+' > div > ul > li').index(this);

  //$('#value2').append('鼠标点击:'+selectIndex+'  <br>');

  $('#'+selectId+'> select')[0].selectedIndex = selectIndex;

  $('#'+selectId+' > div > h4').empty().append($('#'+selectId+' > select > option:selected').text());

  __clearSelectMenu(selectId,selectZindex);

  e.stopPropagation();

  e.cancelbubble = true;

  //SELECT onchange 事件

  $('#'+selectId+'> select').change();

  })

  .hover(

  function(){

  $('#'+selectId+' > div > ul > li').removeClass("over");

  $(this).addClass("over").addClass("selectedli");

  selectIndex = $('#'+selectId+' > div > ul > li').index(this);

  },

  function(){

  $(this).removeClass("over");

  }

  );

  //End

  };

  e.stopPropagation();

  })

  .bind("mousewheel",function(){

  //以后也许支持滚轮

  /*$('#'+selectId+' > div > ul > li').hover(

  function(){

  return false;

  },

  function(){

  return false;

  }

  );*/

  })

  .bind("dblclick", function(){

  __clearSelectMenu();

  return false;

  })

  .bind("keydown",function(e){

  //var hotkeys = e.keyCode;

  $(this).bind('keydown',function(e){

  if (e.keyCode == 40 || e.keyCode == 38 || e.keyCode == 35 || e.keyCode == 36){

  return false;

  }

  });

  switch(e.keyCode){ //设置为true可给定case范围

  case 9:

  return true;

  break;

  case 13:

  //enter

  //$('#value2').append('按回车收到的值:'+selectIndex+'  <br>');

  __clearSelectMenu();

  break;

  case 27:

  //esc

  __clearSelectMenu();

  break;

  case 33:

  $('#'+selectId+' > div > ul > li').removeClass("over");

  selectIndex = 0;

  __keyDown(selectId,selectIndex);

  break;

  case 34:

  $('#'+selectId+' > div > ul > li').removeClass("over");

  selectIndex = ($('#'+selectId+' > select > option').length - 1);

  __keyDown(selectId,selectIndex);

  break;

  case 35:

  $('#'+selectId+' > div > ul > li').removeClass("over");

  selectIndex = ($('#'+selectId+' > select > option').length - 1);

  __keyDown(selectId,selectIndex);

  break;

  case 36:

  $('#'+selectId+' > div > ul > li').removeClass("over");

  selectIndex = 0;

  __keyDown(selectId,selectIndex);

  break;

  case 38:

  //up

  //$('#value2').append('原始值:'+selectIndex+'  <br>');

  $('#'+selectId+' > div > ul > li').removeClass("over");

  if (selectIndex == 0){

  selectIndex = 0;

  }else{

  selectIndex--;

  };

  //$('#value2').append('<span style="color:red;" style="color:red;">向上改变的aa值:</span>'+selectIndex+'  ');

  __keyDown(selectId,selectIndex);

  break;

  case 40:

  //down

  //$('#value2').append('传递过来的:'+selectIndex+'  ');

  $('#'+selectId+' > div > ul > li').removeClass("over");

  if (selectIndex == ($('#'+selectId+' > select > option').length - 1)){

  selectIndex = $('#'+selectId+' > select > option').length - 1;

  }else{

  selectIndex ++;

  };

  //$('#value2').append('<span style="color:blue;" style="color:blue;">向下改变的aa值:</span>'+selectIndex+'  ');

  __keyDown(selectId,selectIndex);

  break;

  /*case ((hotkeys > 47 && hotkeys < 59) || (hotkeys > 64 && hotkeys < 91) || (hotkeys > 96 && hotkeys < 123)):

  //首字幕查询预留接口

  //character = String.fromCharCode(hotkeys).toLowerCase();

  return false;

  break;*/

  default:

  return false;

  break;

  };

  })

  .bind("blur",function(){

  __clearSelectMenu(selectId,selectZindex);

  return false;

  });

  //禁止选择

  $('.dropselectbox').bind("selectstart",function(){

  return false;

  });

  };

  function __clearSelectMenu(selectId,selectZindex){

  //$('#value2').append('移除焦点:'+selectIndex+'  <br>');

  $('.dropselectbox > ul').empty().hide();

  $('.dropselectbox > h4').removeClass("over").removeClass("current");

  $('.dropselectbox > span').removeClass("over");

  $('#'+selectId).removeClass('overclass');

  }

  function __setSelectValue(sID){

  $('#'+sID+' > div > ul').empty();

  $.each($('#'+sID+' > select > option'), function(i){

  $('#'+sID+' > div > ul').append("<li class='FixSelectBrowser'>"+$(this).text()+"</li>");

  });

  $('#'+sID+' > div > h4').empty().append($('#'+sID+' > select option:selected').text());

  $('#'+sID+' > div > ul > li').eq($('#'+sID+'> select')[0].selectedIndex).addClass("over").addClass("selectedli");

  }

  function __keyDown(sID,selectIndex){

  $('#'+sID+'> select')[0].selectedIndex = selectIndex;

  $('#'+sID+' > div > ul > li:eq('+selectIndex+')').toggleClass("over");

  $('#'+sID+' > div > h4').empty().append($('#'+sID+' > select option:selected').text());

  //SELECT onchange 事件

  $('#'+sID+'> select').change();

  }

  /* 自动调用 */

  $(document).ready(function(){

  var s = new Array();

  var t = document.getElementsByTagName('select');

  var j = 0;

  for(var i=0;i<t.length;i++){

  if(t[i].className=='commonselect'){

  s[j] = t[i];

  j++;

  }

  }

  if(j==0)return;

  var k = m = null;

  for(var i=0;i<s.length;i++){

  k = s[i].parentNode;

  m = createDiv(k, i);

  //s[i].replaceNode(m);

  k.replaceChild(m,s[i])

  m.appendChild(s[i]);

  $('#selectbox'+ i).sSelect();

  }

  function createDiv(p, i){

  var div = document.createElement('div');

  div.className = 'dropdown';

  div.id = 'selectbox' + i;

  div.innerHTML = ' ';

  p.appendChild(div);

  return div;

  }

  })

  HTML应用

  

复制代码 代码如下:

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <html xmlns="http://www.w3.org/1999/xhtml">

  <head>

  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

  <title>JQuery SELECT单选模拟</title>

  <style type="text/css" bogus="1">

  body,div,ul,h4,li {margin:0; padding:0; border:none; list-style:none; font-size:1;}

  /*下拉列表select的commonselect样式 配合jquery.select插件 */

  /* select style */

  .dropdown {outline:none;z-index:1;display:inline-block;*display:inline; position:relative;}

  .dropdown * {-moz-user-select:none;}

  .dropselectbox{float:left; position:absolute}

  .overclass{ z-index:999} /* 对于IE下层定位问题的修正样式 */

  .dropdown h4{position:relative;cursor:default; text-indent:5px;text-align:left;display:block;overflow:visible; margin:0; height:20px;font:12px/21px Arial, Helvetica, sans-serif; border:solid 1px #AAA; background:#3B3936 ;color:#CEBC7E;padding-left:0px;}

  .dropdown h4.over{border-color:#369;}

  .dropdown h4.current{border-color:#003;}

  .dropdown div {display:none;position:absolute; left:0px; top:0px;}

  .dropdown span {position:absolute;top:4px; right:3px; background:url(ico.gif) no-repeat center; width:16px; height:14px;}

  .dropdown ul{position:absolute;display:none;border:1px solid #AAA; background:#333;color:#8E867B;}

  .dropdown ul li{text-indent:5px;background:#333;height:19px;display:block;cursor:default;font:400 12px/19px Arial, Helvetica, sans-serif;text-align:left;}

  .dropdown ul li.over{background:#369; color:#FFF;}

  /* select style */

  /* input style */

  input.txt{border:solid 1px #AAA; background:#3B3936 ;color:#CEBC7E; height:18px;line-height:18px;}

  </style>

  <script type="text/javascript" src="jquery132.js" src="jquery132.js"></script>

  <script type="text/javascript" src="jquery.select.js" src="jquery.select.js"></script>

  </head>

  <body style="background:none" style="background:none">

  <h1>Jquery Select(单选) 模拟插件 V1.3.4</h1>

  <form action="#" method="post" style="margin:10px;" style="margin:10px;">

  类型:

  <select name="type" class="commonselect" id="test">

  <option value=""></option>

  <option value="男">类型男</option>

  <option value="女">类型女</option>

  </select>

  性别:

  <select name="sex" style="width:100px" onchange="alert(this.value);">

  <option value="">性别:</option>

  <option value="男">男</option>

  <option value="女">女</option>

  </select>

  <input type="text" size="8" class="txt" name='input'>

  <input type="submit" id="postform" value="提交表单" style="border:1px solid #000; height:23px; margin-left:20px;" />

  </form>

  </body>

  </html>

  可以参考这篇文档http://www.glzy8.com/jiaoben/21397.html