JavaScript: การแจ้งเตือนที่มีอำนาจเหนือกว่า ()


207

ใครบ้างมีประสบการณ์กับการเอาชนะalert()ฟังก์ชั่นใน JavaScript?

  • เบราว์เซอร์ใดที่รองรับสิ่งนี้
  • เวอร์ชันของเบราว์เซอร์ใดที่รองรับสิ่งนี้
  • สิ่งที่เป็นอันตรายในการเอาชนะฟังก์ชั่น?

นั่นไม่ใช่การวนซ้ำไม่สิ้นสุดใช่ไหม
สระว่ายน้ำ

1
@Nick - ไม่มันไม่ใช่ ฟังก์ชัน window.alert 'ปกติ' จะถูกกำหนดให้กับ window._alert > หลังจาก <ว่าฟังก์ชัน window.alert ถูกกำหนดใหม่
Chris Shouts

@roosteronacid: โค้ดของคุณมีความหมายและมีความหมายเชิงประโยคแม้ว่า @ paper1337 ชี้ให้เห็นว่า ... ไม่มีโอกาสเกิดการเรียกซ้ำอีกเลยฮ่า ๆ ... ในสาระสำคัญคุณเพียงแค่สลับฟังก์ชั่นการทำงานกับ_alertการขยายชั่วคราวในครั้งแรก
ไม่ใช่ผู้ตัดต่อ

ใช่ ผมม้วนกลับเจ้าที่จะไม่ปิดบังคำถาม :)
cllpse

คำตอบ:


210

แน่นอน "สนับสนุน" มันเป็นหน้าเว็บของคุณคุณทำสิ่งที่คุณต้องการด้วย

ฉันทำสิ่งนี้แล้วเพื่อติดตามเหตุการณ์การวิเคราะห์โดยไม่ต้องดัดแปลงห้องสมุด แต่แอบเข้าไปในเหตุการณ์

ใช้รูปแบบพร็อกซี:

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

คุณสามารถเลี่ยงการเรียกไปยังฟังก์ชั่นดั้งเดิมได้หากต้องการ (พร็อกซี)

ข้อมูลเพิ่มเติมที่นี่: JQuery Types #Proxy Pattern


+1 ในรูปแบบพร็อกซีเพื่อแทนที่ func อย่างแท้จริงและให้แน่ใจว่าจะไม่ได้รับการแก้ไข!
Josh Stodola

15
ฮึ apply()ไม่สามารถใช้งานได้window.alertใน Internet Explorer 8
cllpse

ฉันเสียใจที่ได้ยินว่า .. applyเป็นวิธีการของFunctionวัตถุ ดังนั้นพวกเขาจะต้อง จำกัด อย่างชัดเจนเพื่อalert?!
Mike Gleason jr Couturier

4
พวกเขาจะต้องลบล้างมันโดยใช้รูปแบบพร็อกซี: D
Josh Stodola

เบราว์เซอร์รุ่นเก่าไม่รองรับสิ่งนี้และจะมีข้อยกเว้นใน "window.alert ="
Chris Pietschmann

23

แม้ว่าเบราว์เซอร์ส่วนใหญ่จะสนับสนุนการลบล้างมัน แต่ระวังสิ่งที่คุณทำด้วย

เนื่องจากกล่องการแจ้งเตือนเริ่มต้นบล็อกเธรดการดำเนินการบางไลบรารีที่ขึ้นอยู่กับลักษณะการทำงานนี้อาจไม่ทำงานอีกต่อไป (ที่ดีที่สุด)

คุณควรเป็นพลเมืองที่ดีและหลีกเลี่ยงการสัมผัสกับ API ดั้งเดิม หากคุณเป็นเช่นนั้นคุณสามารถแยกแยะสิ่งต่างๆได้เมื่อใช้รหัสบุคคลที่สาม

แต่ถ้าคุณต้องการกำหนดพฤติกรรมการเตือนในบริบทที่เฉพาะเจาะจงคุณสามารถใส่มันด้วยฟังก์ชันที่ไม่ระบุชื่อเช่นนี้

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

ไม่มีอันตรายในฟังก์ชั่น Overring alert ทุกเบราว์เซอร์สนับสนุน

ตัวอย่างเช่น:

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

alert('This is an override.');

11
มีอาจเป็นอันตรายหากทดแทนคุณคือ nonblocking ตัวอย่างเช่นรหัสที่โทรalert("Reloading")แล้วโหลดหน้าเว็บซ้ำ ผู้ใช้อาจไม่เห็นข้อความแจ้งเตือน
Darien

13

ฉันคิดว่าการใช้งานจาวาสคริปต์ทุกครั้งจะสนับสนุนสิ่งนี้และไม่มีอันตรายใด ๆ ที่เกี่ยวข้อง โดยทั่วไปแล้วจะแทนที่กล่องการแจ้งเตือนแบบ OS ธรรมดาเป็นอะไรที่หรูหรากว่าด้วย HTML / CSS การทำเช่นนี้หมายความว่าคุณไม่จำเป็นต้องเปลี่ยนรหัสที่มีอยู่! ความจริงที่เป็นไปได้ทำให้ Javascript ยอดเยี่ยม


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
Robert

Robert: ใช่และด้วยเหตุผลที่ดี เฟรมที่แตกต่างกันเป็นเอกสาร HTML ที่แตกต่างกันโดยทั่วไปแต่ละอันมี "อินสแตนซ์" ของ Javascript ของตนเอง
Rolf

คุณแน่ใจหรือไม่ว่า Window.prototype.alert ยังคงใช้งานได้ในปี 2017 : P
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

ประสบการณ์ของฉันกับฟังก์ชั่นการแจ้งเตือนที่เอาชนะ () คือเราเคยใช้มันเพื่อ "แฮ็ค" เวอร์ชันทดลองของไลบรารี JavaScript ที่แสดง "กรุณาลงทะเบียน!" หน้าจอจู้จี้ผ่านการแจ้งเตือนเป็นครั้งคราว

เราเพิ่งกำหนดฟังก์ชั่น alert () และ voila ของเราเอง

มันมีวัตถุประสงค์เพื่อการทดสอบเท่านั้นเราซื้อเวอร์ชันเต็มในภายหลังดังนั้นจึงไม่มีอะไรผิดศีลธรรมเกิดขึ้นที่นี่ ;-)


3

การใช้งานจาวาสคริปต์ทั้งหมดในเบราว์เซอร์สมัยใหม่รองรับการแทนที่

อันตรายค่อนข้างง่ายที่คุณจะผลักดันสมาชิกในทีมคนอื่นอย่างบ้าคลั่งโดยเอาชนะฟังก์ชั่นที่รู้จักกันทั่วไปเช่นการแจ้งเตือน ()

ดังนั้นหากคุณไม่ได้ใช้งานฟังก์ชั่นเป็นเครื่องมือในการดีบักหรือแฮกรหัสที่มีอยู่ในบางวิธีฉันไม่เห็นเหตุผลที่จะทำ เพียงแค่สร้างฟังก์ชั่นใหม่


2

มันทำงานได้ดีใน firefox และ ie8 ฉันไม่เห็นว่าจะมีเบราว์เซอร์ใดที่ไม่ทำงานนี่เป็นพื้นฐานที่ค่อนข้างมากของวิธีการใช้งานจาวาสคริปต์แม้ว่าจะไม่เห็นบ่อยครั้งที่มันใช้กับฟังก์ชันดั้งเดิมเช่นนั้น =)


1
เบราว์เซอร์ที่กำหนดเป้าหมายเฉพาะจะเป็น IE6 ส่วนคนอื่น ๆ ก็คงจะโอเคกับมัน
AnthonyWJones

1

แฮ็คอย่างรวดเร็วที่ฉันทำเพื่อค้นหาว่าการเตือนมาจากที่ใดให้ไปที่คอนโซลแล้วป้อนสิ่งนี้

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

0

เมื่อพูดถึงฟังก์ชั่นเบราว์เซอร์ js window.alertมีชื่อเสียงและเป็นที่รู้จักมากที่สุดคนที่ไม่รู้จัก js รู้alert()- มั่นใจได้ว่ามันรองรับเบราว์เซอร์ทั้งหมดที่ใช้อยู่ในปัจจุบันและข้อมูลโค้ดของคุณก็เป็นเช่นกัน อย่างไรก็ตามฉันจะไม่แทนที่ (เช่นนี้เป็นเหมือน refactoring แทนที่จะแทนที่ในความหมาย OOP) alert()สำหรับกรณีการใช้งานเฉพาะเป็นของคุณเพราะเมื่อคุณจำเป็นต้องใช้alert()โดยไม่มีเท็มเพลตและคุณอาจจะต้อง อีกฟังก์ชั่นที่ไม่แจ้งเตือนให้ทำเช่นนั้น


0

ฉันต้องเผชิญกับข้อกำหนดในการแสดงข้อความเริ่มต้นพร้อมกับข้อความแจ้งเตือนจริง นี่คือวิธีที่ฉันจัดการเพื่อทำมัน


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

ฉันทดสอบมันด้วยโครเมียมแล้ว ฉันไม่แน่ใจว่ามันเป็นการปฏิบัติที่ดี แต่มันทำหน้าที่ตามวัตถุประสงค์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.