尝试这个。通过 IE11 和 FireFox 35.01 测试。这避免了在 Dhaval Marthak 的代码示例中的错误,无论您是否单击该选项,都会在第二次单击时调用该函数。
更多:http:
//jsfiddle.net/cR3MQ/11/
(function($) {
$.fn.selected = function(fn) {
return this.each(function() {
var $select = $(this);
var val = $select.val();
$(this).children('option').on('click',function() {
if(val === $(this).val()){
$select.trigger('unchange');
}else{
// $select.trigger('change');
}
fn(this);
val = $select.val();
});
});
}
})(jQuery);
$('select').selected(function(val) {
alert(val.value)
}).on('unchange',function(){
alert('unchange');
}).on('change',function(){
alert('change');
});
支持 chrome(版本 40.0.2214.115m)、Firfox 35.01、IE 11:http:
//jsfiddle.net/cR3MQ/13/
(function($) {
$.fn.selected = function(fn) {
return this.each(function() {
var $select = $(this);
var val = $select.val();
var optionClick = false;
$(this).children('option').each(function(i,e){
$(this).get(0).onclick = function() {
optionClick=true;
if(val === $(this).val()){
$select.trigger('unchange');
}else{
// $select.trigger('change');
}
fn(this);
val = $select.val();
}
});
var clicked = 0, changed = 0;
$select.on('change',function(){
changed++;
}).on('click',function(ev){
if(true === optionClick){
/*do nothing*/
}else{
if(0 === changed && 0 > ev.offsetX && 0 > ev.offsetY){
$select.trigger('unchange');
fn(this);
}else{
changed = 0;
}
}
});
});
}
})(jQuery);
$('select').selected(function(val) {
console.log(val.value)
}).on('click',function(ev){
//console.log(ev);
}).on('unchange',function(){
console.log('unchange');
}).on('change',function(){
console.log('change');
});