Javascript Chrome应用程序,文件系统API:ChooseSentry方法不起作用
编辑:找到错误,但无法解决,请参见下文 manifest.json background.js index.html 调用该方法和回调,但在执行回调时,文件选择对话框从未出现,readOnlyEntry未定义。开发工具上没有错误,我在35.0.1916.153 m上 我尝试过文件系统的清单声明的不同变体,但由于在脚本执行过程中没有定义函数,清单不太可能是问题所在 当我使用API的扩展时,应用程序可以工作,所以chrome设置也不是问题。问题似乎是我的代码,但我在这里迷路了 编辑:我添加了每个文件的内容 编辑2:发现错误,现在如何解决? 我在金丝雀中试过,发现错误是通过chrome.runtime.lastError显示的,而不是普通的控制台。这就是我得到的错误 无效的呼叫页。无法从后台页调用此函数Javascript Chrome应用程序,文件系统API:ChooseSentry方法不起作用,javascript,google-chrome,google-chrome-app,Javascript,Google Chrome,Google Chrome App,编辑:找到错误,但无法解决,请参见下文 manifest.json background.js index.html 调用该方法和回调,但在执行回调时,文件选择对话框从未出现,readOnlyEntry未定义。开发工具上没有错误,我在35.0.1916.153 m上 我尝试过文件系统的清单声明的不同变体,但由于在脚本执行过程中没有定义函数,清单不太可能是问题所在 当我使用API的扩展时,应用程序可以工作,所以chrome设置也不是问题。问题似乎是我的代码,但我在这里迷路了 编辑:我添加了每个文件
但是这不是在background.js中,而是在index.js中,它是从index.html调用的。我刚刚在Chrome中试过,你发布的代码似乎没有任何问题。我怀疑您加载javascript的方式有问题,或者可能是它在前台页面和后台页面中运行的上下文有问题 例如,如果您的JavaScript代码片段实际上在main.js中,那么它将在后台页面中运行,并且它的窗口和文档元素将不是来自主页的元素 我的测试应用程序看起来与您的非常相似,只是我从清单中漏掉了main.js文件,并构建了一个小index.html文件,该文件将加载一个foreground.js脚本。这是完整的应用程序: manifest.json js/background.js index.html 当我运行这个程序时,我可以单击输入元素,然后看到一个文件选择器。选择条目将返回一个FileEntry对象,该对象将记录到前台页面的控制台,而不是后台页面。在应用程序窗口中右键单击并选择Inspect Element,而不是Inspect Background Page,以查看前台控制台:
FileEntry {filesystem: DOMFileSystem, fullPath: "/TestFile.rtf", name: "TestFile.rtf", isDirectory: false, isFile: true…} foreground.js:4
注:
从最初的代码中可以看出,您使用了类似jQuery的框架来搜索页面中的DOM元素。Chrome应用程序可以很好地与jQuery配合使用,但您必须知道何时使用原始DOM节点对象,何时使用包装好的jQuery对象
具体来说,这条线
$('input').addEventListener('click', function() {
会给你带来麻烦的
将其替换为
document.querySelector('input').addEventListener('click'), function() {
将正确找到页面上的元素,并将单击处理程序附加到该元素。回滚编辑:文件系统API不可用于扩展Cool,我不知道。您使用的是jQuery吗?不,是纯javascript。我该如何在jquery中调用ChromeAPI?编辑:哦,$函数是我自己的,不是jquery。只是getelementbyid和queryselectorall的简写。Chrome应用程序可以与jQuery配合使用;它只是JavaScript。你会像称呼其他人一样称呼他们。但是,当您的代码包含$'input'时,看起来您是在使用jQuery查找页面中的元素。这实际上也是我正在做的。我从background.js打开index.html选项卡,其中index.js具有chooseEntry调用。我愿意相信问题在于加载脚本的方式,但函数在上下文中可用并成功执行。这意味着上下文是正确的。我没有使用jquery,那$function是我自己对getelementbyid的缩写。一个区别是我使用window.open而不是chrome.app.window.create,因为我希望它是一个选项卡而不是一个新窗口。我现在将尝试使用chrome.app.windowPS,我刚刚添加了每个文件的内容,就像您在回答中所做的那样。刚刚在金丝雀频道中尝试,结果相同。啊,等等,我在金丝雀中得到了一些东西,未经检查的runtime.lastError在运行文件系统时。ChooseSentry:调用页面无效。无法从后台页调用此函数。但它不是背景页面,而是index.html。知道发生了什么吗?听起来你还在后台页面加载处理程序,比如在清单的main.js中。检查背景页面,在“源”选项卡中,您应该能够看到正在使用的js文件。我尝试从应用程序中完全删除main.js并显示并重新加载扩展名,以便index.js是index.html加载的唯一文件。还是一样的错误。看一看,我现在没有使用任何$函数。在index.js之外没有任何内容。并且它没有加载到manifest中,只有background.js被加载。
window.addEventListener('load', function() {
document.getElementById('input').addEventListener('click', function() {
chrome.fileSystem.chooseEntry({type: 'openFile'}, function(readOnlyEntry) {
console.log(readOnlyEntry);
});
});
});
{
"manifest_version": 2,
"name": "Stack overflow question test app",
"version": "1",
"offline_enabled": true,
"app": {
"background": {
"persistent": true,
"scripts": [
"/js/background.js"
]
}
},
"permissions": [
"notifications",
"storage",
{"fileSystem": ["directory"]}
]
}
chrome.app.runtime.onLaunched.addListener(function() {
chrome.app.window.create("index.html");
});
<!DOCTYPE html>
<html>
<head>
<title>TEST</title>
<script src="js/foreground.js"></script>
</head>
<body>
<input id="input" />
</body>
</html>
window.addEventListener('load', function() {
document.getElementById('input').addEventListener('click', function() {
chrome.fileSystem.chooseEntry({type: 'openFile'}, function(readOnlyEntry) {
console.log(readOnlyEntry);
});
});
});
FileEntry {filesystem: DOMFileSystem, fullPath: "/TestFile.rtf", name: "TestFile.rtf", isDirectory: false, isFile: true…} foreground.js:4
$('input').addEventListener('click', function() {
document.querySelector('input').addEventListener('click'), function() {