jQuery Select(单选) 模拟插件 V1.3.62 改进版


Posted in Javascript onJuly 17, 2010

首先感谢jQuery.Select.js的作者张经纬,jQuery.Select.js项目地址:http://www.zhangjingwei.com/archives/jquery-select%E5%8D%95%E9%80%89-%E6%A8%A1%E6%8B%9F%E6%8F%92%E4%BB%B6-v1-3-6/ 
 项目中需要使用基于jQuery的Select模拟效果,主要是想实现select的onmouseover事件,而不需要点击在经过时即可进行选择,找了很多没有理想的,最后决定在jQuery.Select.js 1.3.6的基础上改进。

下面是增加mouseover事件后的代码:(如需原版请在作者主页下载)

/* 
* jQuery Select Plugins v1.3.6.2 
* Copyright (c) 2009 zhangjingwei 
* Dual licensed under the MIT and GPL licenses. 
* Date: 2009-11-17 09:37 
* Revision: 1.3.6.2 
* www.leadwit.com-浪子 modify in 2010-07-26 14:26 
*/ 
(function($){ 
$.fn.extend({ 
sSelect: function() { 
return this.each(function(i,obj){ 
var selectId = (this.name||this.id)+'__jQSelect'+i||'__jQSelect'+i; 
if(obj.style.display != 'none' && $(this).parents()[0].id.indexOf('__jQSelect')<0){ 
var tabindex = this.tabIndex||0; 
$(this).before("<div class='dropdown' id="+selectId+" tabIndex="+tabindex+"></div>").prependTo($("#"+selectId)); 
var selectZindex = $(this).css('z-index'),selectIndex = $('#'+selectId+' option').index($('#'+selectId+' option:selected')[0]); 
$('#'+selectId).append('<div class="dropselectbox"><h4></h4><ul></ul></div>'); 
$('#'+selectId+' h4').empty().append($('#'+selectId+' option:selected').text()); 
var selectWidth=$('#'+selectId+' select').width(); 
if($.browser.safari){selectWidth = selectWidth+15} 
$('#'+selectId+' h4').css({width:selectWidth}); 
var selectUlwidth = selectWidth + parseInt($('#'+selectId+' h4').css("padding-left")) + parseInt($('#'+selectId+' h4').css("padding-right")); 
$('#'+selectId+' ul').css({width:selectUlwidth+'px'}); 
$('#'+selectId+' select').hide(); 
$('#'+selectId+' div').hover(function(){ 
$('#'+selectId+' h4').addClass("over"); 
},function(){ 
$('#'+selectId+' h4').removeClass("over"); 
}); 
var timeobj; 
$('#'+selectId+' ul').bind("mouseover",function(e){ 
clearTimeout(timeobj); 
}); 
var click_fun =function(){ 
$('#'+selectId+' h4').addClass("current"); 
$('#'+selectId+' ul').show(); 
var selectZindex = $('#'+selectId).css('z-index'); 
if ($.browser.msie || $.browser.opera){$('.dropdown').css({'position':'relative','z-index':'0'});} 
$('#'+selectId).css({'position':'relative','z-index':'999'}); 
$.fn.setSelectValue(selectId); 
selectIndex = $('#'+selectId+' li').index($('.selectedli')[0]); 
var windowspace = ($(window).scrollTop() + document.documentElement.clientHeight) - $('#'+selectId).offset().top; 
var ulspace = $('#'+selectId+' ul').outerHeight(true); 
var windowspace2 = $('#'+selectId).offset().top - $(window).scrollTop() - ulspace; 
windowspace < ulspace && windowspace2 > 0?$('#'+selectId+' ul').css({top:-ulspace}):$('#'+selectId+' ul').css({top:$('#'+selectId+' h4').outerHeight(true)}); 
$(window).scroll(function(){ 
windowspace = ($(window).scrollTop() + document.documentElement.clientHeight) - $('#'+selectId).offset().top; 
windowspace < ulspace?$('#'+selectId+' ul').css({top:-ulspace}):$('#'+selectId+' ul').css({top:$('#'+selectId+' h4').outerHeight(true)}); 
}); 
$('#'+selectId+' li').click(function(e){ 
selectIndex = $('#'+selectId+' li').index(this); 
$.fn.keyDown(selectId,selectIndex); 
$('#'+selectId+' h4').empty().append($('#'+selectId+' option:selected').text()); 
$.fn.clearSelectMenu(selectId,selectZindex); 
e.stopPropagation(); 
e.cancelbubble = true; 
}) 
.hover( 
function(){ 
$('#'+selectId+' li').removeClass("over"); 
$(this).addClass("over").addClass("selectedli"); 
selectIndex = $('#'+selectId+' li').index(this); 
}, 
function(){ 
$(this).removeClass("over"); 
} 
); 
} 
$('#'+selectId) 
.bind("focus",function(){ 
//$.fn.clearSelectMenu(selectId,selectZindex); 
$('#'+selectId+' h4').addClass("over"); 
}) 
.bind("click",function(e){ 
if($('#'+selectId+' ul').css("display") == 'block'){ 
$.fn.clearSelectMenu(selectId,selectZindex); 
return false; 
}else{ 
click_fun(); 
}; 
e.stopPropagation(); 
}) 
.bind("mouseover",function(e){ 
if($('#'+selectId+' ul').css("display") == 'block'){ 
//$.fn.clearSelectMenu(selectId,selectZindex); 
return false; 
}else{ 
click_fun(); 
}; 
e.stopPropagation(); 
}) 
.bind("mouseout",function(e){ 
if($('#'+selectId+' ul').css("display") == 'block'){ 
timeobj = setTimeout(function(){ 
$.fn.clearSelectMenu(selectId,selectZindex); 
},500); 
return false; 
} 
e.stopPropagation(); 
}) 
.bind('mousewheel', function(e,delta) { 
e.preventDefault(); 
var mousewheel = { 
$obj : $('#'+selectId+' li.over'), 
$slength : $('#'+selectId+' option').length, 
mup:function(){ 
this.$obj.removeClass("over"); 
selectIndex == 0?selectIndex = 0:selectIndex--; 
$.fn.keyDown(selectId,selectIndex); 
}, 
mdown:function(){ 
this.$obj.removeClass("over"); 
selectIndex == (this.$slength - 1)?selectIndex = this.$slength - 1:selectIndex ++; 
$.fn.keyDown(selectId,selectIndex); 
} 
} 
delta>0?mousewheel.mup():mousewheel.mdown(); 
}) 
.bind("dblclick", function(){ 
$.fn.clearSelectMenu(selectId,selectZindex); 
return false; 
}) 
.bind("keydown",function(e){ 
$(this).bind('keydown',function(e){ 
if (e.keyCode == 40 || e.keyCode == 38 || e.keyCode == 35 || e.keyCode == 36){ 
return false; 
} 
}); 
var $obj = $('#'+selectId+' li.over'),$slength = $('#'+selectId+' option').length; 
switch(e.keyCode){ 
case 9: 
return true; 
break; 
case 13: 
//enter 
$.fn.clearSelectMenu(selectId,selectZindex); 
break; 
case 27: 
//esc 
$.fn.clearSelectMenu(selectId,selectZindex); 
break; 
case 33: 
$obj.removeClass("over"); 
selectIndex = 0; 
$.fn.keyDown(selectId,selectIndex); 
break; 
case 34: 
$obj.removeClass("over"); 
selectIndex = ($slength - 1); 
$.fn.keyDown(selectId,selectIndex); 
break; 
case 35: 
$obj.removeClass("over"); 
selectIndex = ($slength - 1); 
$.fn.keyDown(selectId,selectIndex); 
break; 
case 36: 
$obj.removeClass("over"); 
selectIndex = 0; 
$.fn.keyDown(selectId,selectIndex); 
break; 
case 38: 
//up 
e.preventDefault(); 
$obj.removeClass("over"); 
selectIndex == 0?selectIndex = 0:selectIndex--; 
$.fn.keyDown(selectId,selectIndex); 
break; 
case 40: 
//down 
e.preventDefault(); 
$obj.removeClass("over"); 
selectIndex == ($slength - 1)?selectIndex = $slength - 1:selectIndex ++; 
$.fn.keyDown(selectId,selectIndex); 
break; 
default: 
e.preventDefault(); 
break; 
}; 
}) 
.bind("blur",function(){ 
$.fn.clearSelectMenu(selectId,selectZindex); 
return false; 
}) 
.bind("selectstart",function(){ 
return false; 
}); 
}else if($(this).parents()[0].id.indexOf('__jQSelect')>0){ 
selectId = $(this).parents()[0].id; 
$.fn.setSelectValue(selectId); 
var selectWidth=$('#'+selectId+' select').width(); 
if($.browser.safari){selectWidth = selectWidth+15} 
$('#'+selectId+' h4').css({width:selectWidth}); 
var selectUlwidth = selectWidth + parseInt($('#'+selectId+' h4').css("padding-left")) + parseInt($('#'+selectId+' h4').css("padding-right")); 
$('#'+selectId+' ul').css({width:selectUlwidth+'px'}); 
if(this.style.display != 'none'){$(this).hide();} 
}})}, 
clearSelectMenu:function(selectId,selectZindex){ 
if(selectId != undefined){ 
selectZindex = selectZindex||'auto'; 
$('#'+selectId+' ul').empty().hide(); 
$('#'+selectId+' h4').removeClass("over").removeClass("current"); 
$('#'+selectId).css({'z-index':selectZindex}); 
} 
}, 
setSelectValue:function(sID){ 
var content = []; 
$.each($('#'+sID+' option'), function(i){ 
content.push("<li class='FixSelectBrowser'>"+$(this).text()+"</li>"); 
}); 
content = content.join(''); 
$('#'+sID+' ul').html(content); 
$('#'+sID+' h4').html($('#'+sID+' option:selected').text()); 
$('#'+sID+' li').eq($('#'+sID+' select')[0].selectedIndex).addClass("over").addClass("selectedli"); 
}, 
keyDown:function(sID,selectIndex){ 
var $obj = $('#'+sID+' select'); 
$obj[0].selectedIndex = selectIndex; 
$obj.change(); 
$('#'+sID+' li:eq('+selectIndex+')').toggleClass("over"); 
$('#'+sID+' h4').html($('#'+sID+' option:selected').text()); 
} 
}); 
var types = ['DOMMouseScroll', 'mousewheel']; 
$.event.special.mousewheel = { 
setup: function() { 
if ( this.addEventListener ) 
for ( var i=types.length; i; ) 
this.addEventListener( types[--i], handler, false ); 
else 
this.onmousewheel = handler; 
}, 
teardown: function() { 
if ( this.removeEventListener ) 
for ( var i=types.length; i; ) 
this.removeEventListener( types[--i], handler, false ); 
else 
this.onmousewheel = null; 
} 
}; 
$.fn.extend({ 
mousewheel: function(fn) { 
return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel"); 
}, 
unmousewheel: function(fn) { 
return this.unbind("mousewheel", fn); 
} 
}); 
function handler(event) { 
var args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true; 
event = $.event.fix(event || window.event); 
event.type = "mousewheel"; 
if ( event.wheelDelta ) delta = event.wheelDelta/120; 
if ( event.detail ) delta = -event.detail/3; 
args.unshift(event, delta); 
return $.event.handle.apply(this, args); 
} 
})(jQuery);

演示地址 http://demo.3water.com/js/jQuery.Select/index.html
打包下载 https://3water.com/jiaoben/21397.html
Javascript 相关文章推荐
用javascript连接access数据库的方法
Nov 17 Javascript
为javascript添加String.Format方法
Aug 11 Javascript
javascript中的变量是传值还是传址的?
Apr 19 Javascript
基于jquery的不规则矩形的排列实现代码
Apr 16 Javascript
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
Jan 24 Javascript
jQuery实现的向下图文信息滚动效果
May 03 Javascript
js实现全国省份城市级联下拉菜单效果代码
Sep 07 Javascript
Javascript实现汉字和拼音互转的终极方案
Oct 19 Javascript
JS中跨页面调用变量和函数的方法(例如a.js 和 b.js中互相调用)
Nov 01 Javascript
详解基于vue-cli优化的webpack配置
Nov 06 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
Sep 24 Javascript
详解Nuxt内导航栏的两种实现方式
Apr 16 Javascript
基于jquery的Repeater实现代码
Jul 17 #Javascript
javascript onmouseout 解决办法
Jul 17 #Javascript
javascript 从if else 到 switch case 再到抽象
Jul 17 #Javascript
用JavaScript对JSON进行模式匹配 (Part 2 - 实现)
Jul 17 #Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
Jul 17 #Javascript
关于flash遮盖div浮动层的解决方法
Jul 17 #Javascript
JQUERY获取form表单值的代码
Jul 17 #Javascript
You might like
PHP 类商品秒杀计时实现代码
2010/05/05 PHP
php object转数组示例
2014/01/15 PHP
初识ThinkPHP控制器
2016/04/07 PHP
php使用ftp实现文件上传与下载功能
2017/07/21 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
JavaScript中的Primitive对象封装介绍
2014/12/31 Javascript
jQuery鼠标悬浮链接弹出跟随图片实例代码
2016/01/08 Javascript
超链接怎么正确调用javascript函数
2016/05/23 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
详解vue+vueRouter+webpack的简单实例
2017/06/17 Javascript
vue proxyTable 接口跨域请求调试的示例
2017/09/12 Javascript
JS实现的抛物线运动效果示例
2018/01/30 Javascript
vue-router 按需加载 component: () =&gt; import() 报错的解决
2020/09/22 Javascript
python中尾递归用法实例详解
2015/04/28 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
Python对切片命名的实现方法
2018/10/16 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
Python 取numpy数组的某几行某几列方法
2019/10/24 Python
python实现树的深度优先遍历与广度优先遍历详解
2019/10/26 Python
Python识别html主要文本框过程解析
2020/02/18 Python
Python OpenCV读取中文路径图像的方法
2020/07/02 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
澳大利亚旅游网站:Lastminute
2017/08/07 全球购物
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
Lentiamo荷兰:在线订购隐形眼镜、隐形眼镜液和太阳镜
2019/10/25 全球购物
Python面试题:Python是如何进行内存管理的
2014/08/04 面试题
六查六看剖析材料
2014/02/15 职场文书
公共场所禁烟标语
2014/06/25 职场文书
小班下学期幼儿评语
2014/12/30 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
深入理解java.lang.String类的不可变性
2021/06/27 Java/Android
Python+Appium自动化测试的实战
2021/06/30 Python