Trust
Trust
  • 发布:2016-08-12 18:48
  • 更新:2022-04-01 14:51
  • 阅读:23076

【示例】mui.getJSONP()实现Web跨域

分类:MUI

问题描述

许多开发者使用mui.ajax()在浏览器中调试时,控制台总会出现这样的错误信息:
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
出现这种错误的原因在于浏览器的同源策略,使得本域脚本只能读写本域内的资源,而无法访问其它域的资源,造成了我们常说的“跨域”问题。

问题分析

Web跨域访问的实现

浅谈WEB跨域的实现(前端向)
Web应用跨域访问解决方案汇总
网上有许多关于跨域问题的解决方案,这里知识提供两篇文章供大家参考。

JSON和JSONP

提起跨域实现,其实最容易想到的就是JSONP。这种技术方案已经非常流行,网上也有大量的资料供我们学习和参考。
说说JSON和JSONP,也许你会豁然开朗
jsonp详解
JSONP 的工作原理是什么?
JSONP 教程

解决方案

mui.ajax()

查看源码我们会发现mui.ajax()会根据运行情景的不同,而创建不同的XMLHttpRequest。
扩展阅读mui.ajax()方法中的XMLHttpRequest

在5+默认的UIWebview中被允许调用window的XHR进行跨域访问。
并且5+提供的XHR也是可以进行跨域访问的。
如何判断Runtime是否支持5+ API

mui.getJSONP()

mui同样提供了JSONP的插件(mui.jsonp.js见附件)来实现Web跨域,方法为mui.getJSONP()。
该方法有三个参数:

  • url——请求发送的目标地址(String)
  • data——发送到服务器的业务数据(Object)
  • callback——请求回调函数(Function)

请求方式默认并始终是GET方式,因为JSONP实际是在客户端动态添加了个然后将url指向要请求的地址,script是没有同源策略的。

示例(后端为php)

php部分

<?php  
header('Content-type: application/json');  
//获取回调函数名  
$callbackName = $_GET["callback"];  
//json数据  
$json_data = '["customername1","customername2"]';  
//输出jsonp格式的数据  
echo $callbackName."(" . $json_data . ")";  
?>  

JS部分

需要引入mui.js以及mui.jsonp.js

var data = {  
    name: 'xiaoming',  
    code: '200'  
};  
mui.getJSONP('http://192.168.12.74/jsonp.php', data, function(data) {  
    console.log(data);  
});  

mui.getJSONP()方法传递给服务器的回调函数的请求参数名在callback的参数中。

源码

附上源码,测试的时候记得更换下IP地址。

9 关注 分享
lhyh 小曾 qjh w***@163.com 2***@qq.com 1***@qq.com MR不靠谱 1***@qq.com 谁是大英雄

要回复文章请先登录注册

2***@qq.com

2***@qq.com

本地ip127.0.0.1,请求服务器出错:

index.html:1 Access to XMLHttpRequest at 'http://124.221.32.243/api.php?name=xiaoming&code=200' from origin 'http://127.0.0.1' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
mui.js:3051
GET http://124.221.32.243/api.php?name=xiaoming&code=200 net::ERR_FAILED
2022-04-01 14:51
8***@qq.com

8***@qq.com

关于报“Uncaught TypeError: Cannot read property 'appendChild' of null”的解决方案:
1、引入的js/mui.jsonp.js 一定要放在body内,不要放在head里面。
2018-04-24 11:41
9***@qq.com

9***@qq.com

回复 l***@163.com :
解决了吗
2017-10-31 17:54
1***@qq.com

1***@qq.com

可以吗
2017-08-02 10:15
l***@163.com

l***@163.com

有人成功过吗?出来分享下,好急啊
2017-07-24 10:43
l***@163.com

l***@163.com

mui.getJSONP 总是报 Uncaught SyntaxError: Unexpected token :
2017-07-24 10:27
5***@qq.com

5***@qq.com

回复 x***@sohu.com :
我也是这样的错误,为什么啊
2017-05-20 11:23
6***@qq.com

6***@qq.com

mui.getJSONP()

后台收到两次请求啊,怎么处理
2017-05-09 10:39
m***@163.com

m***@163.com

直接用jQuery的跨域算了。。
2017-03-15 16:59
x***@sohu.com

x***@sohu.com

提示如下错误:
Web浏览器] "Uncaught TypeError: Cannot read property 'appendChild' of null" /D3Relation/js/mui.jsonp.js (25)
2017-03-01 18:16