Как определить, открыто ли окно js

#javascript

Вопрос:

У меня есть страница конфигурации пользователя на странице настроек user-config , и страница открывается JS

 <a onclick="window.open("@/@user-config.php", "User Config", "directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=350,height=450");">Open User Config Window</a>
 

Его не следует открывать напрямую,
Итак, есть ли способ определить, открыто ли окно JS или нет

Спасибо 😐

Комментарии:

1. Проверьте, существует ли window.opener у вас user-config.php . Если страница открыта напрямую, у вас не будет открывателя окон.

2. Вы могли бы проверить, есть ли у всплывающего opener окна набор, но это также имело бы место, если бы оно было открыто по ссылке с обычным набором href target=» пустой». _»Его не следует открывать напрямую» — почему бы и нет, какой именно ущерб это может нанести?

3. Я не хочу быть «тем парнем»🙂, но пользователи будут делать то, что делают пользователи. Почему бы не сделать возможным открыть его напрямую?

Ответ №1:

Для меня лучше всего было бы разрешить открывать страницу напрямую. Пользователи будут делать то, что делают пользователи.

Но если вы не хотите этого делать (или не можете по каким-то причинам), то первое, что приходит на ум, — это иметь JavaScript открыть окно без URL-адреса (например, about:blank ), а затем заполнить это окно с результатом делаю вызов Ajax с заголовка, который не находится на прямой запрос (если кто-то делает прямой запрос с почтальоном или что-то, и беспокоясь о том, что это, наверное, перебор). PHP может проверить заголовок. Это выглядит примерно так:

 function openUserConfig() {
    const win = window.open("about:blank", "User Config", "directories=no,titlebar=no,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=350,height=450");
    win.document.write("<em>Loading...</em>");
    win.document.close();
    fetch("@/@user-config.php", {
        headers: {
            "The-Header": "Header Value",
        }
    })
    .then(response => {
        if (!response.ok) {
            throw new Error(`HTTP error ${response.status}`);
        }
        return response.text();
    })
    .then(html => {
        win.document.write(html);
        win.document.close();
    })
    .catch(() => {
        win.document.write("<strong>Error loading user config</strong>"); // Or whatever
        win.document.close();
    });
}
 

В сочетании с PHP, чтобы проверить заголовок и отправить обратно (например) ответ 403, если его там нет.

Обратите внимание, что для возвращаемой разметки документа @/@user-config.php также потребуется base элемент, чтобы относительные URL-адреса на странице (для CSS, JavaScript, шрифтов; ссылки в тексте) разрешались правильно. (Или сделайте все URL-адреса на странице абсолютными, или встроите все.)


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

Комментарии:

1. У меня проблема в том , что связанный CSS @user-config.php не работает

2. @N_R01 — Да, для этого потребуются либо абсолютные URL-адреса для этих вещей, либо base элемент (или чтобы все это было встроено).

3. @N_R01 — Да, я понял проблему, см. Комментарий выше.

4. Спасибо, проблема была исправлена другим способом, я использовал <?=$location?>../../../../c8kj48/css/cp-main.css PHP, спасибо, 🙂

Ответ №2:

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