我正在尝试修改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);
答案 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库,而不会影响您的自定义。