Создание собственного ярлыка для Документов Google (Alt + P, загрузка в формате pdf)

Я написал следующий скрипт для загрузки файла 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');
        }
    });
})();

Что я могу сделать, чтобы решить эту проблему?

Ваш сценарий мне подходит. Убедитесь, что заголовки @match/@include верны.

double-beep 24.06.2024 13:16

@double-beep, это очень странно, может быть, есть и другие расширения, влияющие на tampermonkey

Federica Guidotti 24.06.2024 13:25

@double-beep Я пытался отключить все расширения, результат тот же

Federica Guidotti 24.06.2024 13:29

Кажется, что только когда редактор сфокусирован, нажатие Alt+P не сработает. Это то, что я пропустил.

double-beep 24.06.2024 13:33

@double-beep, если у вас есть какие-либо предложения, я могу попробовать это сделать. Заранее спасибо.

Federica Guidotti 24.06.2024 14:02
Поведение ключевого слова "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) для оценки ваших знаний,...
1
5
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Кажется, что когда редактор сфокусирован, все события 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);
    });
})();

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