Я написал следующий скрипт для загрузки файла Google Docs в формате PDF; когда я нажимаю Alt + P ничего не происходит. Я использую Google Chrome.
// ==UserScript==
// @name Google Docs PDF Download Shortcut
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Adds a keyboard shortcut to download Google Docs as PDF
// @author You
// @match https://docs.google.com/document/d/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
document.addEventListener('keydown', function(e) {
if (e.altKey && e.key === 'p') {
let fileId = window.location.pathname.split('/')[3];
let downloadUrl = `https://docs.google.com/document/d/${fileId}/export?format=pdf`;
window.open(downloadUrl, '_blank');
}
});
})();
Что я могу сделать, чтобы решить эту проблему?
@double-beep, это очень странно, может быть, есть и другие расширения, влияющие на tampermonkey
@double-beep Я пытался отключить все расширения, результат тот же
Кажется, что только когда редактор сфокусирован, нажатие Alt+P не сработает. Это то, что я пропустил.
@double-beep, если у вас есть какие-либо предложения, я могу попробовать это сделать. Заранее спасибо.
Кажется, что когда редактор сфокусирован, все события keydown
запускаются в about:blank
iframe. Поскольку Tampermonkey не позволяет запускать пользовательские скрипты about:blank, мониторинг keydown
событий на document
не будет работать, когда редактор находится в фокусе.
Вместо этого вы можете дождаться появления iframe
, а затем добавить слушателя, используя модифицированную версию этого хака:
// ==UserScript==
// ...
// @match https://docs.google.com/document/*
// @run-at document-start
// ==/UserScript==
(function() {
'use strict';
function openInNewTab(event) {
if (event.altKey && event.key === 'p') {
const fileId = window.location.pathname.split('/')[3];
const downloadUrl = `https://docs.google.com/document/d/${fileId}/export?format=pdf`;
window.open(downloadUrl, '_blank');
}
}
document.addEventListener('keydown', openInNewTab);
setTimeout(function poll() {
const iframe = document.querySelector('iframe.docs-texteventtarget-iframe');
if (!iframe) return setTimeout(poll, 100);
const doc = iframe?.contentDocument;
const div = doc?.querySelector('div');
if (!div) return setTimeout(poll, 100);
div.addEventListener('keydown', openInNewTab);
});
})();
Ваш сценарий мне подходит. Убедитесь, что заголовки
@match
/@include
верны.