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


207

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

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

क्या वह अनंत लूप नहीं है?
पूल

1
@ निक - नहीं, ऐसा नहीं है। 'Normal' window.alert फंक्शन window._alert को सौंपा जाएगा। > के बाद <कि window.alert फ़ंक्शन को फिर से परिभाषित किया गया है।
क्रिस शोर

@roosteronacid: आपका कोड शब्दगत और वाक्यविन्यास रूप से ठीक था, हालांकि @ पेपर 1337 के रूप में बताया गया है ... वहाँ पुनरावृत्ति का कोई मौका नहीं मिला ... संक्षेप में, आपने पहले फंक्शन बॉडी को एक प्रकार से विस्तारित टेम्परेचर के रूप में स्वैप किया था। _alert
नॉन सीक्विटर

ऐ। मैंने एक रोल-बैक किया, जैसा कि इस सवाल का अस्पष्ट नहीं है :)
14

जवाबों:


210

यह निश्चित रूप से "समर्थित" है। यह आपका वेब पेज है, आप इसके साथ जो चाहें करना चाहते हैं।

मैंने पहले ही एक पुस्तकालय को संशोधित किए बिना विश्लेषिकी घटनाओं को ट्रैक करने के लिए किया था, लेकिन घटनाओं में चुपके से।

प्रॉक्सी पैटर्न का उपयोग करें:

(function(proxied) {
  window.alert = function() {
    // do something here
    return proxied.apply(this, arguments);
  };
})(window.alert);

आप चाहें तो कॉल को मूल फ़ंक्शन पर भी बायपास कर सकते हैं (अनुमानित)

यहाँ अधिक जानकारी: JQuery के प्रकार #Proxy पैटर्न


प्रॉक्सी पैटर्न पर +1 वास्तव में फंक को ओवरराइड करता है और यह सुनिश्चित करता है कि इसमें छेड़छाड़ न हो!
जोश स्टोडोला

15
ओह! इंटरनेट एक्सप्लोरर 8 apply()पर उपलब्ध नहीं है window.alert
cllpse

मुझे यह सुनकर दुख हुआ कि .. वस्तु applyका एक तरीका है Function। तो उन्हें स्पष्ट रूप से इसके लिए प्रतिबंधित करना चाहिए alert?
माइक ग्लीसन jr Couturier

4
उन्हें प्रॉक्सी पैटर्न का उपयोग करके इसे ओवरराइड करना चाहिए: D
जोश स्टोडोला

पुराने ब्राउज़र इसका समर्थन नहीं करते हैं और "window.alert =" पर एक अपवाद फेंक देंगे
क्रिस Pietschmann

23

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

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

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

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

/* 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);

15

ओवररिंग अलर्ट फ़ंक्शन में कोई खतरे नहीं हैं। हर ब्राउज़र इसे दबा देता है।

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

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

alert('This is an override.');

11
वहाँ सकता है अगर आपके प्रतिस्थापन nonblocking है खतरा। उदाहरण के लिए, कोड जो कॉल करता है alert("Reloading")और फिर वेबपेज को फिर से लोड करता है। उपयोगकर्ता द्वारा सतर्क पाठ कभी नहीं देखा जा सकता है।
दरियाई

13

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


12

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

window.alert = null

या

window.alert = function(){}

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

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

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

Window.prototype.alert = null

या

Window.prototype.alert = function(){}

यह आवश्यक रूप से अन्य फ़्रेमों में फ़ंक्शन को ओवरराइड नहीं करता है। देख jsfiddle.net/18znqbjd/1
रॉबर्ट

रॉबर्ट: हाँ और अच्छे कारणों के लिए। विभिन्न फ्रेम मूल रूप से अलग HTML दस्तावेज़ हैं, प्रत्येक जावास्क्रिप्ट के अपने स्वयं के "उदाहरण" के साथ।
रॉल्फ

क्या आप सुनिश्चित हैं कि Window.prototyp.alert अभी भी 2017 में एक समारोह है? : पी
iplus26

6

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

/** 
 * 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);

4

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

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

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


3

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

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

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


2

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


1
ब्राउज़र विशेष रूप से IE6 को लक्षित करने के लिए होगा, अन्य संभवतः इसके साथ ठीक होंगे।
एंथनीवजोन

1

एक त्वरित हैक जो मुझे लगता है कि अलर्ट कहां से आ रहे हैं, यह जानने के लिए कंसोल पर जाएं और फिर इसे दर्ज करें

function alert(message) { 
  console.info(message);
  debugger;
} 

0

जब यह js ब्राउज़र फ़ंक्शन की बात आती है, तो यह window.alertपूर्व-प्रतिष्ठित और सबसे अच्छी तरह से जाना जाता है, जो लोग js को नहीं जानते हैं alert()- बाकी का आश्वासन दिया गया है कि यह आज उपयोग किए जाने वाले सभी ब्राउज़रों में समर्थित है और आपका कोड स्निपेट भी है। हालाँकि, मैं ओवरराइड नहीं करूँगा (अच्छी तरह से यह ओओपी अर्थ में ओवरराइड के बजाय रिफैक्टिंग की तरह है) alert()एक विशेष उपयोग के मामले में आपके लिए क्योंकि जब आपको वास्तव में alert()बिना किसी टेम्पलेट के साथ उपयोग करने की आवश्यकता होती है , और आपको शायद इसकी आवश्यकता होगी ऐसा करने के लिए एक और गैर-अलर्ट फ़ंक्शन।


0

मुझे वास्तविक अलर्ट संदेशों के साथ एक डिफ़ॉल्ट संदेश दिखाने की आवश्यकता का सामना करना पड़ा है। इस तरह मैंने इसे करने में कामयाबी हासिल की।


    const actualAlertFunc = window.alert;
    window.alert = function(msg) {
         actualAlertFunc('some default message '+ msg);
    }

मैंने इसे क्रोम पर टेस्ट किया है। मुझे यकीन नहीं है कि इसका अच्छा अभ्यास है, लेकिन यह इस उद्देश्य को पूरा करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.