2011-06-28 15 views
6

संपादित करने के लिए मैं jQuery (V.6.1) कोर में 'attr' फ़ंक्शन को संशोधित करने का प्रयास कर रहा हूं।jquery function

मेरे पास एक plugins.js फ़ाइल है जो jquery-6.1.js फ़ाइल के बाद पृष्ठ में शामिल है। Plugins.js फ़ाइल में कुछ एसवीजी कार्यक्षमता को समायोजित करने के लिए विभिन्न jQuery कोर फ़ंक्शंस में किए गए सुधार शामिल हैं।

मैंने attr फ़ंक्शन को plugins.js फ़ाइल में संशोधित किए बिना कॉपी किया है, लेकिन अब इसे जावास्क्रिप्ट त्रुटि उत्पन्न होने पर उत्पन्न होता है।

क्या किसी को पता है कि क्यों इस विशेष समारोह ओवरराइट किया जा करने के लिए पसंद नहीं है (मैं शायद गलत तरीके से उसे ओवरराइट कर रहा हूँ):

(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

आप किस प्रकार के तत्वों का उपयोग कर रहे हैं? jquery 1.6 में वे विशेष रूप से बदलते हैं कि एटीआर कैसे काम करता है, अब आप गुणों को सेट करने के लिए डीआईवी टैग और टेबल जैसे कुछ एचटीएमएल तत्वों पर प्रोप का उपयोग करते हैं: http://api.jquery.com/prop/ – John

+0

अमान्य 'इन' ऑपरेंड elem - अगर (! (elem में "getAttribute") { गोपनीय रूप से, मैंने jQuery के कुछ हिस्सों को संशोधित करने से पहले इस तकनीक का उपयोग किया है, यह केवल एटीआर फ़ंक्शन (अब तक) लगता है जो ओवरराइट स्वीकार नहीं करता है। – 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 ओवरराइड करने के लिए कुछ कस्टम सुविधा प्रदान करने के लिए किया था। मुझे यकीन नहीं है कि यह आपके द्वारा की जा रही बग को ठीक करेगा, लेकिन एक बदलाव करने के लिए पूरी विधि को कॉपी/पेस्ट करने की बजाय कार्यक्षमता में मामूली कस्टम परिवर्तन जोड़ने का एक बेहतर तरीका है। यह विधि आधार अनुकूलन को आपके अनुकूलन को प्रभावित किए बिना बदलने की अनुमति देती है।

+0

मुझे यह पसंद है। अच्छी टिप के लिए धन्यवाद। – Steve

+0

बीटीडब्ल्यू: इसे "बंदर पैचिंग" कहा जाता है। – Axel