如何编辑jquery函数

时间:2011-06-28 12:07:45

标签: jquery function rewrite attr

我正在尝试修改jQuery(V.6.1)核心中的'attr'函数。

我有一个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 个答案:

答案 0 :(得分:7)

不要完全覆盖基本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库,而不会影响您的自定义。