本篇文章给大家分享的内容是JavaScript之跨域问题,有着一定的参考价值,有需要的朋友可以参考一下
1jsonp
一般接口使用jsonp跨域,使用jquery的ajax指定dataType为jsonp即可
$.ajax({ async : true, url : "https://api.douban.com/v2/book/search", type : "GET", dataType : "jsonp", // 返回的数据类型,设置为JSONP方式 jsonp : 'callback', //指定一个查询参数名称来覆盖默认的 jsonp 回调参数名 callback jsonpCallback: 'handleResponse', //设置回调函数名 data : { q : "javascript", count : 1 }, success: function(response, status, xhr){ console.log('状态为:' + status + ',状态是:' + xhr.statusText); console.log(response); } });
jsonp支持跨域的原理:JSONP实现跨域请求的原理简单的说,就是动态创建3f1c4e4b6b16bbbd69b2ee476dc4f83a标签,然后利用3f1c4e4b6b16bbbd69b2ee476dc4f83a的src 不受同源策略约束来跨域获取数据。
其实就是下面的代码的实现方式:js脚本返回callback(data),页面中定义一个callback函数
<script type="text/javascript"> function handleResponse(response){ console.log(response); } </script> <script type="text/javascript"> window.onload = function() { var oBtn = document.getElementById('btn'); oBtn.onclick = function() { var script = document.createElement("script"); script.src = "https://api.douban.com/v2/book/search?q=javascript&count=1&callback=handleResponse"; document.body.insertBefore(script, document.body.firstChild); }; }; </script>
2iframe + form 兼容IE浏览器,iframe的body内容是要用的数据
<iframe name='hidden_frame' id="hidden_frame" style='display:none'></iframe> <form id="fileform" method="post" enctype="multipart/form-data" target="hidden_frame"> <input type="file" name="fileUpload" /> </form> <button id="submitbtn">开始上传</button> <script type="text/javascript"> function callback(msg) { //回调函数 alert(msg); } </script> <script type="text/javascript"> $("#submitbtn").click(function() { var callbackurl = window.location.href.substring(0, window.location.href.lastIndexOf('/')) + "proxy.html"; //获取代理文件路径 $("#fileform").attr("action", "FileHandler.ashx?callbackurl=" + callbackurl); $("#fileform").submit(); }) </script>
3H5的postMessage()方法,兼容性没那么好
详细见https://www.cnblogs.com/dolphinX/p/3464056.html
上传图片代码,接口返回的数据就是postMessage的写法
<form action='http://bird.sns.iqiyi.com/group_photo/upload' method="post" target="imgFile" id="fileinfo" enctype="multipart/form-data"> <input type="file" id="imgFile" accept="image/gif, image/png" class="hide" onchange="getPhotoSize(this)" /> <input type="hidden" name="name" value="" /> <input type="hidden" name="hobby" value="" /> </form> <iframe
<script type="text/javascript"> $(document).ready(function() { $('#upload').click(function() { $("#imgFile")[0].click(); }); }); var queryToJson = function(url) { url = url.replace(/#.*/, ""); var query = url.substr(url.lastIndexOf('?') + 1); var params = query.split('&'); var result = {}; for (var i = 0; i < params.length; i++) { var t = params[i].split("="); if (!t[0]) continue; result[decodeURIComponent(t[0])] = decodeURIComponent(t[1] || ""); } return result; }; $('[name=name]').val(queryToJson(window.location.href).name); $('[name=hobby]').val(queryToJson(window.location.href).hobby); //判断照片大小 function getPhotoSize(obj) { photoExt = obj.value.substr(obj.value.lastIndexOf(".")).toLowerCase(); //只支持jpg,png if (photoExt != '.jpg' && photoExt != '.png') { showMsg("请上传正确的图片格式,如JPEG、PNG"); return false; } var fileSize = 0; fileSize = obj.files[0].size; fileSize = Math.round(fileSize / 1024); //单位为KB if (fileSize >= 10000) { showMsg("建议上传图片不超过10M"); return false; } //跳转到过渡页,请求上传接口,将接口返回插入结果页src $('#page2').addClass('hide'); $('#imgFile').addClass('hide'); $('#fileinfo').submit(); $('#loading').removeClass('hide'); getMsg(); } //获取返回数据 function getMsg() { window.addEventListener('message', function(e) { $('#loading').addClass('hide'); if (e.source != window.parent) return; if (e.data.code == 'A00000') { $('#imgSrc')[0].src = e.data.data.url; $('#msg').html(e.data.data.message); $('#page5').removeClass('hide'); } else { location.href = '/anotherTry.html'; } }, false); } //显示提示信息 function showMsg(msg) { var _this = this; $('#msgTip').html(msg); $('#msgTip').removeClass('hide'); window.setTimeout(function() { $('#msgTip').addClass('hide'); }, 3000); } //再试一次 function tryAgain() { $('#fileinfo').submit(); $('#page5').addClass('hide'); //看不到加载页面,页面闪 $('#loading').removeClass('hide'); getMsg(); } </script>
以上是JavaScript之跨域问题的详细内容。更多信息请关注PHP中文网其他相关文章!

JavaScript在现实世界中的应用包括前端和后端开发。1)通过构建TODO列表应用展示前端应用,涉及DOM操作和事件处理。2)通过Node.js和Express构建RESTfulAPI展示后端应用。

JavaScript在Web开发中的主要用途包括客户端交互、表单验证和异步通信。1)通过DOM操作实现动态内容更新和用户交互;2)在用户提交数据前进行客户端验证,提高用户体验;3)通过AJAX技术实现与服务器的无刷新通信。

理解JavaScript引擎内部工作原理对开发者重要,因为它能帮助编写更高效的代码并理解性能瓶颈和优化策略。1)引擎的工作流程包括解析、编译和执行三个阶段;2)执行过程中,引擎会进行动态优化,如内联缓存和隐藏类;3)最佳实践包括避免全局变量、优化循环、使用const和let,以及避免过度使用闭包。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

Python和JavaScript在社区、库和资源方面的对比各有优劣。1)Python社区友好,适合初学者,但前端开发资源不如JavaScript丰富。2)Python在数据科学和机器学习库方面强大,JavaScript则在前端开发库和框架上更胜一筹。3)两者的学习资源都丰富,但Python适合从官方文档开始,JavaScript则以MDNWebDocs为佳。选择应基于项目需求和个人兴趣。

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript在现实世界中的应用包括服务器端编程、移动应用开发和物联网控制:1.通过Node.js实现服务器端编程,适用于高并发请求处理。2.通过ReactNative进行移动应用开发,支持跨平台部署。3.通过Johnny-Five库用于物联网设备控制,适用于硬件交互。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Dreamweaver CS6
视觉化网页开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1
功能强大的PHP集成开发环境