VSCode: Как включить ссылки на веб-странице в Webview - PullRequest
1 голос
/ 29 июня 2019

vscode.previewHtml получил одобрение в пользу Webview.Я обновил расширение ahk для vscode , используя этот новый API.С hh.exe -decompile Docs AutoHotkey.chm я получил версию основного сайта AutoHotkey для локального сайта.Я хотел показать во втором столбце контекстную документацию, чтобы вы могли прочитать об этом во время кодирования.Так я и сделал.Мне удалось загрузить страницу с таблицей стилей, но ссылки не работают: я всегда остаюсь на одной и той же странице.

Даже если я могу изменить свои настройки, я не могу перейти на другую страницу,Хотя вы можете прочитать во всплывающей подсказке значение href, каждый раз, когда вы нажимаете на ссылку, ничего не происходит.Папка Docs хранится внутри пути расширения, поэтому localResourceRoots должно быть в порядке.

Странная вещь, которую я заметил, заключается в том, что даже если для enableScripts установлено значение true, кажется, что не все jsкод выполняется, потому что на веб-сайте AutoHotkey, в .chm и в каждом .html-файлах, открытых с помощью FF, я вижу боковую панель, но не на странице WebView.

Это код для создания WebView.:


 this.docsPanel = vscode.window.createWebviewPanel('ahk-offline-docs', 'Documentation', { viewColumn: vscode.ViewColumn.Two, preserveFocus: true }, {
                enableScripts: true,
                enableFindWidget: true,
                enableCommandUris: true,
                localResourceRoots: [vscode.Uri.file(path.join(this.docsDirectoryPath, 'docs//')).with({ scheme: 'vscode-resource' })]
            });
            this.docsPanel.onDidDispose((e) => {
                this.isDocsPanelDisposed = true;
            });

И этот код загружает страницу в WebView:


let url = vscode.Uri.file(path.join(this.docsDirectoryPath, 'docs/')).with({ scheme: 'vscode-resource' });
                    const dom = new JSDOM(data, { runScripts: "dangerously" });
                    const aTags = dom.window.document.getElementsByTagName('a');
                    const len = aTags.length;
                    const basePath = url.toString();
                    for (let i = 0; i < len; i++) {
                        const a = aTags[i];
                        if (!a.href.includes('about:blank')) {
                            const commentCommandUri = vscode.Uri.parse(`command:ahk.spy`);
                            a.href = basePath + a.href;
                            // a.removeAttribute('href');
                            // a.setAttribute('onclick', '{command:ahk.spy}');
                        }
                    }
                    let ser = dom.serialize();
                    this.docsPanel.webview.html = /*data/*ser*/ser.toString().replace('<head>', `<head>\n<base href="${url.toString()}/">`);

Альтернативной идеей было запустить vscode.commands со страницы (из-за enableCommandUris) но я не понял, как выполнить эту операцию.

Если вам нужно / хотите воспроизвести эту проблему, вам просто нужно клонировать репозиторий, перейдя в ветку improving-offline-docs и откройте файл offline-docs-manager.ts, метод openTheDocsPanel()

Можно ли переключить текущую страницу, используя ссылки?Должен ли я разработать систему postMessage?или я где-то пропустил настройки?или есть еще лучший способ сделать это?

Заранее спасибо!

1 Ответ

1 голос
/ 01 июля 2019

Веб-просмотры не могут перейти на другую страницу внутри текущего веб-просмотра. Если ваше веб-представление пытается это сделать, вы должны увидеть сообщение, такое как prevented webview navigation, в инструментах разработчика веб-просмотра

Существует два способа обработки ссылок в веб-просмотрах:

  • <a>, которые ссылаются на внешний ресурс, такие как ссылки https: или mailto:, должны работать в большинстве случаев. Может быть несколько странных крайних случаев, и если вы столкнетесь с одним из них, вы захотите использовать command uri или postMessage, чтобы вызвать какое-либо действие в источнике вашего основного расширения

  • Если вы хотите обновить само содержимое веб-просмотра и по каким-то причинам не можете сделать это в самом веб-просмотре, используйте command uri или postMessage для вызова некоторой функции в источнике вашего основного расширения, которая обновляет html веб-просмотра

...