gpt4 book ai didi

javascript - 在 WebExtension 中生成 HTML 结果为 `this.mDialog is null` 和 `can' t 访问死对象`

转载 作者:行者123 更新时间:2023-12-03 00:40:50 25 4
gpt4 key购买 nike

使用 WebExtension ,我正在尝试以编程方式生成这样的 HTML 文件:

<html><head><meta><title>example</title></head><body><p>Hello, world!</p></body></html>

然后使用 this method 下载它。 (背景:I am generating一个client-side redirect .)

这是我的 manifest.json:

{
"name": "Download HTML",
"description": "Generates an HTML file and downloads it",
"manifest_version": 2,
"version": "0.1",
"permissions": [
"activeTab"
],
"browser_action": {
"default_title": "Download HTML"
},
"background": {
"scripts": ["background.js"]
}
}

这是我的background.js:

function downloadHTML(tab) {
console.log('Begin downloadHTML()')
function generateHTML(title) {
var newHTML = document.createElement('html');
var newHead = document.createElement('head');
var newTitle = document.createElement('title');
newTitle.text = title;
var newMeta = document.createElement('meta');
var newBody = document.createElement('body');
var newPar = document.createElement('p');
var newText = document.createTextNode('Hello, world!');
newPar.appendChild(newText);
newBody.appendChild(newPar);
newHead.appendChild(newMeta);
newHead.appendChild(newTitle);
newHTML.append(newHead);
newHTML.append(newBody);
return newHTML;
}
// Now make an anchor to click to download the HTML.
var tempAnchor = document.createElement('a');
var myHTML = generateHTML(tab.title);
var HTMLBlob = new Blob([myHTML.outerHTML], {type: 'text/html'});
tempAnchor.href = URL.createObjectURL(HTMLBlob);
var filename = 'index.html';
tempAnchor.download = filename
tempAnchor.style.display = 'none';
document.body.appendChild(tempAnchor);
tempAnchor.click();
document.body.removeChild(tempAnchor);
console.log('End downloadHTML()')
}
// Add downloadHTML() as a listener to clicks on the browser action.
browser.browserAction.onClicked.addListener(downloadHTML);

我已在此页面上运行扩展程序:

http://info.cern.ch/hypertext/WWW/TheProject.html

当我这样做时,浏览器控制台会确认该函数从头到尾运行。

Begin downloadHTML() background.js:2:3
End downloadHTML() background.js:31:3

但是,没有下载提示,并且我收到以下错误消息:

TypeError: this.mDialog is null [Learn More] nsHelperAppDlg.js:173:5 

“了解更多”仅链接到“TypeError”:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Unexpected_type

当我调试扩展时,我发现了这些消息。

Webconsole context has changed

TypeError: can't access dead object [Learn More] accessible.js:140:5

“了解更多”链接指向有关死亡对象的信息。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Dead_object

我猜测 HTML 元素在调用 document.creatElement() 之间不会持续存在。我尝试将 generateHTML() 的主体移至其父函数中,但这没有帮助。

如何确保 HTML 持续存在?我不想修改实际的选项卡 HTML,我只想访问选项卡的标题(以及最终的 URL)。我查看了 Web Storage API,但我想存储 HTML,而不是键值对。

我运行的是 Firefox 版本 63.0.3。

最佳答案

您需要一个实际的 DOM 才能单击它。

无论如何......它可以简单得多

browser.browserAction.onClicked.addListener(downloadHTML);

function downloadHTML() {

// download to file, downloads string (not DOM)
const data = '<html><head><meta><title>example</title></head><body><p>Hello, world!</p></body></html>';
const blob = new Blob([data], {type : 'text/plain;charset=utf-8'});
const filename = 'something.html';

// both are fine: chrome.downloads.download or browser.downloads.download
// requires "downloads" permission
browser.downloads.download({
url: URL.createObjectURL(blob),
filename,
saveAs: true, // pops up a Save As dialog, omitting it will save the file to the Downloads folder set in Firefox Options
conflictAction: 'uniquify' // renames file if filename already exists
});
}

如果您想在 browserAction 上显示实际页面,那么在 manifest.json 中设置 "default_popup" 会更容易

关于javascript - 在 WebExtension 中生成 HTML 结果为 `this.mDialog is null` 和 `can' t 访问死对象`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53474726/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com