javascript - जावास्क्रिप्ट: ओवरराइडिंग अलर्ट()




override (8)

क्या जावास्क्रिप्ट में alert() फ़ंक्शन को ओवरराइड करने के साथ किसी को भी कोई अनुभव मिला है?

  • कौन से ब्राउज़र इसका समर्थन करते हैं?
  • कौन सा ब्राउज़र-संस्करण इसका समर्थन करता है?
  • समारोह को ओवरराइड करने में क्या खतरे हैं?

Ladislav।
आईई 8 के लिए आप इस तरह से अलर्ट () को फिर से परिभाषित कर सकते हैं

/** 
 * Definition of global attached to window properties <br/>
 */ 
    (function() {
      nalert = window.alert;
      Type = {
          native: 'native',
          custom: 'custom'
      };
    })();

/**
 * Factory method for calling alert(). 
 * It will be call a native alert() or a custom redefined alert() by a Type param.
 * This defeinition need for IE
 */ 
    (function(proxy) {

          proxy.alert = function () {
          var message = (!arguments[0]) ? 'null': arguments[0];
          var type = (!arguments[1]) ? '': arguments[1];

          if(type && type == 'native') {
           nalert(message);
          }
          else {
               document.write('<h1>I am redefiend alert()<br/>Alert say: '+message+'</h1>');
          }     
      };
   })(this);

और के रूप में कॉल करें

alert('Hello, hacker!');
nalert('I am native alert');
alert('Hello, user!', Type.custom);

आधुनिक ब्राउज़रों में सभी जावास्क्रिप्ट कार्यान्वयन ओवरराइडिंग का समर्थन करते हैं।

खतरे काफी सरल हैं, कि आप अलर्ट () जैसे सामान्य ज्ञात कार्यों को ओवरराइड करके अन्य टीम के सदस्यों को बिल्कुल पागल कर देंगे।

इसलिए जब तक कि आप किसी भी तरीके से मौजूदा कोड को डीबग या हैक करने के लिए टूल के रूप में ओवरराइड नहीं कर रहे हैं, मुझे ऐसा करने का कोई कारण नहीं दिखता है। बस एक नया फ़ंक्शन बनाएं।


ओवरराइडिंग अलर्ट () फ़ंक्शन के साथ मेरा अनुभव यह है कि हमने इसे एक बार जावास्क्रिप्ट लाइब्रेरी के "हैक" परीक्षण संस्करण में उपयोग किया जो "कृपया पंजीकरण करें!" समय के लिए सतर्क समय के माध्यम से नाग स्क्रीन।

हमने अभी अपना खुद का अलर्ट () फ़ंक्शन और वॉयला परिभाषित किया है।

यह केवल परीक्षण उद्देश्यों के लिए था, हमने बाद में पूर्ण संस्करण खरीदा, इसलिए यहाँ पर अनैतिक कुछ नहीं चल रहा ;-)


ओवरिंग चेतावनी समारोह में कोई खतरा नहीं है। हर ब्राउज़र इसे supprts।

उदाहरण के लिए:

// function over riding. Redirecting to Console with Firebug installed.
function alert(message) { 
    console.info(message);
} 

alert('This is an override.');

जैसा कि कई अन्य उत्तरों में कहा गया है, आप केवल फ़ंक्शन को ओवरराइड कर सकते हैं

window.alert = null

या

window.alert = function(){}

हालांकि, यह Window कन्स्ट्रक्टर के प्रोटोटाइप पर फ़ंक्शन को ओवरराइड नहीं करता है (पूंजी W नोट करें), इसलिए हैकर अभी भी टाइप कर सकता है:

Window.prototype.alert.apply(window, ["You were hacked!"]);

इसलिए, आपको उस फ़ंक्शन को ओवरराइड करने की भी आवश्यकता है:

Window.prototype.alert = null

या

Window.prototype.alert = function(){}

मुझे लगता है कि हर जावास्क्रिप्ट कार्यान्वयन इसका समर्थन करेगा, और इसमें कोई खतरा नहीं है। यह आमतौर पर सादा ओएस-स्टाइल अलर्ट बॉक्स को एचटीएमएल / सीएसएस के साथ कुछ और सुरुचिपूर्ण करने के लिए किया जाता है। ऐसा करने का मतलब है कि आपको मौजूदा कोड को बदलने की ज़रूरत नहीं है! तथ्य यह है कि यह संभव है जावास्क्रिप्ट अद्भुत बनाता है।


यह निश्चित रूप से फ़ायरफ़ॉक्स और ie8 में काम करता है। मैं नहीं देख सकता कि कोई ब्राउज़र होगा जो इसमें काम नहीं करेगा। यह जावास्क्रिप्ट कैसे काम करता है, यह बहुत मौलिक है, भले ही कोई इसे मूल कार्यों के साथ उपयोग नहीं करता है =)


हालांकि अधिकांश ब्राउज़र इसे ओवरराइड करने का समर्थन करते हैं, लेकिन इसके साथ सावधान रहें कि आप इसके साथ क्या कर रहे हैं।

चूंकि डिफ़ॉल्ट अलर्ट बॉक्स निष्पादन थ्रेड को अवरुद्ध करता है, इसलिए कुछ व्यवहार जो इस व्यवहार पर भरोसा करते हैं, अब और अधिक काम नहीं कर सकते हैं।

आपको एक अच्छा नागरिक होना चाहिए और देशी एपीआई को छूने से बचें। यदि आप करते हैं, तो आप तृतीय पक्ष कोड का उपयोग करते समय चीजों को तोड़ सकते हैं।

फिर भी, यदि आप एक विशिष्ट संदर्भ में चेतावनी व्यवहार को फिर से परिभाषित करना चाहते हैं, तो आप इसे एक अनाम कार्य के साथ संलग्न कर सकते हैं, जैसे:

/* new funky alert */
function myFunkyAlert(msg) { 
    /* here goes your funky alert implementation */
    alert("Look ma!\n" + msg);
}

(function(alert) { // anonymous function redefining the "alert"

    /* sample code */
    alert("Hello World!");

})(myFunkyAlert);







override