Использование jQuery для преодоления ошибки значения кнопки IE - PullRequest
5 голосов
/ 13 февраля 2011

Проблема: В IE 6 и 7 текст элемента кнопки возвращается в jQuery с использованием .val () или .attr ('value') вместо фактического значения кнопки. Это известная проблема, которая также возникает с прямым Javascript, использующим .value. Здесь было предыдущее обсуждение:

Получить значение кнопки с помощью 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 ]

1 голос
/ 15 февраля 2011

ОБНОВЛЕНИЕ:

Теперь я работаю с функциями .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); 
0 голосов
/ 22 июля 2012

Улучшение Ал.код, чтобы заставить функцию 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 };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...