2011-06-28 3 views
6

jQuery(V.6.1)コアの 'attr'関数を修正しようとしています。jquery関数の編集方法

jquery-6.1.jsファイルの後にページに含まれているplugins.jsファイルがあります。 plugins.jsファイルには、いくつかのSVG機能に対応するためのさまざまなjQueryコア関数に対する改良が含まれています。

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

どのようなエラーが生成されますか? –

+2

attrをどのような要素で使用していますか? jquery 1.6では、attrがどのように動作するかを排他的に変更しました.DIVタグやテーブルなどの特定のhtml要素でpropを使用してプロパティを設定しました:http://api.jquery.com/prop/ – John

+0

無効な 'in'オペランドelem - if !(elemの "getAttribute")){ ちなみに、jQueryの一部を変更する前にこのテクニックを使用しましたが、上書きを受け付けないattr関数(これまでのところ)のようです。 – Steve

答えて

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を上書きするために、これに似た何かをしました。これでバグが修正されるかどうかはわかりませんが、メソッド全体をコピーして1つの変更を行うために貼り付けるのではなく、機能にマイナーなカスタム変更を追加する方が良い方法です。また、このメソッドを使用すると、カスタマイズに影響を与えることなく、ベースjQueryライブラリを変更することができます。

+0

私はそれが好きです。良いチップをありがとう。 – Steve

+0

ところでこれは「サルパッチ」と呼ばれています。 – Axel

関連する問題