window.close และ self.close อย่าปิดหน้าต่างใน Chrome


174

ปัญหาคือเมื่อฉันเรียกwindow.close()หรือself.close()ไม่ปิดหน้าต่าง ตอนนี้ดูเหมือนจะมีความเชื่อว่าใน Chrome คุณไม่สามารถปิดสคริปต์ใด ๆ ที่ไม่ใช่สคริปต์ได้ นั่นเป็นความเท็จอย่างมีเหตุผล แต่ไม่ว่ามันจะยังคงทำเช่นนั้นแม้ว่าจะต้องมีการแจ้งเตือนปรากฏขึ้นเพื่อยืนยัน สิ่งเหล่านี้ไม่ได้เกิดขึ้น

ดังนั้นใครบ้างที่มีวิธีการทำงานจริงและได้รับการพิสูจน์แล้วว่าปิดหน้าต่างโดยใช้บางสิ่งบางอย่างjavascript:window.close()หรือjavascript:self.close()ทำสิ่งที่คาดหวังและสิ่งที่เกิดขึ้นใช้ได้กับทุกเบราว์เซอร์ที่ไม่ใช้ Chrome ข้อเสนอแนะใด ๆ ที่จะได้รับการชื่นชมอย่างมากและฉันกำลังมองหาโซลูชันเฉพาะ Javascript ไม่มีการใช้งาน JQuery หรือบุคคลที่สาม

อัปเดต:แม้ว่าข้อเสนอแนะส่วนใหญ่จะมีข้อ จำกัด ที่ร้ายแรงและปัญหาการใช้งานคำแนะนำล่าสุด (เฉพาะสำหรับ TamperMonkey) ที่ใช้// @grant window.closeในส่วนหัวของสคริปต์มักจะทำเคล็ดลับแม้ในแท็บเหล่านั้นซึ่งปกติไม่สามารถจัดการวิธีการปิด ในขณะที่ไม่เหมาะอย่างสมบูรณ์และไม่ได้ครอบคลุมทุกกรณีมันเป็นทางออกที่ดีในกรณีของฉัน


window.close()ใช้ได้กับฉันในโครเมียม
บด

3
@GµårÐïåñ: อืมมมไม่เป็นเช่นนั้น มันไม่มีอะไรเกี่ยวข้องกับภาษา มันเป็นฟังก์ชั่นที่ใช้งานโดยเบราว์เซอร์ หากคุณสามารถเขียนตัวอย่างเล็ก ๆ น้อย ๆ ที่แสดงให้เห็นว่าวิธีการwindow.closeทำงานไม่เป็นอย่างที่ควรจะเป็นฉันคิดว่านั่นอาจเป็นประโยชน์มากกว่าการพูดว่า "ไม่ทำงาน"
ปั่น

3
ฉันให้คุณสองตัวอย่าง สะกดมันออกมาเพื่อคุณ<a href="javascript:window.close">CLOSE</a>
GµårÐïåñ

3
ผู้คุ้มครองที่เป็นจาวาสคริปต์ที่ไม่เหมาะสม ลอง window.close () และใช้งานได้ window.close เป็นเพียงชื่อตัวแปรและจะไม่เรียกใช้ฟังก์ชัน (อย่างน้อยก็ไม่ใช่เมื่อฉันทดสอบด้วยโครเมี่ยม 37) เมื่อฉันเปลี่ยนตัวอย่างของคุณเป็น window.close () มันทำงานใน chrome 37.
George

3
GµårÐïåñ สิ่งที่ @Gorge พูดไม่ได้เป็นสิ่งที่สงสัย (เว้นแต่ว่าฉันเข้าใจผิดความหมายของคำทั้งหมด) เขาถูกต้องในการระบุว่าคุณมีข้อผิดพลาดทางไวยากรณ์ในจาวาสคริปต์ในตัวอย่างของคุณและหากคุณมีข้อผิดพลาดเดียวกันในรหัสแอปพลิเคชันของคุณนี่เป็นสาเหตุของปัญหาของคุณ อย่างไรก็ตามหากเหล่านี้เป็นเพียงการพิมพ์ผิดในตัวอย่างของคุณคุณควรแก้ไขความผิดพลาดเหล่านั้นเพื่อรับคำตอบที่ดีขึ้น
Superole

คำตอบ:


187

จาวาสคริปต์ทั่วไปไม่สามารถปิดหน้าต่างได้ นี่คือคุณลักษณะด้านความปลอดภัยซึ่งแนะนำเมื่อไม่นานมานี้เพื่อหยุดการหาช่องโหว่และการก่อกวนที่เป็นอันตรายต่างๆ

จากข้อมูลจำเพาะการทำงานล่าสุดสำหรับ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_windowstrue

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

ขณะนี้ไม่มีการตั้งค่าที่เทียบเท่ากับ Chrome


3
สวัสดีเพื่อนของฉันดีใจที่ได้ทราบจากคุณในที่สุด เพียงแค่ทราบบน Fx คุณสามารถข้ามข้อ จำกัด นั้นได้โดยการพลิกdom.allow_scripts_to_close_windows;falseไปที่trueแต่ฉันเดาว่าไม่มีอะไรใน Chrome โดยไม่แฮ็คแหล่งที่มา / สร้างใหม่ซึ่งเป็นวิธีที่ฉันได้รอบในตอนนี้ ฉันรู้และได้คุยกับนักพัฒนา TM และในอัลฟ่า / เบต้าล่าสุดเราได้กำหนดให้เป็นตัวเลือกความเข้ากันได้ (การตั้งค่าของสคริปต์) เพื่อให้ทำงานในสไตล์คนที่อยู่ตรงกลาง ฉันเดาว่าแฮ็คเราไม่มีวิธีแก้ปัญหาที่สะอาดน่าเสียดาย
GµårÐïåñ

3
หากใครกำลังมีปัญหากับหน้าต่างปิดหรือความแตกต่างของพฤติกรรมโดยเฉพาะในเบราว์เซอร์อ่านคำตอบนี้อย่างระมัดระวัง - มันมีข้อมูลที่ถูกต้องจริงๆ
Bron Davies

มีวิธีการตรวจสอบว่าเปิดหน้าต่างโดยสคริปต์หรือไม่? (ฉันจำเป็นต้องแสดง / ซ่อนปุ่มย้อนกลับฉันไม่ต้องการใช้แฮ็ค) ขอบคุณแก้ไข: window.opener === null
เซเตีย

ตั้งแต่ Chrome 36.0.1985.125 วันพุธ 16 กรกฎาคม 2014 การแก้ปัญหาแฮ็คอาจไม่ทำงานรายละเอียดในคำตอบของฉัน
swcool

2
window.close()จะทำงานใน Tampermonkey ถ้าคุณตั้งค่าให้เป็นค่าอื่นที่ไม่ใช่@grant noneดูกระทู้นี้
zanetu

32

Chrome แก้ไขปัญหาความปลอดภัยในรุ่น 36.0.1985.125

Chrome 36.0.1985.125 วันพุธ, 16 กรกฎาคม 2014 บันทึกประจำรุ่น

จากการสังเกตของฉันการปรับปรุงนี้แก้ไขปัญหาในการใช้window.close()เพื่อปิดหน้าต่างป๊อปอัพ คุณจะเห็นสิ่งนี้ในคอนโซลเมื่อมันล้มเหลว "สคริปต์อาจปิดเฉพาะหน้าต่างที่เปิดอยู่" นั่นหมายถึงการแก้ปัญหาแฮ็ค (คำตอบของ Brock Adams) อาจไม่ทำงานในรุ่นล่าสุด

ดังนั้นใน Chrome รุ่นก่อนหน้านี้ที่วางจำหน่ายบล็อกโค้ดด้านล่างอาจใช้งานได้ แต่ไม่ใช่กับการอัปเดตนี้

window.open('', '_self', '');
window.close();

สำหรับการอัปเดตนี้คุณต้องอัปเดตรหัสของคุณตามเพื่อปิดหน้าต่างป๊อปอัป หนึ่งในวิธีการแก้ปัญหาคือการคว้า id หน้าต่างป๊อปอัพและใช้

chrome.windows.remove(integer windowId, function callback)

วิธีการลบ โครเมี่ยมขยายหน้าต่าง API สามารถพบได้ที่chrome.windows

อันที่จริงส่วนขยาย Chrome ของฉันMarkViewประสบปัญหานี้และฉันต้องอัปเดตรหัสของฉันเพื่อให้สามารถทำงานกับ Chrome Update นี้ได้ โดยวิธีการที่ MarkView เป็นเครื่องมือในการอ่านและเขียนไฟล์ Markdown ที่น่ากลัวมันมีคุณสมบัติรวมถึงเนื้อหาเค้าร่างตารางเรียงได้และไฮไลต์ไวยากรณ์รหัสบล็อกด้วยหมายเลขบรรทัด

ฉันยังสร้างโพสต์นี้ความคิดเห็นใด ๆ ยินดีต้อนรับ


2
สับที่ถูกต้องopen(location, '_self').close();- open()ทราบการใช้ค่าที่ส่งกลับจาก ยังใช้งานได้กับ Chrome36.0.1985.125 m
Brock Adams

ในกรณีของฉันฉันเพิ่งทดสอบอีกครั้งด้วยopen(location, '_self').close();ฉันได้รับข้อผิดพลาด "ไม่ได้รับอนุญาต" ในเรื่องนี้ ข้อผิดพลาดนี้แตกต่างกับ 'window.close () (warning on this"Scripts may close only the windows that were opened by it."). It looked like open (location,' _self '). close (); `ขยับไปข้างหน้าเล็กน้อย แต่มันไม่สามารถทำให้เสร็จในกรณีของฉัน ขอบคุณ @ brock-adams สำหรับความคิดเห็น
swcool

ฉันมี typescript และเมื่อฉันใส่chrome.windows.removeมันบอกว่าไม่สามารถหาสัญลักษณ์โครเมี่ยม ฉันจะแก้ไขปัญหานี้ได้อย่างไร ฉันต้องเพิ่มการอ้างอิงบางประเภทหรือไม่
DevT

@devt chrome.windows.remove เป็น API ส่วนขยายของ Chrome จาวาสคริปต์ของคุณควรได้รับการยอมรับโดยโปรแกรมส่วนขยายของ chrome คุณสามารถลองใช้ใน background.js ในส่วนขยาย chrome manifest.json คุณต้องมี: "background": {"สคริปต์": ["background.js"], ... },
swcool

ฉันได้ลบฟังก์ชั่นการเข้าสู่ระบบMarkViewเพื่อให้ผู้ใช้สามารถเข้าถึงได้อย่างอิสระ ดังนั้นตัวอย่างที่ฉันกล่าวถึงข้างต้นจึงไม่สามารถใช้งานได้ในขณะนี้
swcool

21

ใน tampermonkey ตอนนี้คุณสามารถใช้ได้

// @grant        window.close

แล้วเพียงแค่โทร

window.close();

ฉันได้รับการยืนยันว่ามันใช้งานได้ในหลาย ๆ กรณี แต่ก็ยังคงดื้อรั้นเป็นครั้งคราว แต่ดีกว่าไม่มีอะไรขอบคุณ ฉันจะเพิ่มลงในโพสต์
GµårÐïåñ

2
เช่นเดียวกับหมายเหตุ: ไม่ทำงานสำหรับฉันใน Greasemonkey 3.10
mt025

17

ฉันใช้วิธีที่โพสต์โดย Brock Adams และใช้งานได้กับ Firefox หากผู้ใช้เป็นผู้เริ่มต้น

open(location, '_self').close();

ฉันกำลังเรียกมันจากการกดปุ่มเพื่อให้ผู้ใช้เริ่มต้นและมันก็ยังทำงานได้ดีโดยใช้ Chrome 35-40, Internet Explorer 11, Safari 7-8 และ ALSO Firefox 29-35 ฉันทดสอบโดยใช้เวอร์ชัน 8.1 ของ Windows และ Mac OS X 10.6, 10.9 & 10.10 ถ้าแตกต่างกัน


รหัสหน้าต่างปิดตัวเอง (ในหน้าเว็บที่ปิดตัวเอง)

รหัสที่สมบูรณ์ที่จะใช้ในหน้าต่างที่ผู้ใช้เปิดซึ่งสามารถปิดตัวเองได้:

window_to_close.htm

JavaScript:

function quitBox(cmd)
{   
    if (cmd=='quit')
    {
        open(location, '_self').close();
    }   
    return false;   
}

HTML:

<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />

ลองหน้าทดสอบนี้: (ทดสอบแล้วใน Chrome 40 และ Firefox 35)

http://browserstrangeness.bitbucket.io/window_close_tester.htm


รหัสเปิดหน้าต่าง (บนหน้าเว็บที่เปิดหน้าเว็บด้านบน)

ในการทำงานนี้ความเข้ากันได้ของเบราว์เซอร์ข้ามระบบรักษาความปลอดภัยกำหนดให้หน้าต่างที่จะปิดต้องถูกเปิดโดยผู้ใช้คลิกปุ่มภายในโดเมนไซต์เดียวกัน

ตัวอย่างเช่นหน้าต่างที่ใช้วิธีการด้านบนเพื่อปิดตัวเองสามารถเปิดได้จากหน้าเว็บที่ใช้รหัสนี้ (รหัสที่ได้จากหน้าตัวอย่างของฉันที่ลิงค์ด้านบน):

window_close_tester.htm

JavaScript:

function open_a_window() 
{
    window.open("window_to_close.htm"); 

    return false;
}

HTML:

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

ลืมเกี่ยวกับข้อยกเว้นที่เริ่มโดยผู้ใช้ จับดี. ฉันคิดว่าผู้ใช้ส่วนใหญ่ต้องการการใช้งานแบบอัตโนมัติอย่างสมบูรณ์ พวกเขามีกลไกการปิดที่ใช้งานง่ายและมีประโยชน์โดยผู้ใช้ - นั่นคือ X ตัวเล็กที่มุมบนขวา (^_^)
เบอร์ทรัมออบรีย์อดัมส์

1
อย่างใดมันไม่ทำงานสำหรับฉัน ไม่ใช่ทั้ง firefox 30 และ Chrome 37 สิ่งที่ทำคือทำให้หน้าเว็บว่างเปล่า (พฤติกรรมแปลก ๆ จริงๆ) <button onclick="open(location,'_self').close()" >Close Window</button>รหัสของฉันคือ ฉันกำลังทำอะไรผิดอย่างชัดเจนหรือไม่? ฉันว่านี่เป็นสิ่งที่ผู้ใช้ริเริ่ม หมายเหตุที่ฉันได้รับผลเหมือนกันถ้าผมใช้หรือ<button> <input type="button">
LordOfThePigs

เพิ่มหน้าทดสอบด้านบนในคำตอบสำหรับคุณ
Jeff Clayton

@YumYumYum ขอบคุณสำหรับการโพสต์ bitbucket.org เปลี่ยนลิงค์ไปยัง bitbucket.io เมื่อเร็ว ๆ นี้ - แก้ไขในคำตอบตอนนี้
Jeff Clayton

มันใช้งานได้สำหรับฉัน (มีปุ่มบนหน้าเพื่อปิดหน้าต่าง) สิ่งที่ใช้ไม่ได้คือ: window.open('', '_self', ''); window.close(); แต่มันใช้ได้กับ open(location, '_self').close();
krystonen

10

หลายคนยังคงพยายามหาวิธีปิดเบราว์เซอร์ Chrome โดยใช้ javascript วิธีการต่อไปนี้ใช้งานได้เฉพาะเมื่อคุณใช้ Chrome เป็นตัวเรียกใช้งานแอป - คีออสก์!

ฉันได้ทดสอบสิ่งต่อไปนี้แล้ว:

ฉันใช้ส่วนขยายต่อไปนี้: ปิด Kiosk

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

window.location.href = '/closekiosk';

ฉันหวังว่าจะช่วยให้ใครบางคนเพราะมันเป็นทางออกเดียวที่ฉันได้พบ

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


9

แม้จะคิดว่ามันเป็น "เท็จอย่างมีเหตุผล" สิ่งที่คุณพูดว่า "ดูเหมือนจะเป็นความเชื่อ" นั้นถูกต้องจริง เอกสาร Mozilla สำหรับwindow.closeกล่าว

วิธีนี้ได้รับอนุญาตเท่านั้นที่จะถูกเรียกสำหรับ windows ที่เปิดโดยสคริปต์โดยใช้วิธี window.open หากหน้าต่างไม่ได้เปิดโดยสคริปต์ข้อผิดพลาดต่อไปนี้จะปรากฏในคอนโซล JavaScript: สคริปต์อาจไม่ปิดหน้าต่างที่ไม่ได้เปิดโดยสคริปต์

คุณบอกว่ามันเป็น "ควรจะยังคงทำ" แต่ฉันไม่คิดว่าคุณจะพบการอ้างอิงใด ๆ ที่สนับสนุนสิ่งนั้น


9

ฉันพบวิธีใหม่ที่เหมาะกับฉันอย่างสมบูรณ์แบบ

var win = window.open("about:blank", "_self");
win.close();

1
นี่คือ 2017 และฉันยังคงได้รับข้อผิดพลาดของ "สคริปต์อาจไม่ปิดหน้าต่างที่ไม่ได้เปิดโดยสคริปต์"
Rotimi

แฮ็คที่ดีสำหรับปุ่มยืนยันของ IE 11
Gopal00005

ใช้งานได้กับ Chrome และ Firefox
Vineeth Pradhan

1
ดูเหมือนว่าหลุมนี้จะเต็มแล้ว ฉันไม่รู้ว่าเมื่อไหร่ แต่ฉันใช้ dev build 84.x ล่าสุด หน้าว่างโหลด แต่ปิดไม่เริ่มทำงาน
Scott Christensen

4

รหัสด้านล่างใช้งานได้สำหรับฉัน -

window.open('location', '_self', '');
window.close();

ทดสอบกับChrome 43.0.2357.81


คุณสามารถเพิ่มเวอร์ชัน Chrome ได้ไหม
เตฟาน

รุ่น chrome ของฉันคือ 43.0.2357.81
DfrDkn

7
สำหรับฉันแล้วแทนที่หน้าต่างปัจจุบันด้วยหน้าต่างที่ / location
alianos-

@ alianos- สำหรับฉันด้วย
RicardoGonzales

1
ไม่ทำงานใน chrome ล่าสุด - รุ่น 61.0.3163.100 (รุ่นทางการ) (64 บิต)
Subhajit

1

นี่อาจจะเก่า แต่เราจะตอบมัน

ฉันใช้ top.close ()เพื่อปิดแท็บ หน้าต่างปิด ()หรือเปิดอื่น ๆ ... ปิดไม่ทำงานสำหรับฉัน


11
นอกจากนี้ยังมี"Scripts may not close windows that were not opened by script."ปัญหาที่กล่าวถึงในคำตอบอื่น ๆ
kad81

1
โปรดให้คำตอบกับคุณ โปรดอย่าพูดคุยปัญหากับคำตอบของคุณเท่านั้น
Bimal Das

0

ในกรณีของฉันหน้าจำเป็นต้องปิด แต่อาจถูกเปิดโดยลิงก์และดังนั้น window.closeจะล้มเหลว

ทางออกที่ฉันเลือกคือการออกwindow.closeตามด้วยwindow.setTimeoutเปลี่ยนเส้นทางไปยังหน้าอื่น

ด้วยวิธีนี้หากwindow.closeประสบความสำเร็จการดำเนินการในหน้านั้นจะหยุดลง แต่หากล้มเหลวในอีกหนึ่งวินาทีหน้านั้นจะเปลี่ยนเส้นทางไปยังหน้าอื่น

window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);

0

คำตอบจาก Brock ทำให้ฉันทำงานได้ จาวาสคริปต์ต้องไม่ได้รับอนุญาตให้ปิดหน้าต่างที่ไม่ได้เปิดโดยจาวาสคริปต์เดียวกันนั้น

ฉันสามารถปิดหน้าต่างลูกได้หากฉันจะปิดหน้าต่างนี้จากจาวาสคริปต์หลัก ดังนั้นในพ่อแม่ของฉันฉันสามารถทำสิ่งนี้

var myChildWindow;

function openWindow(){
myChildWindow = window.open("","myChildWindow","width=400,height=400");
}

function closeWindow() {
myChildWindow.close();
}

-1

คุณสามารถลองใช้รหัสของฉันด้านล่าง สิ่งนี้จะช่วยให้คุณเปลี่ยนเส้นทางหน้าต่างหลักของคุณ:

ต้นทาง:

<script language="javascript">

function open_a_window() 
{
    var w = 200;
        var h = 200;
        var left = Number((screen.width/2)-(w/2));
        var tops = Number((screen.height/2)-(h/2));

        window.open("window_to_close.html", '', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+tops+', left='+left);

   return false;
}

// opener:
window.onmessage = function (e) {
  if (e.data === 'location') {
    window.location.replace('https://www.google.com');
  }
};

</script>

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

ป๊อปอัพ:

<!DOCTYPE html>
<html>
<body onload="quitBox('quit');">

<h1>The window closer:</h1>

<input type="button" onclick="return quitBox('quit');" value="Close This Window/Tab" /> 


<script language="javascript">

function quitBox(cmd) 
{      
    if (cmd=='quit')    
    {   
       window.opener.postMessage('location', '*');
       window.open(location, '_self').close();    
    }     
    return false;   
}

</script>

</body>
</html>

-1

สำหรับ TamperMonkey:

@grant window.close 

Ref: https://www.tampermonkey.net/documentation.php#_grant


ในขณะที่สิ่งนี้อาจตอบคำถามในทางทฤษฎีมันก็ควรที่จะรวมส่วนสำคัญของคำตอบที่นี่และให้ลิงค์สำหรับการอ้างอิง
Anton Menshov

-2

เฉพาะในกรณีที่คุณเปิดหน้าต่างใหม่โดยใช้ window.open () หน้าต่างใหม่จะสามารถปิดการใช้รหัสตามที่ฉันได้กล่าวไว้ข้างต้น สิ่งนี้ทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน :) หมายเหตุ: อย่าใช้ href เพื่อเปิดหน้าในแท็บใหม่ Window.close () ไม่ทำงานกับ "href" ใช้ window.open () แทน


1
มันเป็นเพียงการเปลี่ยนหน้าต่าง curren ไม่มีอีกแล้ว
RicardoGonzales

-3

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

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

ดังนั้นมันจึงเปิดขึ้นเปิด Chrome ในโหมดคีออสก์ตามที่อยู่ที่ถูกต้องแล้ว สิ่งนี้เกิดขึ้นเพื่อตอบสนองตัวเลือกที่สองในข้อมูลจำเพาะได้อย่างง่ายดาย:

บริบทการสืบค้นคือสคริปต์ที่ปิดได้หากเป็นบริบทการสืบค้นเสริมที่สร้างขึ้นโดยสคริปต์ (ตรงข้ามกับการกระทำของผู้ใช้) หรือถ้าเป็นบริบทการสืบค้นระดับบนสุดที่มีประวัติเซสชันมีเอกสารเดียว

ดังนั้นเพียงแค่โทรwindow.close()จากแอปคีออสก์ของฉันใช้งานได้ !


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