จาวาสคริปต์ทั่วไปไม่สามารถปิดหน้าต่างได้ นี่คือคุณลักษณะด้านความปลอดภัยซึ่งแนะนำเมื่อไม่นานมานี้เพื่อหยุดการหาช่องโหว่และการก่อกวนที่เป็นอันตรายต่างๆ
จากข้อมูลจำเพาะการทำงานล่าสุดสำหรับwindow.close()
:
ควรclose()
ใช้วิธีการกับวัตถุหน้าต่างหากเงื่อนไขต่อไปนี้ทั้งหมดปิดบริบทการสืบค้นA :
- บริบทการสืบค้นที่เกี่ยวข้องAสามารถปิดสคริปต์ได้
- บริบทการเรียกดูสคริปต์หน้าที่เป็นที่คุ้นเคยกับการเรียกดูบริบท
- บริบทการเรียกดูสคริปต์หน้าที่ที่ได้รับอนุญาตเพื่อนำทางเรียกดูบริบท
บริบทการสืบค้นคือสคริปต์ที่ปิดได้หากเป็นบริบทการสืบค้นเสริมที่สร้างขึ้นโดยสคริปต์ (ตรงข้ามกับการกระทำของผู้ใช้) หรือเป็นบริบทการสืบค้นที่มีประวัติเซสชันมีเอกสารเดียว
ซึ่งหมายความว่าด้วยข้อยกเว้นเล็ก ๆ น้อย ๆจาวาสคริปต์จะต้องไม่ได้รับอนุญาตให้ปิดหน้าต่างที่ไม่ได้เปิดโดยจาวาสคริปต์เดียวกันนั้น
Chrome อนุญาตให้ยกเว้น - ซึ่งไม่สามารถใช้ได้กับ userscripts - อย่างไรก็ตาม Firefox ไม่สามารถใช้งานได้ สถานะการติดตั้ง Firefox เรียบง่าย :
วิธีนี้ได้รับอนุญาตเท่านั้นที่จะถูกเรียกสำหรับ windows ที่เปิดโดยสคริปต์โดยใช้window.open
วิธีการ
หากคุณพยายามใช้window.close
จาก Greasemonkey / Tampermonkey / userscript คุณจะได้รับ:
Firefox:ข้อความแสดงข้อผิดพลาด " Scripts may not close windows that were not opened by script.
"
Chrome:ล้มเหลวอย่างเงียบ ๆ
ทางออกระยะยาว:
วิธีที่ดีที่สุดในการจัดการกับสิ่งนี้คือการสร้างส่วนขยายของ Chrome และ / หรือส่วนเสริมของ Firefox แทน สิ่งเหล่านี้สามารถปิดหน้าต่างปัจจุบันได้อย่างน่าเชื่อถือ
อย่างไรก็ตามเนื่องจากความเสี่ยงด้านความปลอดภัยที่วางไว้โดยwindow.close
มีน้อยมากสำหรับสคริปต์ Greasemonkey / Tampermonkey; Greasemonkey และ Tampermonkey สามารถให้ฟังก์ชั่นนี้ใน API ของพวกเขาได้อย่างสมเหตุสมผล
พิจารณาการร้องขอคุณสมบัติ
วิธีแก้ปัญหาแฮ็ค:
ปัจจุบันChrome มีความเสี่ยงต่อการ "เปลี่ยนเส้นทางด้วยตนเอง" ดังนั้นรหัสเช่นนี้เคยทำงานโดยทั่วไป:
open(location, '_self').close();
นี่คือพฤติกรรมบั๊กกี้ IMO และขณะนี้ (ณ เดือนเมษายน 2558 โดยประมาณ) ส่วนใหญ่ถูกปิดกั้น มันจะยังคงทำงานจากที่ฉีดรหัสเฉพาะถ้าแท็บเปิดสดใหม่และมีหน้าในประวัติการเข้าชมไม่ ดังนั้นจึงมีประโยชน์ในกรณีที่มีขนาดเล็กมากเท่านั้น
แต่รูปแบบยังคงทำงานบน Chrome (v43 & v44) บวก Tampermonkey (v3.11 หรือหลังจากนั้น) ใช้อย่างชัดเจนและธรรมดา@grant
window.close()
เช่น:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
ขอบคุณzanetuสำหรับการอัพเดท โปรดทราบว่านี่จะไม่ทำงานหากมีเพียงหนึ่งแท็บที่เปิดอยู่ มันจะปิดแท็บเพิ่มเติมเท่านั้น
Firefoxมีความปลอดภัยต่อการโจมตีดังกล่าว ดังนั้นวิธีเดียวที่จาวาสคริปต์คือการทำลายการตั้งค่าความปลอดภัยเบราว์เซอร์ครั้งละหนึ่ง
คุณสามารถเปิดขึ้นabout:config
และการตั้งค่าไป
allow_scripts_to_close_windows
true
หากสคริปต์ของคุณมีไว้สำหรับการใช้งานส่วนตัวไปข้างหน้าและทำสิ่งนั้น ถ้าคุณขอให้คนอื่นเปิดการตั้งค่าพวกเขาจะฉลาดและเป็นธรรมเพื่อปฏิเสธด้วยอคติ
ขณะนี้ไม่มีการตั้งค่าที่เทียบเท่ากับ Chrome
window.close()
ใช้ได้กับฉันในโครเมียม