2010-09-28 12 views
7

में एक वैश्विक फ़ंक्शन को ओवरराइड करना मैं जावास्क्रिप्ट सेटटाइम फ़ंक्शन में अपना स्वयं का त्रुटि प्रबंधन जोड़ने की कोशिश कर रहा हूं। निम्नलिखित कोड क्रोम में ठीक काम करता है:जावास्क्रिप्ट

var oldSetTimeout = window.setTimeout; 
window.setTimeout = function setTimeout(func, delay) { 
    var args = Array.prototype.slice.call(arguments, 0); 
    args[0] = function timeoutFunction() { 
     var timeoutArgs = Array.prototype.slice.call(arguments, 0); 
     try { 
      func.apply(this,timeoutArgs); 
     } 
     catch (exception) { 
      //Do Error Handling 
     } 
    } 
    return oldSetTimeout.apply(this, args); 
} 

लेकिन IE7 में यह एक पुनरावर्ती समारोह में बदल जाता है। किसी कारण से oldSetTimeout नए फ़ंक्शन पर सेट हो जाता है।

कोई सुझाव?



ओर ध्यान दें: हाँ, मैं इसे इस तरह करने की जरूरत है। मैं तीसरे पक्ष के पुस्तकालयों का ढेर उपयोग कर रहा हूं, जिनमें से सभी सेटटाइमआउट से अच्छी तरह से निपट नहीं पाते हैं, इसलिए मैं सिर्फ कॉलटाइम पर कॉल नहीं बदल सकता।

उत्तर

16

ऐसा इसलिए है क्योंकि आप का उपयोग कर रहे हैं फ़ंक्शन एक्सप्रेशन, जिन्हें IE में गलत तरीके से लागू किया गया है। फ़ंक्शन नामों को निकालने से तत्काल समस्या ठीक हो जाएगी। kangax के excellent article on this subject देखें। हालांकि, एक और समस्या है जो इतनी आसानी से तय नहीं है।

सामान्यतः, होस्ट ऑब्जेक्ट्स (जैसे window, document या किसी भी डोम तत्व) के गुणों को ओवरराइड करने का प्रयास करना अच्छा नहीं है, क्योंकि इस बात की कोई गारंटी नहीं है कि पर्यावरण इसकी अनुमति देगा। होस्ट ऑब्जेक्ट्स मूल वस्तुओं के समान नियमों से बंधे नहीं होते हैं और सार में वे जो भी पसंद करते हैं, कर सकते हैं। इस बात की भी कोई गारंटी नहीं है कि एक होस्ट विधि Function ऑब्जेक्ट होगी, और इसलिए oldSetTimeout में हमेशा apply() विधि नहीं हो सकती है। आईई में यह मामला है, इसलिए oldSetTimeout.apply(this, args); पर कॉल काम नहीं करेगा।

मैं बजाय निम्नलिखित सुझाव चाहते हैं: नकल करने के लिए

window.oldSetTimeout = window.setTimeout; 

window.setTimeout = function(func, delay) { 
    return window.oldSetTimeout(function() { 
     try { 
      func(); 
     } 
     catch (exception) { 
      //Do Error Handling 
     } 
    }, delay); 
}; 
3

टिम नीचे के जवाब में होने वाले मामूली सुधार मूल और भी अधिक:

window.oldSetTimeout = window.setTimeout; 
window.setTimeout = function(func, delay) { 
    return window.oldSetTimeout(function() { 
     try { 
      func(); 
     } 
     catch (exception) { 
      //Do Error Handling 
     } 
    }, delay); 
}; 
+0

अच्छा बिंदु। मैंने अपने जवाब में बदलाव किया; मुझे आशा है कि आपको बुरा लगेगा। –

+3

लॉल, लेकिन अब यह कहने के जवाब हैं>: | –