我是VSCode扩展的新手,正在try 创建一个webView Panel,用户可以在其中向api发送请求,并将响应粘贴在新的文本文档中.我遇到的问题是发送请求的按钮什么也不做,它甚至没有触发panel.webview.onDidReceiveMessage函数来运行自定义函数requestTemplate.我在做了一些网络搜索后添加和更改了一些东西,甚至询问了ChatGPT,但没有成功. 下面是extension. js和Package.json文件的副本. 提前感谢您为使按钮工作并调用该功能提供的任何帮助.

extension.js

const vscode = require('vscode');
const axios = require('axios');


function activate(context) {
    let disposable = vscode.commands.registerCommand('newextension.requestTemplateText', () => {
        const panel = vscode.window.createWebviewPanel(
            'newextensionPanel', 
            'Request Template', 
            vscode.ViewColumn.Two,
            {}
        );

        panel.webview.html = getWebviewContent();

        // Handle messages from the webview
        panel.webview.onDidReceiveMessage(async message => {
            console.log("value of message: " + message)
            // Check if the message contains the parameter text
            switch (message.command) {
                case 'requestTemplate': 
                    text = message.text;
                    await requestTemplate(text);
                    return;
            }
        }, undefined, context.subscriptions);
    });

    context.subscriptions.push(disposable);
}

async function requestTemplate(parameter) { //<-- Method I want triggered
    try {
        const response = await axios.get(`https://httpbin.org/get?text=${encodeURIComponent(parameter)}`); //<-- API has not been created yet, using this for testing

        vscode.workspace.openTextDocument({ content: JSON.stringify(response.data, null, 2), language: "json" }).then(doc => {
            vscode.window.showTextDocument(doc, vscode.ViewColumn.One);
        });
    } catch (error) {
        vscode.window.showErrorMessage('Error fetching data from the API');
        console.error(error);
    }
}

function getWebviewContent() {
    return `
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Request Template Text</title>
        <meta http-equiv="Content-Security-Policy" content="default-src 'none'; script-src 'unsafe-inline' 'unsafe-eval';">
    </head>
    <body>
        <h1>Request Template Text</h1>
        <input type="text" id="text" placeholder="Enter your coding question:"><br><br>
        <button onclick="requestTemplate()">Request Template</button> <-- The button in question
        <script> <-- I have tried to add this in the header but still does not work
            const vscode = acquireVsCodeApi();
            console.log('Sending message to extension:', { command: 'requestTemplate', text: document.getElementById('text').value });
            function requestTemplate() {
                const text = document.getElementById('text').value;
                vscode.postMessage({
                    command: 'requestTemplate',
                    text: parameter
                });
            }
        </script>
    </body>
    </html>
    `;
}

exports.activate = activate;

package.json

{
  "name": "newextension",
  "displayName": "newExtension",
  "description": "",
  "version": "0.0.1",
  "engines": {
    "vscode": "^1.88.0"
  },
  "categories": [
    "Other"
  ],
  "activationEvents": ["onCommand:newextension.requestTemplateText"],
  "main": "./extension.js",
  "contributes": {
    "commands": [
      {
        "command": "newextension.requestTemplateText",
        "title": "Request Template Text"
      }
    ],
    "webviewPanels": [
      {
        "viewType": "newextensionPanel",
        "title": "Request Template",
        "webviewOptions": {
          "retainContextWhenHidden": true
        }
      }
    ]
  },
  "scripts": {
    "vscode:prepublish": "npm run compile",
    "compile": "tsc -p ./",
    "watch": "tsc -watch -p ./"
  },
  "devDependencies": {
    "@types/node": "18.x",
    "typescript": "^5.3.3",
    "vscode": "^1.2.3"
  },
  "extensionDependencies": [],
  "private": true,
  "webview": {
    "retainContextWhenHidden": true
  }
}

推荐答案

在查看rioV8提到的Typing Cat example后,我发现我没有将enableScripts: true添加到"extension.js"文件中的vscode.window.createWebviewPanel函数调用中.函数调用应该像这样:

const panel = vscode.window.createWebviewPanel(
   'newextensionPanel', 
   'Request Template', 
   vscode.ViewColumn.Two,
   {enableScripts: true}
);

非常感谢@rioV8的帮助.

Javascript相关问答推荐

为什么JavaScript双边字符串文字插值不是二次的?

如何访问react路由v6加载器函数中的查询参数/搜索参数

我的glb文件没有加载到我的three.js文件中

获取加载失败:获取[.]添加时try 将文档添加到Firerestore,Nuxt 3

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

格式值未保存在redux持久切片中

基于变量切换隐藏文本

React 17与React 18中的不同setState行为

Chrome是否忽略WebAuthentication userVerification设置?""

使搜索栏更改语言

Angular 17—每当一个布尔变量变为真时触发循环轮询,只要它保持为真

Chart.js 4.4.2,当悬停在一个数据点上时,如何在工具提示中拥有多个数据点/标签?

查询参数未在我的Next.js应用路由接口中定义

一个实体一刀VS每个实体多刀S

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

如何修复使用axios运行TSC index.ts时出现的错误?

如果对象中的字段等于某个值,则从数组列表中删除对象

为什么在运行于<;img>;事件处理程序中的JavaScript中x和y是不可变的?

需要RTK-在ReactJS中查询多个组件的Mutations 数据

在HTML中使用meta标记来指定定制元数据以用于使用JavaScript进行检索是不是一个坏主意?