क्या किसी को alert()
जावास्क्रिप्ट में फ़ंक्शन को ओवरराइड करने का कोई अनुभव मिला है ?
- कौन से ब्राउज़र इसका समर्थन करते हैं?
- कौन से ब्राउज़र-संस्करण इसका समर्थन करते हैं?
- फ़ंक्शन को ओवरराइड करने में क्या खतरे हैं?
_alert
क्या किसी को alert()
जावास्क्रिप्ट में फ़ंक्शन को ओवरराइड करने का कोई अनुभव मिला है ?
_alert
जवाबों:
यह निश्चित रूप से "समर्थित" है। यह आपका वेब पेज है, आप इसके साथ जो चाहें करना चाहते हैं।
मैंने पहले ही एक पुस्तकालय को संशोधित किए बिना विश्लेषिकी घटनाओं को ट्रैक करने के लिए किया था, लेकिन घटनाओं में चुपके से।
प्रॉक्सी पैटर्न का उपयोग करें:
(function(proxied) {
window.alert = function() {
// do something here
return proxied.apply(this, arguments);
};
})(window.alert);
आप चाहें तो कॉल को मूल फ़ंक्शन पर भी बायपास कर सकते हैं (अनुमानित)
यहाँ अधिक जानकारी: JQuery के प्रकार #Proxy पैटर्न
apply()
पर उपलब्ध नहीं है window.alert
।
apply
का एक तरीका है Function
। तो उन्हें स्पष्ट रूप से इसके लिए प्रतिबंधित करना चाहिए alert
?
हालाँकि अधिकांश ब्राउज़र इसे ओवरराइड करने का समर्थन करते हैं, लेकिन आप इसके साथ क्या कर रहे हैं, इससे सावधान रहें।
चूंकि डिफॉल्ट अलर्ट बॉक्स निष्पादन थ्रेड को ब्लॉक करता है, इसलिए इस व्यवहार पर भरोसा करने वाले कुछ पुस्तकालय अब (सर्वोत्तम रूप से) काम नहीं कर सकते हैं।
आपको एक अच्छा नागरिक होना चाहिए और मूल एपीआई को छूने से बचना चाहिए। यदि आप करते हैं, तो आप 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);
ओवररिंग अलर्ट फ़ंक्शन में कोई खतरे नहीं हैं। हर ब्राउज़र इसे दबा देता है।
उदाहरण के लिए:
// function over riding. Redirecting to Console with Firebug installed.
function alert(message) {
console.info(message);
}
alert('This is an override.');
alert("Reloading")
और फिर वेबपेज को फिर से लोड करता है। उपयोगकर्ता द्वारा सतर्क पाठ कभी नहीं देखा जा सकता है।
मुझे लगता है कि प्रत्येक जावास्क्रिप्ट कार्यान्वयन इसका समर्थन करेगा, और इसके साथ कोई खतरा नहीं है। यह आमतौर पर HTML / CSS के साथ सादे ओएस-स्टाइल वाले अलर्ट बॉक्स को कुछ अधिक सुरुचिपूर्ण बनाने के लिए किया जाता है। इस तरह से करने का मतलब है कि आपको मौजूदा कोड को बदलना नहीं है! यह तथ्य कि यह संभव है कि जावास्क्रिप्ट को भयानक बनाता है।
जैसा कि अन्य कई उत्तरों में कहा गया है, आप केवल फ़ंक्शन को ओवरराइड कर सकते हैं
window.alert = null
या
window.alert = function(){}
हालाँकि, यह आवश्यक रूप से Window
कंस्ट्रक्टर के प्रोटोटाइप (राजधानी को नोट W
) के कार्य को ओवरराइड नहीं करता है , इसलिए हैकर अभी भी टाइप कर सकता है:
Window.prototype.alert.apply(window, ["You were hacked!"]);
इसलिए, आपको उस फ़ंक्शन को भी ओवरराइड करना होगा:
Window.prototype.alert = null
या
Window.prototype.alert = function(){}
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);
ओवरराइडिंग अलर्ट () फ़ंक्शन के साथ मेरा अनुभव यह है कि हमने एक बार जावास्क्रिप्ट लाइब्रेरी के "हैक" परीक्षण संस्करण का उपयोग किया था जो "कृपया रजिस्टर करें!" नाग स्क्रीन समय-समय पर चेतावनी के माध्यम से।
हमने केवल अपने स्वयं के अलर्ट () फ़ंक्शन और वॉइला को परिभाषित किया है।
यह केवल परीक्षण उद्देश्यों के लिए था, हमने बाद में पूर्ण संस्करण खरीदा, इसलिए यहां कुछ भी अनैतिक नहीं चल रहा है ;-)
आधुनिक ब्राउज़रों में सभी जावास्क्रिप्ट कार्यान्वयन ओवरराइडिंग का समर्थन करते हैं।
खतरे काफी सरल रूप से हैं, कि आप अन्य टीम के सदस्यों को सतर्क () जैसे सामान्य रूप से ज्ञात कार्यों को ओवरराइड करके पूरी तरह से पागल कर देंगे।
इसलिए जब तक आप किसी तरह से डिबग करने या मौजूदा कोड को हैक करने के एक उपकरण के रूप में कार्यों को ओवरराइड कर रहे हैं, मुझे ऐसा करने का कोई कारण नहीं दिखता है। बस एक नया फंक्शन बनाएं।
यह निश्चित रूप से फ़ायरफ़ॉक्स और ie8 में काम करता है। मैं यह नहीं देख सकता कि ऐसा कोई भी ब्राउज़र होगा जो इसमें काम नहीं करेगा। यह बहुत ही मौलिक है कि कैसे जावास्क्रिप्ट काम करता है, भले ही कोई अक्सर इसे उस तरह के मूल कार्यों के साथ उपयोग नहीं करता है =)
एक त्वरित हैक जो मुझे लगता है कि अलर्ट कहां से आ रहे हैं, यह जानने के लिए कंसोल पर जाएं और फिर इसे दर्ज करें
function alert(message) {
console.info(message);
debugger;
}
जब यह js ब्राउज़र फ़ंक्शन की बात आती है, तो यह window.alert
पूर्व-प्रतिष्ठित और सबसे अच्छी तरह से जाना जाता है, जो लोग js को नहीं जानते हैं alert()
- बाकी का आश्वासन दिया गया है कि यह आज उपयोग किए जाने वाले सभी ब्राउज़रों में समर्थित है और आपका कोड स्निपेट भी है। हालाँकि, मैं ओवरराइड नहीं करूँगा (अच्छी तरह से यह ओओपी अर्थ में ओवरराइड के बजाय रिफैक्टिंग की तरह है) alert()
एक विशेष उपयोग के मामले में आपके लिए क्योंकि जब आपको वास्तव में alert()
बिना किसी टेम्पलेट के साथ उपयोग करने की आवश्यकता होती है , और आपको शायद इसकी आवश्यकता होगी ऐसा करने के लिए एक और गैर-अलर्ट फ़ंक्शन।
मुझे वास्तविक अलर्ट संदेशों के साथ एक डिफ़ॉल्ट संदेश दिखाने की आवश्यकता का सामना करना पड़ा है। इस तरह मैंने इसे करने में कामयाबी हासिल की।
const actualAlertFunc = window.alert;
window.alert = function(msg) {
actualAlertFunc('some default message '+ msg);
}
मैंने इसे क्रोम पर टेस्ट किया है। मुझे यकीन नहीं है कि इसका अच्छा अभ्यास है, लेकिन यह इस उद्देश्य को पूरा करता है।