动态加载 JSON 文件在 JavaFX 中不起作用
Loading JSON file dynamically does not work in JavaFX
我有一个将数据保存到本地文件的 JavaFX 应用程序 data.json,例如,它看起来像
data = '[{"name":"Jack","pet":"turtle"},{"name":"John","pet":"black mamba"}]'
。应用程序会定期向该文件添加更多条目。
在我加载到该应用程序的 html 文件中,我需要显示所有这些信息。我有一个加载该文件的脚本标签:
<script type="text/javascript" src="../Data/data.json" id="dataSourceScript"></script>
然后在 js 代码中我有 var mydata = JSON.parse(data)
,它允许我将 JSON 加载到 mydata
变量中,如 here.
所述
因为我需要在添加新条目时更新页面内容,所以我有一个函数,我每隔几秒调用一次 setInterval()
来执行此操作。为了获得更新的文件信息,我删除了旧的 <script>
标签并添加了一个新标签(完全相同),但这意味着 data
现在有了更新的信息:
var oldScript = document.getElementById("dataSourceScript")
if(oldScript)
oldScript.remove()
var newScript = document.createElement("script")
newScript.setAttribute("id", "dataSourceScript")
newScript.setAttribute("src", "../Data/data.json")
document.body.appendChild(newScript)
var mydata = JSON.parse(data)
//then I just add the new entry to DOM, if there is a new entry
一切都很好。如果我在浏览器中打开我的 html 文件,然后向该文件添加一个新条目,几秒钟后页面就会更新并显示新条目。但是,出于某种原因,它在我的 JavaFX 应用程序中不起作用。它只从初始 <script>
标记加载文件一次,但如果我更改 data.json 文件,则没有任何反应。我必须关闭应用程序并重新打开它才能在页面上显示新信息。
(我没有找到任何其他读取文件的方法。FileReader 在文件更新时停止读取,这违背了目的;fetch() 和 XMLHttpRequest() 都被 CORS 策略阻止; 我无法创建服务器来请求文件或安装 Node 或其他任何东西,我需要纯 html+js 来成为 UI)
多亏了评论,谢谢大家。
是的,我从脚本标签加载的文件被缓存了,没有被更新。一个解决方案很简单,我只需要创建一个变量计数器并在每次创建它时将它作为一个版本添加到新脚本中,所以它被认为是一个新的
var version = 0
...
var oldScript = document.getElementById("dataSourceScript")
if(oldScript)
oldScript.remove()
var newScript = document.createElement("script")
newScript.setAttribute("id", "dataSourceScript?version=" + version++)
newScript.setAttribute("src", "../Data/data.json")
document.body.appendChild(newScript)
var mydata = JSON.parse(data)
//then I just add the new entry to DOM, if there is a new entry
我有一个将数据保存到本地文件的 JavaFX 应用程序 data.json,例如,它看起来像
data = '[{"name":"Jack","pet":"turtle"},{"name":"John","pet":"black mamba"}]'
。应用程序会定期向该文件添加更多条目。
在我加载到该应用程序的 html 文件中,我需要显示所有这些信息。我有一个加载该文件的脚本标签:
<script type="text/javascript" src="../Data/data.json" id="dataSourceScript"></script>
然后在 js 代码中我有 var mydata = JSON.parse(data)
,它允许我将 JSON 加载到 mydata
变量中,如 here.
因为我需要在添加新条目时更新页面内容,所以我有一个函数,我每隔几秒调用一次 setInterval()
来执行此操作。为了获得更新的文件信息,我删除了旧的 <script>
标签并添加了一个新标签(完全相同),但这意味着 data
现在有了更新的信息:
var oldScript = document.getElementById("dataSourceScript")
if(oldScript)
oldScript.remove()
var newScript = document.createElement("script")
newScript.setAttribute("id", "dataSourceScript")
newScript.setAttribute("src", "../Data/data.json")
document.body.appendChild(newScript)
var mydata = JSON.parse(data)
//then I just add the new entry to DOM, if there is a new entry
一切都很好。如果我在浏览器中打开我的 html 文件,然后向该文件添加一个新条目,几秒钟后页面就会更新并显示新条目。但是,出于某种原因,它在我的 JavaFX 应用程序中不起作用。它只从初始 <script>
标记加载文件一次,但如果我更改 data.json 文件,则没有任何反应。我必须关闭应用程序并重新打开它才能在页面上显示新信息。
(我没有找到任何其他读取文件的方法。FileReader 在文件更新时停止读取,这违背了目的;fetch() 和 XMLHttpRequest() 都被 CORS 策略阻止; 我无法创建服务器来请求文件或安装 Node 或其他任何东西,我需要纯 html+js 来成为 UI)
多亏了评论,谢谢大家。
是的,我从脚本标签加载的文件被缓存了,没有被更新。一个解决方案很简单,我只需要创建一个变量计数器并在每次创建它时将它作为一个版本添加到新脚本中,所以它被认为是一个新的
var version = 0
...
var oldScript = document.getElementById("dataSourceScript")
if(oldScript)
oldScript.remove()
var newScript = document.createElement("script")
newScript.setAttribute("id", "dataSourceScript?version=" + version++)
newScript.setAttribute("src", "../Data/data.json")
document.body.appendChild(newScript)
var mydata = JSON.parse(data)
//then I just add the new entry to DOM, if there is a new entry