Я столкнулся с проблемой, когда некоторые веб-сайты не закрываются программно:
window.close()
не работает с:
web/Stores.war/RAPIDStorefrontAssetStore/AJAXUserInterface/javascript/FDBrowse.js:301 Uncaught TypeError: Cannot read property 'style' of null
at close (web/Stores.war/RAPIDStorefrontAssetStore/AJAXUserInterface/javascript/FDBrowse.js:301)
at <anonymous>:1:8
Сайт-нарушитель: https://www.1800flowers.com/about-us-employment-opportunities?utm_medium=direct&utm_source=1800flowerscom хотя такое случается и с другими.
Как я могу закрыть? Что работает в методе закрытия, который дает сбой? Некоторое расследование показывает, что документу не удается найти какой-либо элемент документа в скрипте, который веб-сайт пытается запустить, но как я могу предотвратить его запуск перед закрытием? Я попытался установить для методов on_X значение null, но безуспешно ...
Да, я в курсе.
Где исполняется ваш window.close();? Если вы разрабатываете расширение chrome, вы можете использовать chrome API, чтобы закрыть определенную вкладку, которая должна работать в каждом случае. Вы также можете перенаправить на другой сайт или на случайный URL-адрес и закрыть это скриптом.
Я работаю над некоторыми JS для очистки веб-страниц, решение загрузки другого веб-сайта с последующим закрытием действительно работает, поэтому мне, возможно, придется использовать это ...
console.info(window.close) предполагает, что они переопределили метод window.close() по умолчанию.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема, с которой вы сталкиваетесь, заключается в том, что этот веб-сайт заменил метод window.close по умолчанию какой-то другой функцией.
Чтобы обойти это, вы должны иметь возможность вызывать исходный метод Window.close из объекта Window, возвращаемого window.open() на вашей главной странице.
var popup = window.open('...');
popup.close(); // should be the original Window.close method
Но если по какой-то причине вы абсолютно хотите закрыть этот метод изнутри целевой страницы, вы можете получить исходный метод Window.close из contentWindow iframe и вызвать этот метод на своей неработающей странице.
function close(){
console.info("It's bad to declare on the global scope");
}
console.info(window.close.toString());
window.close(); // our function
var iframe = document.createElement('iframe');
iframe.style.cssText = 'opacity:0;position:absolute';
iframe.src = 'about:blank';
iframe.onload = function() {
console.info(iframe.contentWindow.close.toString());
// you could call it like this
iframe.contentWindow.close.call(window);
// even if it will not work here because we didn't open the page programmatically
document.body.removeChild(iframe);
};
document.body.appendChild(iframe);Вот живой plnkr, чтобы лучше продемонстрировать приведенный выше код.
Да, это работает, на самом деле у меня есть странное расширение chrome, которое я использую для очистки, которое превращает все вкладки в фоновые вкладки в основной процесс, поэтому это не работает, но я отключил ext, и он работает. Оба ответа помогли, но это может быть более актуально для более широкой части сообщества, поэтому я считаю это принятым. Спасибо
Следующий оператор creates a new window с использованием window.open() повторно связывает window.close() с original window, а затем с обоими closes.
(window.close = (w => w.close() || w.close)(window.open()))()
Объяснение
1800 Flowers переопределили глобальный window.close, чтобы закрыть arbitrary element.
Это очевидно при запуске console.info(window.close) в браузере.
console.info(window.close) // ƒ close(){document.getElementById("overlay").style.display = "none"}
error, который вы процитировали, связан с override у window.close() и отсутствием document.getElementById('overlay').
Отсюда: "Cannot read property 'style' of null".
Следовательно: чтобы закрыть 1800 Flowers программно, window.close() должен быть восстановлен (если не считать поиска альтернативного метода).
Насколько это будет производительно? Могу я просто сохранить метод close как другую функцию и вместо этого вызвать ее?
Похоже, это тоже работает. Спасибо, если я установлю tab.close = window.close, я смогу успешно выполнить tab.close ().
Вы можете только
window.close()в окне, которое было открыто сwindow.open().