问题:在IE 6& 7,使用.val()或.attr('value')在jQuery中返回button元素的文本,而不是按钮的实际值。这是一个已知问题,它也可以使用.value直接使用Javascript。之前有一个讨论:
Retrieve Button value with jQuery
但是从未找到可接受的整体解决方案(只有暂时隐藏按钮文本的黑客)。
我一直在研究一个完整的解决方案,这样无论何时访问按钮的值(无论是在表单提交还是仅使用jQuery / Javascript),都会返回正确的值。我使用下面的代码与.val()一起工作。 我正在寻求帮助,让它也可以使用.attr('value')工作,甚至可以使用直接的Javascript .value。
我已经设置了一个JSfiddle页面,可以在这里看到它:
http://jsfiddle.net/hyperseer/RVyDN/2/
代码:
$(document).ready(function(){
$().iefixer();
});
(function($){
$.fn.iefixer = function(){
$.fn.origval = $.fn.val;
$.fn.val = function(value){
var elem = this[0];
if(value === undefined){
var returnVal = null;
if( elem.nodeName.toLowerCase() == 'button' )
{
returnVal = elem.getAttributeNode("value").nodeValue;
} else {
returnVal = $(elem).origval();
}
return returnVal;
} else {
if( elem.nodeName.toLowerCase() == 'button' )
{
elem.getAttributeNode("value").nodeValue = value;
} else {
$(elem).origval(value);
}
}
}
$('button').click( function() {
alert( "$(this).val() = " + $(this).val() ); // this works now with above fix
alert( "$(this).attr('value') = " + $(this).attr('value') ); // doesn't work
alert( "this.value = " + this.value ); // straight JS doesn't work
});
};
})(jQuery);
答案 0 :(得分:1)
<强>更新强>
我现在使用以下代码使用.val()和.attr('value')函数:
$(document).ready(function(){
$().iefixer();
});
(function($){
$.fn.iefixer = function(){
var ie = $.browser.msie;
var ver = $.browser.version;
if ( ie && ver<=7 ) {
$.fn.origval = $.fn.val;
$.fn.val = function(value){
var elem = this[0];
if(value === undefined){
var returnVal = null;
if( elem.nodeName.toLowerCase() == 'button' )
{
returnVal = elem.getAttributeNode("value").nodeValue;
} else {
returnVal = $(elem).origval();
}
return returnVal;
} else {
if( elem.nodeName.toLowerCase() == 'button' )
{
elem.getAttributeNode("value").nodeValue = value;
} else {
$(elem).origval(value);
}
}
}
var originalAttr = $.fn.attr;
$.fn.attr = function(name, val) {
if (this[0].nodeName.toLowerCase() == 'button' && val === undefined) return $(this).val();
return originalAttr.apply(this, arguments);
}
}
};
})(jQuery);
答案 1 :(得分:0)
对Al的改进。代码,以使attr()函数使用除'value'以外的其他值:
var originalAttr = $.fn.attr;
$.fn.attr = function (name, val) {
if (name === 'value' && this[0].nodeName.toLowerCase() == 'button' && val === undefined) return $(this).val();
return originalAttr.apply(this, arguments);
}
对于ie9你需要检查:
if (elem.getAttributeNode("value") != undefined) { // code };