Букмарклет, чтобы открыть окно на URL, дождаться загрузки, закрыть окно - PullRequest
1 голос
/ 04 апреля 2020

Отказ от ответственности: на самом деле я не ожидаю, что это возможно из-за проблем с безопасностью, но прежде чем полностью отказаться, я должен был спросить: возможно ли с помощью букмарклета Javascript открыть окно для URL и иметь он автоматически закрывается после загрузки контента?

Я использую временно отключить Pi-hole , используя его API. Текущий код, который у меня есть, работает по простому таймауту, но я бы хотел, чтобы он загружал страницу перед закрытием окна.

Вот мой (расширенный) код на данный момент:

(() => {
    t = prompt('Disable time (seconds)',30);
    if (t) {
        w = window.open(`http://___IP___/admin/api.php?disable=${t}&auth=___APIKEY___`,'pi-disable','left=20,top=20,width=300,height=200');
        setTimeout(() => w.close(), 1000);
    }
})()

В случае, если это не очевидно, я не контролирую вывод URL-адреса, поэтому не могу добавить сценарий, чтобы он был закрыт, иначе это не будет проблемой. И для справки, вывод - это просто строка JSON: {"status":"disabled"}

Просто для ударов, я попытался использовать fetch () или добавить iframe, но, как и ожидалось, эти проблемы представляли другие проблемы (Mixed Content, CORS полис, et c).

1 Ответ

1 голос
/ 04 апреля 2020

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

У вас может быть другой букмарклет, который вы нажимаете при открытии нового окна. , но этот тип поражает точку автоматизации

Однако вы можете сделать это с помощью скрипта пользователя, который может запускаться автоматически при открытии страницы. Когда сайт API открыт, пользовательский скрипт следит за загрузкой страницы, а затем публикует сообщение о том, что страница закончила загрузку и может быть закрыта. Что-то вроде:

(() => {
    const t = prompt('Disable time (seconds)',30);
    if (!t) return;
    const w = window.open(`http://___IP___/admin/api.php?disable=${t}&auth=___APIKEY___`,'pi-disable','left=20,top=20,width=300,height=200');
    window.addEventListener('message', (messageEvent) => {
        if (messageEvent.data === 'api page loaded') w.close();
    });
})()

и с менеджером пользовательских скриптов, таким как Tampermonkey :

// ==UserScript==
// @name         Watch for API pageload
// @match        http://___IP___/*
// @grant        none
// ==/UserScript==

window.addEventListener('DOMContentLoaded', () => {
  window.opener.postMessage('api page loaded', '*');
});
...