Το πρόβλημα είναι ότι όταν καλώ το window.close()
ή το self.close()
δεν κλείνει το παράθυρο. Τώρα φαίνεται να υπάρχει η πεποίθηση ότι στο Chrome δεν μπορείτε'να κλείσετε με script οποιοδήποτε παράθυρο που δεν έχει δημιουργηθεί με script. Αυτό είναι προφανώς ψευδές, αλλά ανεξάρτητα από αυτό υποτίθεται ότι εξακολουθεί να το κάνει, ακόμα και αν απαιτεί να εμφανιστεί μια ειδοποίηση για επιβεβαίωση. Αυτά δεν συμβαίνουν.
Έχει λοιπόν κανείς πραγματική, λειτουργική και αποδεδειγμένη μέθοδο κλεισίματος ενός παραθύρου χρησιμοποιώντας κάτι σαν javascript:window.close()
ή javascript:self.close()
που να κάνει πραγματικά αυτό που αναμένεται και κάτι που συμβαίνει μια χαρά σε κάθε πρόγραμμα περιήγησης που ΔΕΝ βασίζεται στον Chrome; Οποιαδήποτε πρόταση θα εκτιμηθεί ιδιαίτερα και ψάχνω για συγκεκριμένη λύση Javascript, τίποτα JQuery ή υλοποίηση τρίτου μέρους.
Επικαιροποίηση: Ενώ πολλά από όσα έχουν προταθεί έχουν σοβαρούς περιορισμούς και προβλήματα ευχρηστίας, η τελευταία πρόταση (ειδικά για το TamperMonkey) χρησιμοποιώντας // @grant window.close
στην επικεφαλίδα του σεναρίου συχνά κάνει το κόλπο ακόμα και σε εκείνες τις καρτέλες που κανονικά δεν μπορούν να χειριστούν τη μέθοδο close. Αν και δεν είναι εντελώς ιδανική και δεν'ε γενικεύεται σε κάθε περίπτωση, είναι μια καλή λύση στην περίπτωσή μου.
Η συνηθισμένη javascript δεν μπορεί να κλείνει παράθυρα με το έτσι θέλω. Αυτό είναι ένα χαρακτηριστικό ασφαλείας, που εισήχθη πριν από λίγο καιρό, για να σταματήσει διάφορες κακόβουλες εκμεταλλεύσεις και ενοχλήσεις.
Από την τελευταία προδιαγραφή εργασίας για την window.close()
:
Η μέθοδος
close()
σε αντικείμενα Window θα πρέπει, αν πληρούνται όλες οι ακόλουθες συνθήκες, να κλείσει το πλαίσιο περιήγησης A: >,
- Το αντίστοιχο πλαίσιο περιήγησης A είναι script-closable.
- Το πλαίσιο περιήγησης της τρέχουσας δέσμης ενεργειών είναι εξοικειωμένο με το πλαίσιο περιήγησης A.
- Το πλαίσιο περιήγησης του τρέχοντος σεναρίου επιτρέπεται να περιηγηθεί στο πλαίσιο περιήγησης A. >, Ένα πλαίσιο περιήγησης είναι κλειστό αν πρόκειται για ένα βοηθητικό πλαίσιο περιήγησης που δημιουργήθηκε από ένα σενάριο (σε αντίθεση με μια ενέργεια του χρήστη), ή αν πρόκειται για ένα πλαίσιο περιήγησης του οποίου το ιστορικό συνόδου περιέχει μόνο ένα έγγραφο.
Αυτό σημαίνει, με μια μικρή εξαίρεση, ότι το javascript δεν πρέπει να επιτρέπεται να κλείσει ένα παράθυρο που δεν ανοίχτηκε από το ίδιο javascript.
Ο Chrome επιτρέπει αυτή την εξαίρεση -- η οποία δεν ισχύει για τα usercripts -- ωστόσο ο Firefox δεν την επιτρέπει. Η υλοποίηση του Firefox δηλώνει ξεκάθαρα:
Αυτή η μέθοδος επιτρέπεται να κληθεί μόνο για παράθυρα που ανοίχτηκαν από ένα script με τη μέθοδο
window.open
.
Αν προσπαθήσετε να χρησιμοποιήσετε το window.close
από ένα Greasemonkey / Tampermonkey / usercript θα λάβετε:
Firefox: Το μήνυμα σφάλματος, "`Τα σενάρια δεν μπορούν να κλείσουν παράθυρα που δεν ανοίχτηκαν από το σενάριο.
",
Chrome: απλά αποτυγχάνει σιωπηλά.
<br>,
Ο καλύτερος τρόπος αντιμετώπισης αυτού του προβλήματος είναι να κάνει μια επέκταση του Chrome και/ή ένα πρόσθετο του Firefox αντ' αυτού. Αυτά μπορούν να κλείσουν αξιόπιστα το τρέχον παράθυρο.
Ωστόσο, δεδομένου ότι οι κίνδυνοι ασφαλείας, που ενέχει το window.close
, είναι πολύ μικρότεροι για ένα script του Greasemonkey/Tampermonkey, το Greasemonkey και το Tampermonkey θα μπορούσαν λογικά να παρέχουν αυτή τη λειτουργικότητα στο API τους (ουσιαστικά πακετάροντας τη δουλειά της επέκτασης για εσάς).
Σκεφτείτε το ενδεχόμενο να υποβάλετε ένα αίτημα λειτουργίας.
<br>,
Chrome is currently was vulnerable to the "self redirection" exploit. Έτσι, κώδικας όπως αυτός συνήθιζε να λειτουργεί γενικά:
open(location, '_self').close();
Αυτή είναι μια buggy συμπεριφορά, ΙΜΟ, και τώρα (από τον Απρίλιο του 2015 περίπου) είναι ως επί το πλείστον μπλοκαρισμένη. Εξακολουθεί να λειτουργεί από ενσωματωμένο κώδικα μόνο αν η καρτέλα είναι φρεσκοανοιγμένη και δεν έχει σελίδες στο ιστορικό περιήγησης. Έτσι, είναι χρήσιμο μόνο σε ένα πολύ μικρό σύνολο περιστάσεων.
Ωστόσο, μια παραλλαγή εξακολουθεί να λειτουργεί στον Chrome (v43 & vamp; v44) καθώς και στο Tampermonkey (v3.11 ή νεότερη έκδοση). Χρησιμοποιήστε ένα ρητό @grant
και το απλό window.close()
. EG:
// ==UserScript==
// @name window.close demo
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant GM_addStyle
// ==/UserScript==
setTimeout (window.close, 5000);
Ευχαριστούμε τον zanetu για την ενημέρωση. Σημειώστε ότι αυτό δεν θα λειτουργήσει αν υπάρχει μόνο μία καρτέλα ανοιχτή. Κλείνει μόνο τις πρόσθετες καρτέλες.
<br>, Ο Firefox είναι ασφαλής έναντι αυτού του exploit. Έτσι, ο μόνος τρόπος javascript είναι να παραλύσετε τις ρυθμίσεις ασφαλείας, ένα πρόγραμμα περιήγησης κάθε φορά.
Μπορείτε να ανοίξετε το about:config
και να ορίσετε
allow_scripts_to_close_windows
σε true
.
Αν το σενάριό σας είναι για προσωπική χρήση, προχωρήστε και κάντε το. Αν ζητήσετε από οποιονδήποτε άλλον να ενεργοποιήσει αυτή τη ρύθμιση, θα ήταν έξυπνο και δικαιολογημένο να αρνηθεί με επιφύλαξη.
Προς το παρόν δεν υπάρχει αντίστοιχη ρύθμιση για το Chrome.
Χρησιμοποιώ τη μέθοδο που δημοσίευσε ο Brock Adams και λειτουργεί ακόμη και στον Firefox, αν είναι με πρωτοβουλία του χρήστη.
open(location, '_self').close();
Το καλώ από το πάτημα ενός κουμπιού, ώστε να είναι με πρωτοβουλία του χρήστη, και εξακολουθεί να λειτουργεί άψογα χρησιμοποιώντας Chrome 35-40, Internet Explorer 11, Safari 7-8 και επίσης 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" />
Παρά το γεγονός ότι το θεωρείτε "προφανώς ψευδές", αυτό που λέτε "φαίνεται να είναι μια πεποίθηση" είναι στην πραγματικότητα σωστό. Η τεκμηρίωση της Mozilla για το window.close λέει
Αυτή η μέθοδος επιτρέπεται να κληθεί μόνο για παράθυρα που ανοίχτηκαν από ένα σενάριο με τη χρήση της μεθόδου window.open. Εάν το παράθυρο δεν ανοίχτηκε από μια δέσμη ενεργειών, εμφανίζεται το ακόλουθο σφάλμα στην κονσόλα JavaScript: Οι δέσμες ενεργειών δεν μπορούν να κλείσουν παράθυρα που δεν ανοίχτηκαν από δέσμη ενεργειών
Λέτε ότι "υποτίθεται ότι εξακολουθεί να το κάνει"αλλά δεν νομίζω ότι θα βρείτε κάποια αναφορά που να το υποστηρίζει αυτό, ίσως να'θυμηθήκατε κάτι λάθος;