Я сохраняю положение окна, когда оно закрыто:
const savePositionToStorage = (position) => {
localStorage.setItem('windowPosition', position);
console.info('Position saved:', position);
}
const getPositionFromStorage = () => {
const position = localStorage.getItem('windowPosition');
return position ? position : "top=0,left=0,width=800,height=1000";
}
и откройте такое окно:
const handleExpandClick = (id) => {
const windowFeatures = getPositionFromStorage();
const pdfWindow = window.open(
`http://127.0.0.1:8000/transactions/matching_evidence/${id}#toolbar=0,view=FitH`,
"pdf",
windowFeatures,
);
pdfWindow.onload = () => {
pdfWindow.onbeforeunload = () => {
savePositionToStorage(`top=${pdfWindow.screenY},left=${pdfWindow.screenX},height=${pdfWindow.innerHeight},width=${pdfWindow.innerWidth}`)
}
}
}
Пользователь должен иметь возможность сохранить текущее местоположение и размер окна, чтобы ему не приходилось каждый раз настраивать всплывающее окно. Он работает с текущим монитором браузера, но если я закрою его на другом мониторе, он просто появится в самом дальнем правом углу текущего монитора браузера.
Есть ли способ заархивировать то, что я хочу?
Chrome будет браузером, который используют пользователи.
@Джейк, это тоже сохраняет положение второго монитора? Как я могу проверить, разрешена ли политика Cors?
После const pdfWindow = window.open(...)
напишите pdfWindow.window.onload
. Если выдает ошибку, значит, политика cors не разрешена.
const pdfWindow = window.open( http://127.0.0.1:8000/transactions/matching_evidence/${id}#toolbar=0,view=FitH
, "pdf", windowFeatures, ); pdfWindow.window.onload Вот так? Там нет ошибки
После const pdfWindow...
сделайте window.pdfwindow = pdfwindow
. После запуска handleExpandClick()
попробуйте x.onload. Если вы видите An attempt was made to break through the security policy of the user agent.
, значит, CORS не включен. Извините, ранее было неправильно.
Я сделал это так: window.pdfwindow = pdfWindow window.pdfwindow.onload = () => { console.info("tes"); } Журнал распечатывается, ошибок нет. Спасибо, что нашли время попытаться помочь ;)
Предоставляет ли ScreenDetails достаточно информации? Экспериментальная функция Chrome/WebKit доступна только в безопасном контексте, поэтому ее использование может быть затруднено.
@l3l_aze выдает следующую ошибку: DOMException: для запроса разрешения требуется временная активация. Но я не могу найти, что мне нужно сделать, чтобы предоставить разрешения.
Это означает, что действие, вызывающее запрос разрешения, должно выполняться посредством взаимодействия с пользователем и не может быть автоматизировано. Временная активация на MDN.
Я сам задавался этим вопросом. К сожалению, не существует прямого способа надежно определить монитор, на котором в последний раз закрывалось окно, с помощью JavaScript. Браузеры не предоставляют API для получения информации монитора для окна.
Вот почему это сложно:
Вот несколько альтернативных подходов, которые следует рассмотреть:
1. Ручная регулировка:
2. (Частичное) Решение с использованием screen.availHeight/Width
:
screen.availHeight
и screen.availWidth
, чтобы получить доступное пространство на экране, что может дать вам представление о разрешении монитора.Пример (частичное решение):
const handleExpandClick = (id) => {
const storedPosition = getPositionFromStorage();
const availableWidth = screen.availWidth;
const availableHeight = screen.availHeight;
// If the stored position is outside the current monitor's bounds,
// reposition the window closer to the center.
let updatedPosition = storedPosition;
if (storedPosition.left > availableWidth || storedPosition.top > availableHeight) {
updatedPosition = `top=${availableHeight / 2},left=${availableWidth / 2},width=800,height=600`;
}
const pdfWindow = window.open(
`http://127.0.0.1:8000/transactions/matching_evidence/${id}#toolbar=0,view=FitH`,
"pdf",
updatedPosition
);
// ... rest of your code
};
3. Пользовательский ввод:
4. Сторонние библиотеки:
Хотя идеального решения для автоматического определения монитора не существует, эти обходные пути могут сделать работу более удобной для пользователя.
Привет, по какой-то причине код у меня теперь работает после того, как я удалил локальное хранилище. К сожалению, я не могу объяснить, почему и как ;(
Мой ответ помог?
Да, чтобы лучше понять причины безопасности, я проголосовал за вас. Но я не знаю, что мне отметить как ответ, так как проблема скорее всего была в локальном хранилище, я не уверен
Я нашел решение проблемы. Просто проверьте мой ответ
По какой-то причине сейчас это работает. Я удалил локальное хранилище, и когда попробовал еще раз, все сработало. Я особо ничего не менял, кроме того, что сохраняю данные в виде строкового json:
const savePositionToStorage = (position) => {
localStorage.setItem('windowPosition', JSON.stringify(position));
console.info('Position saved:', position);
}
const getPositionFromStorage = () => {
const position = JSON.parse(localStorage.getItem('windowPosition'));
return position ? position : { top: 0, left: 0, width: 800, height: 1000 };
}
// #region Click Events
const handleExpandClick = async (id) => {
const storedPosition = getPositionFromStorage();
const windowFeatures = `top=${storedPosition.top},left=${storedPosition.left},height=${storedPosition.height},width=${storedPosition.width}`;
const pdfWindow = window.open(
`http://127.0.0.1:8000/transactions/matching_evidence/${id}#toolbar=0,view=FitH`,
"pdf",
windowFeatures,
);
pdfWindow.onload = () => {
pdfWindow.onbeforeunload = () => {
savePositionToStorage({ "top": pdfWindow.screenY, "left": pdfWindow.screenX, "height": pdfWindow.innerHeight, "width": pdfWindow.innerWidth })
}
}
}
// #endregion
Я попрошу своих коллег опробовать этот код позже и сообщу, работает ли он там. Очень странно
Редактировать: Хорошо, проблема, похоже, в управлении окнами. Это должно быть установлено, чтобы разрешить. Я пока не знаю, как получить разрешения
Редактировать:
Я нашел проблему сейчас.
Мне просто нужно было дождаться обещания и продолжить (полный код):
Имейте в виду, что это не будет работать с FireFox.
https://developer.mozilla.org/en-US/docs/Web/API/Window/getScreenDetails
// #windowLocation
const savePositionToStorage = (position) => {
localStorage.setItem('windowPosition', JSON.stringify(position));
}
const getPositionFromStorage = () => {
const position = JSON.parse(localStorage.getItem('windowPosition'));
return position ? position : { top: 0, left: 0, width: 800, height: 1000 };
}
const loadWindow = (windowFeatures, id) => {
const pdfWindow = window.open(
`http://127.0.0.1:8000/transactions/matching_evidence/${id}#toolbar=0,view=FitH`,
"pdf",
windowFeatures,
);
pdfWindow.onload = () => {
pdfWindow.onbeforeunload = () => {
savePositionToStorage({ "top": pdfWindow.screenY, "left": pdfWindow.screenX, "height": pdfWindow.innerHeight, "width": pdfWindow.innerWidth })
}
}
}
// #endregion
// #region Click Events
const handleExpandClick = (id) => {
const storedPosition = getPositionFromStorage();
const windowFeatures = `top=${storedPosition.top},left=${storedPosition.left},height=${storedPosition.height},width=${storedPosition.width}`;
// if there are multiple screens, ask the user for window Management permissions.
// supported browser: https://developer.mozilla.org/en-US/docs/Web/API/Window/getScreenDetails
if (window.screen.isExtended) {
window.getScreenDetails().then(() => {
loadWindow(windowFeatures, id);
});
} else {
loadWindow(windowFeatures, id);
}
}
// #endregion
Ваш код работает нормально, если предположить, что веб-сайт поддерживает политику CORS. Вы уверены, что включили это?