2011-06-28 16 views
6

Próbuję zmodyfikować funkcję 'attr' w rdzeniu jQuery (V.6.1).Jak edytować funkcję jquery

Mam plik plugins.js, który jest dołączony do strony za plikiem jquery-6.1.js. Plik plugins.js zawiera poprawki wprowadzone do różnych podstawowych funkcji jQuery w celu dostosowania niektórych funkcji SVG.

Skopiowałem funkcję attr do pliku plugins.js bez jej modyfikacji, ale teraz wywołuje błąd JavaScript po jej wywołaniu.

Czy ktoś wie dlaczego ta konkretna funkcja nie lubią być nadpisane (ja prawdopodobnie zastąpieniem go w niewłaściwy sposób):

(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); 
+2

Jaki błąd powstaje? –

+2

jakiego rodzaju elementów używasz? w jquery 1.6 zmienili się wyłącznie, jak działa attr, teraz używasz propu na niektórych elementach html, takich jak znaczniki DIV, i tabele do ustawiania właściwości: http://api.jquery.com/prop/ – John

+0

Niepoprawny argument "w" argument - if (! ("getAttribute" w elem)) { Nawiasem mówiąc, użyłem tej techniki przed modyfikacją części jQuery, po prostu wydaje się być funkcją attr (do tej pory), która nie akceptuje nadpisywania. – Steve

Odpowiedz

7

Zamiast całkowicie nadpisywania funkcji baza attr, po prostu przedłużyć go tak:

(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)); 

zrobiłem coś podobnego do tego, aby zastąpić $.each aby zapewnić pewne niestandardowe funkcjonalności. Nie jestem pewien, czy to naprawi twój błąd, ale jest to lepszy sposób na dodanie drobnej niestandardowej zmiany funkcjonalności, zamiast kopiowania/wklejania całej metody, aby wprowadzić jedną zmianę. Ta metoda umożliwia również podstawową bibliotekę jQuery do zmiany bez wpływu na dostosowanie.

+0

Podoba mi się. Dzięki za dobrą wskazówkę. – Steve

+0

BTW: Nazywa się to "łataniem małpy". – Axel

Powiązane problemy