ie下$.getJSON出现问题的解决方法

yizhihongxing

让我来详细讲解“ie下$.getJSON出现问题的解决方法”的完整攻略。

问题描述

当我们在Internet Explorer(IE)浏览器中使用$.getJSON方法来获取数据时,会遇到跨域请求失败的问题,具体表现为:
- 控制台报错:Access is denied.
- 监控工具中看不到跨域请求。

解决方法

方法一:使用代理

使用代理的原理是先创建一个后端接口,然后将前端的请求通过代理服务器转发到后端接口中去。

下面是一段使用Node.js创建代理的示例代码:

var express = require("express");
var http = require("http");
var request = require("request");
var app = express();
app.use(express.static(__dirname + "/public"));
app.all("*", function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Content-Type");
  res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
  next();
});
app.get("/request", function(req, res) {
  var url = req.query.url;
  request(url, function(error, response, body) {
    if (!error && response.statusCode == 200) {
      res.send(body);
    }
  });
});
var server = http.createServer(app).listen(3000, function() {
  console.log("Server started on port 3000.");
});

上面这段代码中,使用express创建了一个Node.js的服务,并且创建了一个对/request的GET请求响应,将请求中的url参数进行转发,最后将服务启动在3000端口上。

在前端页面中,我们可以将数据获取url更改为http://localhost:3000/request?url=你的数据url,这样就可以避免IE跨域问题了。

方法二:使用jQuery.ajax()方法

在jQuery中,使用$.getJSON方法时数据请求会自动拼装为JSONP的方式,但是IE浏览器仅支持JSON方式的请求,这就导致了IE下无法获取数据的问题。我们可以使用jQuery.ajax()方法来替代$.getJSON,手动指定请求的数据类型。

下面是一段使用jQuery.ajax()的示例代码:

$.ajax({
  url: "你的数据url",
  dataType: "json",
  xhrFields: {
    withCredentials: true
  },
  crossDomain: true,
  success: function(data) {
    console.log(data);
  },
  error: function(xhr, status, error) {
    console.log(error);
  }
});

上面这段代码中,通过设置dataType将请求方式设置为JSON,并且设置了withCredentialscrossDomain来解决跨域问题。通过这种方式可以完美解决IE下$.getJSON无法获取数据的问题。

示例说明

示例一:使用代理获取数据

假设我们需要获取http://example.com/data这个地址下的数据,但是由于跨域问题导致IE下无法成功获取数据。

使用代理的方式,我们可以先在自己的服务上创建一个路由,接收数据请求并将请求转发到http://example.com/data,然后再将数据响应回来。示例代码如下所示:

// 服务端代码
const request = require('request');
const express = require('express');
const app = express();
const port = 3000;

app.use('/', express.static('./public'));

app.get('/getExampleData', (req, res) => {
  const url = 'http://example.com/data';
  request(url, (err, response, body) => {
    if (!err && response.statusCode === 200) {
      res.send(body);
    } else {
      console.log('err', err);
      console.log('statusCode', response && response.statusCode);
      res.send('err');
    }
  });
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));
<!-- 客户端代码 -->
<button id="getDataBtn">获取数据</button>

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
  $('#getDataBtn').click(() => {
    $.getJSON('http://example.com/data', (jsonData) => {
      console.log(jsonData);
    });
  });
</script>

当我们运行客户端代码时,控制台会输出以下错误信息:

Access is denied. 堆栈跟踪: return window[ "eval" ].call( window, data ); (anonymous function) @jquery-3.5.1.min.js:2 (anonymous function) @jquery-3.5.1.min.js:2 xhr.onreadystatechange @jquery-3.5.1.min.js:2

这是因为IE浏览器不支持跨域请求。

我们可以修改客户端代码,使用代理来获取数据:

<button id="getDataBtn">获取数据</button>

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
  $('#getDataBtn').click(() => {
    $.getJSON('http://localhost:3000/getExampleData', (jsonData) => {
      console.log(jsonData);
    });
  });
</script>

这里将请求的url改为我们自己的服务器地址,然后通过我们的服务器转发请求到http://example.com/data上,并将请求到的数据转发回来。

示例二:使用jQuery.ajax()获取数据

我们可以使用jQuery.ajax()方法对之前示例的代码进行改写。代码如下所示:

<button id="getDataBtn">获取数据</button>

<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
  $('#getDataBtn').click(() => {
    $.ajax({
      url: 'http://example.com/data',
      dataType: 'json',
      xhrFields: {
        withCredentials: true
      },
      crossDomain: true,
      success: (jsonData) => {
        console.log(jsonData);
      },
      error: () => {
        console.log('error');
      }
    });
  });
</script>

这里用$.ajax()代替$.getJSON(),并将请求方式设置为JSON,同时设置xhrFieldscrossDomain来解决跨域问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:ie下$.getJSON出现问题的解决方法 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 使用javascript解析二维码的三种方式

    使用 JavaScript 解析二维码的三种方式 二维码已经成为我们生活中不可缺少的一部分,我们可以通过扫描二维码获取网址、商品信息等内容。而 JavaScript 是一种非常方便的语言,可以帮助我们解析二维码。下面介绍三种使用 JavaScript 解析二维码的方式。 1. 使用ZXing Library解析二维码 ZXing 是 Google 开源的一个…

    JavaScript 2023年5月19日
    00
  • js实现计时器秒表功能

    如果要使用 JavaScript 实现计时器秒表功能,需要遵循以下步骤: HTML 布局 首先,在 HTML 中创建一个容器用于显示计时器。这可以通过使用<div>元素创建。 <div id="timer">00:00:00</div> CSS 样式 为计时器设置样式,例如对齐方式、字体大小等。以下是一…

    JavaScript 2023年5月27日
    00
  • input禁止键盘及中文输入,但可以点击

    要实现input禁止键盘及中文输入,但可以点击的效果,需要使用HTML标签和JavaScript语言。下面是具体的实现步骤: HTML标签部分 在HTML标签中,需要给input标签添加readonly和onfocus两个属性。readonly属性可以让input禁止键盘输入,onfocus属性可以在输入框被点击时触发相应的JavaScript函数。具体代码…

    JavaScript 2023年6月11日
    00
  • IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理

    针对IE6/IE7中JavaScript json提示缺少标识符、字符串或数字的问题,可以采取以下处理方法: 方法一:手动添加JSON对象 对于IE6/IE7等低版本浏览器来说,没有原生的JSON对象,需要手动添加JSON对象。我们可以使用下面的代码来添加JSON对象: if (!window.JSON) { window.JSON = { parse: f…

    JavaScript 2023年5月27日
    00
  • JS 验证码功能的三种实现方式

    下面为您讲解JS验证码功能的三种实现方式的完整攻略。 方式一:纯前端方法生成 实现过程 在HTML页面中添加验证码输入框和一个生成验证码的按钮; JS随机生成一个包含数字和字母的随机字符串并将其绑定到验证码文本框上; 当用户输入验证码并提交时,将输入的验证码与生成的验证码进行比较,判断验证码是否正确。 代码示例 HTML部分: <!DOCTYPE ht…

    JavaScript 2023年6月10日
    00
  • JS身份证信息验证正则表达式

    下面是JS身份证信息验证正则表达式的完整攻略: 什么是身份证号码 身份证号码是我国公民的唯一身份标识,由18位数字和字母组成,其中最后一位可能是数字或字母X,具有以下含义: 前6位是地址码,表示身份证持有人的行政区划代码; 7到14位是出生日期码,表示身份证持有人的出生年月日; 15到17位称为顺序码,表示在同一地址码区域内,对同年、同月、同日出生的人员编定…

    JavaScript 2023年5月19日
    00
  • JS获取IP、MAC和主机名的五种方法

    当网站需要获取客户端设备的IP、MAC地址或主机名时,我们可以使用JavaScript来实现。接下来,我们将会介绍五种获取这些信息的方法。 获取IP地址的方法 使用XMLHttpRequest对象向外部API发起请求,从响应中获取IP地址信息。 function getIP() { const xhr = new XMLHttpRequest(); xhr.…

    JavaScript 2023年5月28日
    00
  • JS JSOP跨域请求实例详解

    JS JSOP跨域请求实例详解 什么是跨域请求? 跨域请求是指在一个来源(即域名、端口、协议都相同)的网页中,不能发起对另一个来源的网页的请求。这是由浏览器的同源策略所限制的。 当在一个网页中通过 AJAX、Fetch、WebSocket 等方式向另一个域名(或主机名、端口号、协议)发起请求时,由于安全原因,浏览器会拦截这些请求,而这种被拒绝的请求就称为“跨…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部