使用jQuery克服IE Button Value Bug

时间:2011-02-13 20:03:42

标签: javascript jquery internet-explorer internet-explorer-7

问题:在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); 

2 个答案:

答案 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 };