Как редактировать функцию jquery - PullRequest
6 голосов
/ 28 июня 2011

Я пытаюсь изменить функцию 'attr' в ядре jQuery (V.6.1).

У меня есть файл plugins.js, который включен в страницу после файла jquery-6.1.js. Файл plugins.js содержит улучшения, внесенные в различные основные функции jQuery, чтобы обеспечить некоторые функциональные возможности SVG.

Я скопировал функцию attr в файл plugins.js, не изменяя ее, но теперь она вызывает ошибку JavaScript при ее вызове.

Кто-нибудь знает, почему эта конкретная функция не любит перезаписываться (возможно, я перезаписываю ее неправильно):

(function($){

    $.fn.attr = function( elem, name, value, pass ){

        var nType = elem.nodeType;

        // don't get/set attributes on text, comment and attribute nodes
        if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
            return undefined;
        }

        if ( pass && name in jQuery.attrFn ) {
            return jQuery( elem )[ name ]( value );
        }

        // Fallback to prop when attributes are not supported
        if ( !("getAttribute" in elem) ) {
            return jQuery.prop( elem, name, value );
        }

        var ret, hooks,
            notxml = nType !== 1 || !jQuery.isXMLDoc( elem );

        // Normalize the name if needed
        name = notxml && jQuery.attrFix[ name ] || name;

        hooks = jQuery.attrHooks[ name ];

        if ( !hooks ) {

            // Use boolHook for boolean attributes
            if ( rboolean.test( name ) &&
                (typeof value === "boolean" || value === undefined || value.toLowerCase() === name.toLowerCase()) ) {
                hooks = boolHook;

            // Use formHook for forms and if the name contains certain characters
            } else if ( formHook && (jQuery.nodeName( elem, "form" ) || rinvalidChar.test( name )) ) {
                hooks = formHook;
            }

        }

        if ( value !== undefined ) {

            if ( value === null ) {
                jQuery.removeAttr( elem, name );
                return undefined;

            } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
                return ret;

            } else {
                elem.setAttribute( name, "" + value );
                return value;
            }

        } else if ( hooks && "get" in hooks && notxml ) {

            return hooks.get( elem, name );

        } else {

            ret = elem.getAttribute( name );

            // Non-existent attributes return null, we normalize to undefined
            return ret === null ?
                undefined :
                ret;
        }

    };

})(jQuery);

1 Ответ

7 голосов
/ 01 июля 2011

Вместо полной перезаписи базовой функции attr, просто расширьте ее следующим образом:

(function($){
    var jqAttr = $.fn.attr;
    $.fn.attr = function( elem, name, value, pass ) {
        // check to see if it's the special case you're looking for
        if (name === 'transform') {
            // handle your special SVG case here
        } else {
            jqAttr(elem, name, value, pass);
        }
    };
}(jQuery));

Я сделал что-то похожее на это, чтобы переопределить $.each для предоставления некоторых пользовательских функций. Я не уверен, что это исправит вашу ошибку, но это лучший способ добавить незначительное пользовательское изменение в функциональность вместо того, чтобы копировать / вставлять весь метод, чтобы сделать одно изменение. Этот метод также позволяет изменять базовую библиотеку jQuery, не влияя на ваши настройки.

...