使用jQuery克服IE Button Value Bug

Al.*_*Al. 5 javascript jquery internet-explorer internet-explorer-7

问题:在IE 6和7中,使用.val()或.attr('value')而不是按钮的实际值在jQuery中返回按钮元素的文本.这是一个已知问题,它也可以使用.value直接使用Javascript.之前有一个讨论:

使用jQuery检索Button值

但是从未找到可接受的整体解决方案(只有暂时隐藏按钮文本的黑客).

我一直在研究一个完整的解决方案,这样无论何时访问按钮的值(无论是在表单提交还是仅使用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); 
Run Code Online (Sandbox Code Playgroud)

Al.*_*Al. 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); 
Run Code Online (Sandbox Code Playgroud)