วิธีป้องกันการแจ้งเตือน JavaScript เกิดขึ้นเมื่อออกจากหน้าเว็บอย่างไร


12

หน้าเว็บจำนวนมากมีการแจ้งเตือนเมื่อคุณออก: หากคุณปิดแท็บนำทางไปโดยไม่บันทึก ฯลฯ มีสาเหตุหลายประการที่เว็บไซต์จะแจ้งเตือน / บล็อกไม่ให้คุณออกจนกว่าคุณจะยืนยันการแจ้งเตือนเช่น "คุณแน่ใจหรือว่าต้องการ นำทางออกจากหน้านี้หรือไม่ ".

โดยทั่วไปจะทำกับonbeforeunloadและ / หรือonunloadตัวจัดการ

นี่คือตัวอย่าง

มีวิธีใดบ้างที่ฉันสามารถป้องกันเหตุการณ์แจ้งเตือน / การบล็อกผู้ใช้ที่สร้างโดยเครื่องมือจัดการเหล่านั้น โดยทั่วไปฉันต้องการออกจากการเปิดใช้งาน JS และไม่อนุญาตเฉพาะสิ่งที่จะป้องกันไม่ให้ฉันออกจากหน้าโดยไม่ต้องมีการคลิกพิเศษเกิดขึ้น

onbeforeunloadและonunloadตัวจัดการควรยังคงยิง พวกเขาไม่ควรได้รับอนุญาตให้ทำสิ่งต่าง ๆ ที่บล็อกผู้ใช้ นั่นหมายถึงไม่มีการแจ้งเตือนและไม่มีการดำเนินการที่ใช้เวลามากกว่าสองสามวินาที

ฉันพบปลั๊กอินเล็ก ๆ น้อย ๆ ที่แก้ไข / greasemonkey แก้ไขจาวาสคริปต์สำหรับหน้าเฉพาะและเล่นกับโค้ดของพวกเขาเล็กน้อยเพื่อลองและทำให้มันใช้ได้ในระดับสากลมากขึ้น อย่างไรก็ตามฉันหวังว่าจะพบโซลูชันที่ทำงานบนหน้าใดก็ได้ที่พยายามปิดกั้นการออกจากผู้ใช้


คุณสามารถโพสต์ URL ที่ทำเช่นนั้นได้หรือไม่?
golimar

แก้ไขเพิ่มตัวอย่างแล้ว นอกจากนี้ฉันเข้าใจว่าทำไมพฤติกรรมนี้จึงเป็นที่ต้องการและจำเป็นต้องมีเพื่อป้องกันการสูญหายของข้อมูลโดยไม่ตั้งใจในหลายกรณี ฉันยังต้องการทราบวิธีการแทนที่ / ปิดการใช้งาน
Zac B

หมายเหตุ: คำตอบปัจจุบันทั้งหมด (ซึ่งแก้ไขonbeforeunload) จะใช้ได้เฉพาะกับหน้าเว็บที่ใช้onbeforeunloadไม่ใช่สำหรับหน้าเว็บที่ใช้หนึ่งในวิธีอื่นในการแนบเหตุการณ์
Synetech

คำตอบ:


7

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

window.onbeforeunload = null;

สิ่งนี้จะทำงานได้ทุกที่เว้นแต่ว่าพวกเขาจะเป็นอันตรายอย่างแท้จริงและกำหนดมันต่อไป ในกรณีเช่นนี้การวนซ้ำเพื่อตั้งค่าnullอาจทำงานได้

while(true) {
    if (window.onbeforeunload != null) {
        window.onbeforeunload = null;
    }
}

ตอนนี้ถูกเตือนบางหน้าใช้สิ่งนี้เพื่อประโยชน์ นำหน้าอัปโหลดของ YouTube ไปใช้: หากคุณออกไปในระหว่างการอัปโหลดคุณอาจสูญเสียความคืบหน้าไปหลายชั่วโมง! หรืออาจเป็นเว็บฟอร์มที่คุณกรอกซึ่งคุณอาจไม่ต้องการกรอกอีกครั้งหรือข้อความ (ฟอรัม / อีเมล) ที่คุณอาจไม่ต้องการพิมพ์ซ้ำ ด้วยคุณสมบัตินี้คุณจะได้รับการปกป้อง

ปัญหาอื่นคือหน้าใด ๆ ที่ใช้สิ่งนี้เพื่อวัตถุประสงค์รองเช่นบันทึกข้อมูลโดย AJAX พวกเขาอาจใช้เหตุการณ์นี้เพื่อทริกเกอร์การดำเนินการบันทึกและหวังว่าผู้ใช้จะใช้เวลานานพอที่จะคลิกปุ่มเพื่อให้คำขอผ่าน อีกครั้งนี้มักจะทำเพื่อช่วยให้คุณประหยัดจากตัวคุณเอง

แต่เห็นได้ชัดว่าเราทุกคนรู้ว่าหลาย ๆ หน้าใช้สิ่งนี้ไม่ดี ดังนั้นหากคุณรู้ว่ามีหน้าใดที่คุณต้องการให้ใช้งานได้คุณอาจมีระบบบัญชีขาว ไม่มีทางที่จะปิดกั้นการกระทำนี้โดยไม่มีการปิดกั้นโดยสิ้นเชิงwindow.onbeforeunloadและการกระทำใด ๆ ที่อาจเป็นไปได้

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

window.onbeforeunload = function() {
    //Whatever
    return "WARNING! You have unsaved changes that may be lost!";
}

ดังนั้นคุณจะไม่สามารถปิดกั้นป๊อปอัปได้โดยไม่ลบฟังก์ชัน

นอกจากนี้หากคุณพบวิธี AJAX ใด ๆ ก็จะล้มเหลว ป๊อปอัพให้เวลาในการขอข้อมูลโดยไม่ผ่านข้อมูลอาจสูญหายได้

สำหรับonunloadคุณไม่ควรบล็อกคุณด้วยสิ่งนี้ เนื่องจากมันเริ่มทำงานหลังจากหน้าเว็บยกเลิกการโหลด แต่เพื่อความปลอดภัยคุณสามารถทำได้ตลอดเวลาwindow.onunload = null;และควรได้รับการดูแล


งานประเภทนั้น แต่ถ้าonbeforeunloadตัวจัดการทำอย่างอื่นที่สำคัญ? ตัวอย่างเช่นจะทำอย่างไรหากทำคำขอ AJAX สั้น ๆ หรือส่งบางสิ่งบางอย่างไปยังที่จัดเก็บ HTML5 ในเครื่อง มีวิธีที่จะป้องกันไม่ให้onbeforeunloadตัวจัดการการโทรบางอย่าง (เช่นalert()) หรือทำงานเป็นเวลานานกว่ากำหนดหรือไม่? นั่นเป็นเหตุผลที่ฉันถามเกี่ยวกับส่วนขยายมากกว่าเพียงแค่สคริปต์ประเภท greasemonkey: ดูเหมือนจะทำถูกต้องจะต้องมีการเปลี่ยนแปลงบางอย่างในระดับเครื่องมือ JavaScript
Zac B

1
ฉันได้เพิ่มข้อมูลเพิ่มเติม เท่าที่จริงแล้วการแก้ไขในระดับต่ำกว่าส่วนขยายนั้นไม่ใช่ระดับต่ำกว่าจริง ๆ พวกเขามีสิทธิ์ที่สูงขึ้นและ API พิเศษบางอย่าง แต่พวกเขาไม่มีความสามารถในการเปลี่ยนฟังก์ชั่นหลักของเบราว์เซอร์ ฉันไม่แน่ใจว่าจะทำการเสียบ FF แบบลึกได้อย่างไรฉันไม่มีประสบการณ์ในพื้นที่นั้น เห็นได้ชัดว่าเป็นโอเพนซอร์ซคุณสามารถทำการเปลี่ยนแปลงเหล่านั้นได้ แต่นั่นจะไกลไปหน่อยในการแก้ไขป๊อปอัป
zeel

ไม่ทำงานสำหรับฉัน :(
Phuc Nguyen

0
    // ==/UserScript==

var th = document.getElementsByTagName('body')[0];
var s = document.createElement('script');
s.setAttribute('type','text/javascript');
s.innerHTML = "window.onbeforeunload = function() {}";
th.appendChild(s);

1
ทำไมคุณถึงสร้างสคริปต์เช่นนี้
แบรด

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

0

มีเครื่องมือที่ดีที่สามารถจัดการกับป๊อปอัพที่น่ารำคาญใด ๆ บนระบบ Windows เป็น - ClickOff คุณสามารถดาวน์โหลดได้จากที่นี่ ฉันตรวจสอบและใช้งานได้กับการแจ้งเตือน "การเปลี่ยนแปลงที่คุณทำอาจไม่ถูกบันทึก" สำหรับไซต์ SharePoint

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