使用flash解决js跨域问题源代码

  • Q8_758632
    了解作者
  • 13.8KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-06-03 20:19
    上传日期
当需要无刷新跨域提交时,针对目前的浏览器,是无法解决的. 如果使用服务器边的proxy方式,就太浪费资源了.当一个请求会很费时时,就更加浪费,所以,proxy无必要时,是不会使用的. 还有使用动态加载js回调的方式,但是这个方式有一个问题,如果请求js页面无法控制或是需要get提交的数据比较大时,也无法解决. ajax post又不可以跨域, 目前可以比较好的解决方案是使用flash,但是它有二个不足,一需要flash插件,如果那位不想安装它,那么就无法使用了.如某些手机上,还有flash提交前提是被请求页面需要授权才能使用. 在这提供一个自己写的,自动加载swf与仿jq的ajax使用方式 源代码中有 js/as/fla/swf,所以,可以完全的使用代码 如果像discuz这样的进行限制时,可以把swf放到discuz这边,再在js中把swf定向到discuz这个swf即可,然后不用变
fajax.rar
  • fajax
  • fajax.fla
    31KB
  • fajax.swf
    3KB
  • expressInstall.swf
    727B
  • fajax.js
    8.4KB
  • fajax.as
    6KB
内容介绍
/* 使用注意: 1. 被请求服务器必须在根目录存在crossdomain.xml文件,有关此文件作用/语法请搜索 2. 必须手动加载swfobject.js和jquery.js 3. 已经用队列方式解决swf没返回数据前被重载,swf加载前开始请求 4. 使用方法 _.命名空间({见代码中 defaultOps 属性}); 5. 可以在加载本js前设置变量 _fajaxNameSpace = 'fajax2'; 来临时改变命名空间,在同一个页面需要加载多个swf时非常有用. 6. 请在body标签之内加载本js,因为要动态写入div,最好在body标签紧跟处写入,防止导致不平衡dom树,重新解析; 7. 在加载js前旋转变量 _fajaxSwfUrl = 'swf url 地址'; 即可加载临时swf 8. 在swf中添加了自定义超时事件进行扫尾工作,防止僵尸请求线程出现 9. 请不要重复加载jquery,否则本插件将会被冲掉而无法使用 */ ('object' != typeof _) && ('function' != typeof _) && (_ = {});//创建我的主命名空间 ( _ ) ,不使用jquery的,因为它会在第二次加载时,重载了jquery命名空间,导致本插件丢失了. (('function' == typeof jQuery) || (alert('fajax需要先加载jquery.js库'), 0)) && ( ('object' == typeof swfobject) || (alert('fajax需要先加载 swfobject.js库'), 0) ) && (function(nameSpace, swfUrl, $) { if ('string' == typeof _fajaxNameSpace) {//临时改变本命名 nameSpace = _fajaxNameSpace; _fajaxNameSpace = null; delete _fajaxNameSpace; } if ('string' == typeof _fajaxSwfUrl) {//临时改变swfurl swfUrl = _fajaxSwfUrl; _fajaxSwfUrl = null; delete _fajaxSwfUrl; } var error = function (txt) { setTimeout(function() {//不清楚什么原因导致有时不能直接执行,必须得定时 throw new Error(txt); }, 100); } if (!window._ || ('function' == typeof _[nameSpace]) ) return error('_.' + nameSpace + '命名空间已存在,不再重复加载'); var flashTip = '未能正常加载flash控件(用于不刷新页面跟服务器交互):' + '1. 可能是你的浏览器禁用了flash插件,解决方法是启用flash插件;' + '2. 可能是你未安装flash插件,解决方法是请点击本链接进入官网引导安装;' + '3. 可能flash插件损坏了,解决方法是制卸载后重新安装;' + '4. 如果需要我们帮助,你可以在论坛对应版块发贴或是联系我们;'; //不允许隐藏swf,在ie下, //发现一个问题就是,动态加载css文件时,本swf会被重载,可以使用定时询问swf本queuei是否存在,不存在时,重新请求 var swfBox = '<a id="qidizi_' + nameSpace + 'Box" href="http://www.adobe.com/go/getflashplayer" title="' + flashTip + '" ' + ' style="display:block;position:absolute;top:0px;left:0px;" rel='nofollow' onclick='return false;'>' + '<img src="http://icon.chinahrd.net/image/get_flash_player.gif" alt="' + flashTip + '" />' + '</a>'; $.isReady ? $('body').html(swfBox) : document.write(swfBox); var swfer = null; var none = function(){}; var queue = {start:1, end:0};//队列 var swfIsReady = function() { var _swf = $('#qidizi_' + nameSpace).get(0); for (var startI = queue.start; startI <= queue.end; startI++) {//发送所有加载前的队列 _swf.request(queue[startI]); } return swfer = _swf;//防止在处理过程中出现新请求导致处理复杂化 }; var funcs = { run:function (ops) { var defaultOps = { post:1 //post提交 ,cache:0 //flash是否缓存 //,url:''//提交地址 //,header:{}//发送报头 //,data:{}//发送数据 //,ok:function(text){}//成功返回回调 //,fail:function (text, type) {}//失败回调 //,open:function(text) {} //开始下载事件 //,progress:function(text) {} //下载进度事件 //,httpStatus:function(text) {} //状态变化事件 //,timeOut:funciton(text){} //超时事件 };//默认设置 if (!/^https?\:\/\//i.test(ops.url)) return alert('不允许请求如下格式URL:\n' + ops.url + '\n fajax必须是http(s)协议的合法url'); ops.url = ops.url.replace(/#.*$/, '');//移除锚点 if (!/^https?\:\/\/.*\//i.test(ops.url)) ops.url += '/';//必须保证域名后面有/ if (!ops.cache) {//是否不允许缓存 ops.url += (ops.url.indexOf('?') > -1 ? '&' : '?') + '_rnd=' + new Date().getTime(); } if ( ('object' != typeof ops.data) || $.isEmptyObject(ops.data)) ops.data = ''; else ops.data = '&' + $.param(ops.data);//前面加&防止flash直接的url + data而不自动检测前面是否有& $.extend(defaultOps, ops); defaultOps.index = ++queue.end; queue[defaultOps.index] = defaultOps;//记录回调 swfer && swfer.request(defaultOps);//已经加载,立刻开始 } ,swfCall:function(asObj) {//成功返回 if (!asObj) return; asObj.data && ( asObj.data = asObj.data.replace(/%22/g, "\"") .replace(/%5c/g, "\\") .replace(/%26/g, "&") .replace(/%25/g, "%") ); switch (asObj.name) { case 'open': //load 后 (queue[asObj.index].open || none)(asObj.data); return; break; case 'progress': //load 后 (queue[asObj.index].progress || none)(asObj.data); return; break; case 'httpStatus': //load 后 (queue[asObj.index].httpStatus || none)(asObj.data); return; break; case 'swfRequestOk'://调用swf的request成功 typeof swfRequestOk == 'function' ? swfRequestOk(asObj) : none(asObj); return; break; case 'swfIsReady'://swf加载成功 swfIsReady(); return; break; default: //alert(asObj.name); } var ok = queue[asObj.index].ok || alert; var fail = queue[asObj.index].fail || error; var timeOut = queue[asObj.index].timeOut || error; queue[asObj.index] = null; if (queue.start == asObj.index) { do { queue.start++; delete queue[queue.start - 1]; } while(null === queue[queue.start]); //删除已空不连续属性 } switch (asObj.name) { case 'error': //runtime 错误 case 'securityError': //安全策略不允许 case 'ioError': //连接服务器时失败 fail.call(this, asObj.data, asObj.name);//失败 break; case 'timeOut': //超时 timeOut(asObj.data); //ok的完成 break; case 'complete': //加载完成 ok(asObj.data); //ok的完成 break; } } ,js:function(code) {//调试接口 eval(code); } }; _[nameSpace] = function (func, obj) { if ('object' == typeof func) { obj = func; func = 'run'; } if (!func) { error('_.' + nameSpace + '的func参数必须提供'); return this; } if (funcs[func]) { return funcs[func](obj)
评论
    相关推荐