JavaScript принудительно закрывает вкладку программно?

Я столкнулся с проблемой, когда некоторые веб-сайты не закрываются программно:

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() в окне, которое было открыто с window.open().

CertainPerformance 09.04.2018 02:59

Да, я в курсе.

Scott Thompson 09.04.2018 03:01

Где исполняется ваш window.close();? Если вы разрабатываете расширение chrome, вы можете использовать chrome API, чтобы закрыть определенную вкладку, которая должна работать в каждом случае. Вы также можете перенаправить на другой сайт или на случайный URL-адрес и закрыть это скриптом.

Luka Čelebić 09.04.2018 03:13

Я работаю над некоторыми JS для очистки веб-страниц, решение загрузки другого веб-сайта с последующим закрытием действительно работает, поэтому мне, возможно, придется использовать это ...

Scott Thompson 09.04.2018 03:15
console.info(window.close) предполагает, что они переопределили метод window.close() по умолчанию.
Arman Charan 09.04.2018 04:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
2 398
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Проблема, с которой вы сталкиваетесь, заключается в том, что этот веб-сайт заменил метод 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, и он работает. Оба ответа помогли, но это может быть более актуально для более широкой части сообщества, поэтому я считаю это принятым. Спасибо

Scott Thompson 09.04.2018 05:31

Следующий оператор 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 как другую функцию и вместо этого вызвать ее?

Scott Thompson 09.04.2018 05:22

Похоже, это тоже работает. Спасибо, если я установлю tab.close = window.close, я смогу успешно выполнить tab.close ().

Scott Thompson 09.04.2018 05:30

Другие вопросы по теме