Echarts使用本地JSON文件加载不出图表的解决方法以及Jquery访问本地JSON文件跨域的解决方法

2023-05-16

前言

  最近需要做一个大屏展示,需要用原生html5+css+js来写,所以去学了一下echarts的使用。在使用的过程中难免碰到许多BUG,百度那是必不可少的,可是这些人写的牛头不对马嘴,简直是标题党一大堆,令我作呕,现将我认为比较重要的两个问题记录如下。

一、Echarts使用本地JSON文件加载不出图形的解决方法

  我们在使用echarts绘制图表的时候,不可能是将数据写死在代码中的,没有后台的情况下一般是将数据封装在JSON中,代码中读取JSON文件来获取数据。

  我使用的是jquerygetJSON函数来读取本地json文件,示例代码如下:

<script src="../js/jquery-3.6.4.min.js"></script>
<script>
	$.getJSON('../json/test/test.json',function (data) {
	        console.log(data)
	    })
</script>

  数据是能正常获取到的:
在这里插入图片描述

  我们这时候把数据丢进echarts中,发现图表显示不出来,但是如果我们把数据写在一个JS变量中,图表就能正常显示了,此处不做演示了。

  原因就是jquery加载本地json文件时是异步加载的,我们需要把echarts的代码放在回调函数中,才能正常加载图表,代码如下:

var myChart = echarts.init(document.querySelector('.pie .chart'));

    //因为这里加载json数据是异步加载的,所有代码都得放进回调函数中,否则图表显示不出来
    $.getJSON('../json/阳朔县/阳朔县碳储量.json', function (data) {
        var option = {
            tooltip: {
                trigger: 'item',
                formatter: '{a} <br/>{b} : {c} ({d}%)'
            },
            legend: {
                //距离底部为10%
                bottom: '0%',
                //小图标的宽度和高度
                itemWidth: 10,
                itemHeight: 10,
                // 修改图例组件的文字为 12px
                textStyle: {
                    color: "rgba(255,255,255,.5)",
                    fontSize: "12"
                }
            },
            series: [
                {
                    color: ['#5EA6FE', '#45FBF7', '#48FF58', '#EAE809', '#FF7E3F', '#FF4746', '#E177F9', '#4E6BFF', '#ffffff'],
                    name: data.name,
                    type: 'pie',
                    // 设置饼形图在容器中的位置,水平和垂直
                    center: ["50%", "34%"],
                    //  修改内圆半径和外圆半径为  百分比是相对于容器宽度来说的
                    radius: ['35%', '50%'],
                    //图形上的文字设置
                    label: {
                        color: '#fff',
                        fontSize: 12,
                    },
                    //连接文字和图形上的线是否显示
                    //引导线调整
                    labelLine: {
                        show: true,
                    },
                    data: data.data
                }
            ]
        };
        myChart.setOption(option);
    });

    //4、让图表跟随屏幕自适应
    window.addEventListener("resize", function () {
        myChart.resize();
    });

  此时就能正常显示图表了

二、Jquery访问本地JSON文件跨域的解决方法

2.1 用webstorm

  我们可以去下载一个webstorm,直接用该软件的快捷方式打开html文件,也不会报跨域问题:
在这里插入图片描述

2.2 其他

  比如用vscode、hbuilder、修改浏览器配置等等,网上都能找得到对应的办法,这里不做详细说明。这类解决方法的缺点就是,开发人员能访问了,但是用户访问不了,总不能让用户去下载这几个开发软件吧?所以这类办法只能解决开发端的跨域问题,下面介绍几个通用解决方案。

2.3 用script标签解决

  这里首先给出第一种方法,可以直接去看这位大佬的文章:https://blog.csdn.net/AiHuanhuan110/article/details/89475333?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-89475333-blog-122899037.235%5Ev35%5Epc_relevant_increate_t0_download_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-3-89475333-blog-122899037.235%5Ev35%5Epc_relevant_increate_t0_download_v2&utm_relevant_index=6

  这里提个醒,用这种方法的话,json格式会报错,但是不会影响代码正常运行,用就完事了!!

  还有就是因为是用script标签的缘故,所以代码只能写在html中,想写在js文件中是不行的。

2.4 将json文件放在tomcat中

  首先到tomcat官网下载tomcat并解压:
在这里插入图片描述

  得到一个文件夹:
在这里插入图片描述

  我们新建一个站点,打开webapps目录,将ROOT复制一份,命名随意,我这里就起test吧,如图:
在这里插入图片描述

  将里面的文件除了WEB-INF之外,全部删除,只留下WEB-INF,如图:
在这里插入图片描述

  我们对文件夹中的web.xml进行配置,将下面的语句加到文件中:

<filter>
  <filter-name>CorsFilter</filter-name>
  <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
  <init-param>
    <param-name>cors.allowed.origins</param-name>
    <param-value>*</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.methods</param-name>
    <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value>
  </init-param>
  <init-param>
    <param-name>cors.allowed.headers</param-name>
    <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value>
  </init-param>
  <init-param>
    <param-name>cors.exposed.headers</param-name>
    <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value>
  </init-param>
  <init-param>
    <param-name>cors.preflight.maxage</param-name>
    <param-value>1000</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>CorsFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

  如图,反正就是丢在web-app里面,格式我就不调了:
在这里插入图片描述

  跨域配置好之后,我们直接把json文件丢在新建的站点文件夹中,如图:
在这里插入图片描述

  双击bin中的startup.bat启动服务器,访问默认端口8080即可访问到服务器,后面加上站点文件夹名称即可访问到站点文件夹,根据自己的目录结构来访问具体的json文件,如果在本机上就是localhost:8080/test/json/xxx.json

(注意:电脑上需要有java环境并且配置了环境变量才能启动tomcat,否则会闪退,具体操作自行百度)

在这里插入图片描述

  如果是在服务器上,就把localhost换成服务器的IP地址,想修改端口的话,就在conf目录下的server.xml中修改,修改之后需要重新启动:
在这里插入图片描述

  把jquery中的json文件地址换成服务器中的地址即可解决跨域问题!!!

  不用tomcat,用其他的服务器比如nginx、apache也行,看自己的需要自己选择!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Echarts使用本地JSON文件加载不出图表的解决方法以及Jquery访问本地JSON文件跨域的解决方法 的相关文章

  • jQuery / Ajax:如何循环遍历数组作为 Ajax 成功函数的一部分

    我有一个阿贾克斯调用返回一个数组并需要对该数组中的每个值执行某些操作 到目前为止 我有以下内容 但这会返回以下错误 Uncaught TypeError Cannot use in operator to search for length
  • 如何取消 AjaxForm 上的提交

    我正在使用 jQuery 插件 ajax 形式 我尝试实现这样的东西 MyFormID ajaxForm dataType json resetForm true beforeSubmit function validateData ret
  • 将 JSON 参数从 java 发布到 sinatra 服务

    我有一个 Android 应用程序发布到我的 sinatra 服务 早些时候 我无法读取 sinatra 服务上的参数 但是 在我将内容类型设置为 x www form urlencoded 之后 我能够看到参数 但不完全是我想要的 我在
  • 弹出窗口的动态高度取决于内容,可能吗?

    是否有可能获得一个宽度始终为 400px 的弹出窗口 但根据弹出窗口中的内容动态高度 我已经看到了这个 但不知道如何将其应用到弹出窗口 调整 iframe 的宽度高度以适应其中的内容 https stackoverflow com ques
  • JQuery 删除和内存泄漏

    我正在开发一个游戏 我看到了很多内存消耗 我使用jquery animate 动画完成后 我 remove 元素 我的问题是 从 dom 树中删除一个元素后 对象还存在记忆中吗 Javascript 是一种垃圾收集语言 这意味着当没有代码保
  • 如何在jqplot中显示饼图之外的标签?

    Jqplot 有如下图表 jqplot 图表 http www jqplot com tests pie donut charts php 我的问题是如何在 a 之外显示标签jqplot chart像下面这样high chart 高图表可以
  • Jquery:将链接标记为已访问而不打开它们?

    我无意仅仅更改链接 我听说这是不可能的 但如果不是 我很想知道如何更改 如果需要的话 我可以将其添加到浏览器历史记录中 我想遍历所有 a 位于页面上并将其状态更改为已访问 例如 a each function mark as visited
  • jquery select 如果 option.value 等于某个值,则标记为选中

    我有一些关于 jquery 选择的问题 就我而言 如果option value等于某物 标记 aselected为了它 在线代码在这里 http jsfiddle net WnEfJ 再次重复代码 它引起了Uncaught TypeErro
  • 使用 JavaScript 在日期中添加小时和分钟

    我正在根据世界各地的时区构建会议日历 我的问题是如何在 JavaScript 中从用户选择的日期中添加或减去时区 例如 在选择表单上 用户将从表单中选择日期 然后我将获取结果并转换为日期 如下所示 var ldSelectDate new
  • 下划线反跳与参数

    假设我有这个事件处理程序 var mousewheel function e blah 但是 我想消除它 所以我这样做 它按预期工作 var mousewheelDebounced debounce mousewheel 500 docum
  • 键绑定 - 鼠标中键与 Sublime Text 2

    有谁知道是否可以将鼠标中键绑定到 Sublime Text 2 中的操作 我知道可以进行一些鼠标交互 因为您可以使用后退和前进按钮 基本上 我将使用此按钮通过 sFTP 插件上传文件 这样我需要按下的按钮数量就会从 3 个减少到 1 个 目
  • 如何在ASP.NET Webform中使用Jquery表单插件?

    我遇到了这个插件 http malsup com jquery form getting started http malsup com jquery form getting started 我想知道如何在 ASP NET WebForm
  • 如何使用 JavaScript 中的值填充下拉列表?

    我在 Tridion CMS 扩展中的功能区工具栏按钮中添加了一个按钮 单击该按钮后 将显示一个弹出页面 其中包含两个下拉菜单 通过更改第一个下拉控件中的值 我应该填充第二个下拉控件的值 就我而言 我正在使用ASP drop down li
  • jquery 验证错误位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我验证所有文件 但我想要的是在输入文本行中显示验证消息警报 例如在电子邮件输入中 请填写电子邮件地址 但现在它出现在所有字段下 在我的html中
  • jQuery,REAL:不是等价的运算符?

    此代码行选择任何类名不是 id 和 quantity 的 div 内的所有子输入 div item gt div not id quantity gt input live keydown function event 执行相反操作的代码行
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • 使用 json_encode() 函数在 PHP 数组中生成 JSON 键值对

    我正在尝试以特定语法获取 JSON 输出 这是我的代码 ss array 1 jpg 2 jpg dates array eu gt 59 99 us gt 39 99 array1 array name gt game1 publishe
  • Jquery 中的动态滚动位置

    请帮助我解决以下情况 我有 3 个页面 当滚动到达第二页时 用户滚动页面 它必须找到特定的 ID 然后触发一个函数 一旦第三页开始 另一个函数就会触发 根据要求我不应该使用任何插件
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 显示覆盖以覆盖整个页面

    我有一个正在加载的网络应用程序iframe 我需要显示一个覆盖 div 来覆盖整个页面 问题是叠加层当前仅显示在iframe区域而不覆盖整个页面 我们的应用程序 子应用程序 是加载的一组应用程序的一部分iframe 你可以做这样的事情 di

随机推荐