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 相关文章推荐
关于使用 jBox 对话框的提交不能弹出问题解决方法
Nov 07 Javascript
在javascript中对于DOM的加强
Apr 11 Javascript
鼠标经过显示二级菜单js特效
Aug 13 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
Aug 22 Javascript
Angular客户端请求Rest服务跨域问题的解决方法
Sep 19 Javascript
js中如何完美的解析数据
Mar 18 Javascript
微信小程序canvas拖拽、截图组件功能
Sep 04 Javascript
Vue.js实现表格渲染的方法
Sep 07 Javascript
解决vue移动端适配问题
Dec 12 Javascript
Vue Cli3 打包配置并自动忽略console.log语句的方法
Apr 23 Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
Sep 09 Javascript
Vue3 实现双盒子定位Overlay的示例
Dec 22 Vue.js
基于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
SONY ICF-SW55的电路分析
2021/03/02 无线电
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
PHP常用技巧汇总
2016/03/04 PHP
ThinkPHP 整合Bootstrap Ajax分页样式
2016/12/23 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
自己动手实现jQuery Callbacks完整功能代码详解
2013/11/25 Javascript
js清空form表单中的内容示例
2014/05/20 Javascript
js中将String转换为number以便比较
2014/07/08 Javascript
JavaScript通过setTimeout实时显示当前时间的方法
2015/04/16 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
AngularJS实现与Java Web服务器交互操作示例【附demo源码下载】
2016/11/02 Javascript
JavaScript 中定义函数用 var foo = function () {} 和 function foo()区别介绍
2018/03/01 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
微信小程序实现卡片层叠滑动效果
2019/06/21 Javascript
ES6 Object方法扩展的应用实例分析
2019/06/25 Javascript
[48:48]完美世界DOTA2联赛PWL S3 Magama vs GXR 第一场 12.19
2020/12/24 DOTA
Python正则表达式教程之一:基础篇
2017/03/02 Python
python 生成器生成杨辉三角的方法(必看)
2017/04/10 Python
Python简单实现控制电脑的方法
2018/01/22 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
python模糊图片过滤的方法
2018/12/14 Python
python多线程并发实例及其优化
2019/06/27 Python
对python中的*args与**kwgs的含义与作用详解
2019/08/28 Python
python实现简易学生信息管理系统
2020/04/05 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
iPython pylab模式启动方式
2020/04/24 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
秘鲁购物网站:Linio秘鲁
2017/04/07 全球购物
UNIX特点都有哪些
2016/04/05 面试题
教师专业理论水平的自我评价分享
2013/11/09 职场文书
车贷收入证明范本
2014/09/14 职场文书
2014离婚协议书范文(3篇)
2014/11/29 职场文书
学生检讨书范文
2019/06/24 职场文书