尝试加载本地 JSON 文件以使用 JQuery 在 html 页面中显示数据

IT技术 javascript jquery html json
2021-03-11 01:40:34

嗨,我正在尝试使用 JQuery 加载本地 JSON 文件以显示数据,但出现了一些奇怪的错误。我可以知道如何解决这个问题。

<html>
 <head>
<script type="text/javascript" language="javascript" src="jquery-1.8.2.min.js"></script>        

<script type="text/javascript">
    $(document).ready(function(e) {
    $.getJSON( "priorities.json" , function( result ){
        alert(result.start.count);
    });
});
</script></head>
</html>

我只是提醒 JSON 数据的数量。我的 JSON 文件位于此 html 文件所在的同一目录中,JSON 字符串格式如下所示。

{
"start": {
    "count": "5",
    "title": "start",
    "priorities": [
        {
            "txt": "Work"
        },
        {
            "txt": "Time Sense"
        },
        {
            "txt": "Dicipline"
        },
        {
            "txt": "Confidence"
        },
        {
            "txt": "CrossFunctional"
        }
    ]
}
}

JSON 文件名优先级.json 和错误是

未定义未捕获的 Referenceerror 优先级

6个回答

由于安全问题(同源策略),如果没有用户交互,javascript 对本地文件的访问会受到限制

根据https://developer.mozilla.org/en-US/docs/Same-origin_policy_for_file:_URIs

只有当原始文件的父目录是目标文件的祖先目录时,文件才能读取另一个文件。

想象一下这样一种情况:来自网站的 javascript 试图在您不知道的情况下窃取您系统中任何位置的文件您必须将其部署到 Web 服务器。或者尝试使用脚本标签加载它。像这样:

<script type="text/javascript" language="javascript" src="jquery-1.8.2.min.js"></script>        
<script type="text/javascript" language="javascript" src="priorities.json"></script> 

<script type="text/javascript">
   $(document).ready(function(e) {
         alert(jsonObject.start.count);
   });
</script>

您的 priority.json 文件:

var jsonObject = {
"start": {
    "count": "5",
    "title": "start",
    "priorities": [
        {
            "txt": "Work"
        },
        {
            "txt": "Time Sense"
        },
        {
            "txt": "Dicipline"
        },
        {
            "txt": "Confidence"
        },
        {
            "txt": "CrossFunctional"
        }
    ]
}
}

或者在你的页面上声明一个回调函数并像 jsonp 技术一样包装它:

<script type="text/javascript" language="javascript" src="jquery-1.8.2.min.js">    </script> 
     <script type="text/javascript">
           $(document).ready(function(e) {

           });

           function jsonCallback(jsonObject){
               alert(jsonObject.start.count);
           }
        </script>

 <script type="text/javascript" language="javascript" src="priorities.json"></script> 

您的 priority.json 文件:

jsonCallback({
    "start": {
        "count": "5",
        "title": "start",
        "priorities": [
            {
                "txt": "Work"
            },
            {
                "txt": "Time Sense"
            },
            {
                "txt": "Dicipline"
            },
            {
                "txt": "Confidence"
            },
            {
                "txt": "CrossFunctional"
            }
        ]
    }
    })

使用脚本标签是一种与 JSONP 类似的技术,但这种方法不太灵活。我建议将其部署在 Web 服务器上。

通过用户交互,允许 javascript 访问文件。这就是File API的情况使用文件 api,javascript 可以访问用户<input type="file"/>桌面选择或从桌面拖放到浏览器的文件。

在这个“解决方案”priorities.json中不再是 JSON 文件,而是 JavaScript 文件。
2021-04-19 01:40:34
这是一个不错的小技巧
2021-04-23 01:40:34
@alper,我没有,但您可以轻松创建一个
2021-04-24 01:40:34
这不好,我目前正在尝试解决 CSP 问题,只是将 json 文件称为 javascript 文件没有任何好处):
2021-05-05 01:40:34
你有这个的 html 文件以及我可以尝试运行的地方吗?@Khanh TO
2021-05-16 01:40:34

您可以简单地在 HTML 中包含一个 Javascript 文件,该文件将您的 JSON 对象声明为变量。然后,您可以使用data.employees例如从全局 Javascript 范围访问您的 JSON 数据

索引.html:

<html>
<head>
</head>
<body>
  <script src="data.js"></script>
</body>
</html>

数据.js:

var data = {
  "start": {
    "count": "5",
    "title": "start",
    "priorities": [{
      "txt": "Work"
    }, {
      "txt": "Time Sense"
    }, {
      "txt": "Dicipline"
    }, {
      "txt": "Confidence"
    }, {
      "txt": "CrossFunctional"
    }]
  }
}
它返回空文件,我应该为 写绝对路径data.js,这也不起作用吗?@senornestor
2021-04-25 01:40:34
这也是一个 JavaScript 而不是 Json 解决方案!:(
2021-04-30 01:40:34
你知道有什么方法可以从 html 脚本中显示出来吗?不就是console.log(data)吗?
2021-05-02 01:40:34
是的,data.js 中的代码可从 HTML 文档全局获得,因此在 HTML 中元素中使用data将起作用。data.start.count<script>
2021-05-06 01:40:34
是的,对于离线数据测试,这是最好的!:) 我在阅读以上所有答案时想到了这一点:p
2021-05-08 01:40:34

正如 jQuery API 所说:“使用 GET HTTP 请求从服务器加载 JSON 编码的数据。”

http://api.jquery.com/jQuery.getJSON/

因此,您无法使用该功能加载本地文件。但是当您浏览网页时,您会发现在 javascript 中从文件系统加载文件真的很困难,如下面的帖子所述:

使用javascript访问本地文件

是的,它适用于 chrome,但我认为这更像是一个黑客而不是最终解决方案。
2021-04-24 01:40:34
实际上我用我的浏览器 - qtweb.net管理它我想这也是可行的Chrome浏览器(例如)如果您在运行它启用选项:stackoverflow.com/questions/4819060/...
2021-05-15 01:40:34

应用程序.js

$("button").click( function() {
 $.getJSON( "article.json", function(obj) {
  $.each(obj, function(key, value) {
         $("ul").append("<li>"+value.name+"'s age is : "+value.age+"</li>");
  });
 });
});

索引.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Tax Calulator</title>
    <script src="jquery-3.2.0.min.js" type="text/javascript"></script>
  </head>
  <body>
    <ul></ul>
    <button>Users</button>
<script type="text/javascript" src="app.js"></script>
  </body>
</html>

文章.json

{
"a": {
"name": "Abra",
"age": 125,
"company": "Dabra"
},
"b": {
"name": "Tudak tudak",
"age": 228,
"company": "Dhidak dhidak"
}
}

服务器.js

var http = require('http');
var fs = require('fs');

function onRequest(request,response){
  if(request.method == 'GET' && request.url == '/') {
          response.writeHead(200,{"Content-Type":"text/html"});
          fs.createReadStream("./index.html").pipe(response);
  } else if(request.method == 'GET' && request.url == '/jquery-3.2.0.min.js') {
          response.writeHead(200,{"Content-Type":"text/javascript"});
          fs.createReadStream("./jquery-3.2.0.min.js").pipe(response);
  } else if(request.method == 'GET' && request.url == '/app.js') {
          response.writeHead(200,{"Content-Type":"text/javascript"});
          fs.createReadStream("./app.js").pipe(response);
  }
  else if(request.method == 'GET' && request.url == '/article.json') {
          response.writeHead(200,{"Content-Type":"text/json"});
          fs.createReadStream("./article.json").pipe(response);
  }
}

http.createServer(onRequest).listen(2341);
console.log("Server is running ....");

Server.js 将在您的本地运行一个简单的节点 http 服务器来处理数据。

注意不要忘记在文件夹结构中添加一个 dd jQuery 库,并相应地在server.jsindex.html 中更改版本号

这是我正在运行的一个https://github.com/surya4/jquery-json

我一直在本地机器上复制的 d3.js 可视化示例……它们导入了 .JSON 数据……在 Mozilla Firefox 浏览器上一切正常;在 Chrome 上,我收到了跨域限制错误。很奇怪,导入本地 javascript 文件没有问题,但是尝试加载 JSON 并且浏览器变得紧张。至少应该有一些设置让用户超越它,弹出窗口被阻止的方式,但我看到了一个指示和一个解除阻止它们的选择......没有理由对此事如此奥威尔式。用户不应被视为太天真而无法知道什么对他们最有利。

因此,如果您在本地工作,我建议您使用 Firefox 浏览器。我希望人们不要为此惊慌失措并开始轰炸 Mozilla 以强制执行本地文件的跨域限制