Javascript Chrome应用程序,文件系统API:ChooseSentry方法不起作用

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设置也不是问题。问题似乎是我的代码,但我在这里迷路了 编辑:我添加了每个文件

编辑:找到错误,但无法解决,请参见下文

manifest.json background.js index.html 调用该方法和回调,但在执行回调时,文件选择对话框从未出现,readOnlyEntry未定义。开发工具上没有错误,我在35.0.1916.153 m上

我尝试过文件系统的清单声明的不同变体,但由于在脚本执行过程中没有定义函数,清单不太可能是问题所在

当我使用API的扩展时,应用程序可以工作,所以chrome设置也不是问题。问题似乎是我的代码,但我在这里迷路了

编辑:我添加了每个文件的内容

编辑2:发现错误,现在如何解决? 我在金丝雀中试过,发现错误是通过chrome.runtime.lastError显示的,而不是普通的控制台。这就是我得到的错误

无效的呼叫页。无法从后台页调用此函数


但是这不是在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() {