Javascript跨域解决方案之script标签实现

/**********************************************************
说明:跨域请求数据Javascript组件
----------------------------------------------------------
add by 傻帽儿 2015-4-13 18:18:14
**********************************************************/
; (function (window, undefined) {
    var _ap = function () {
    }, _asyncID = 12349, _asyncType = "asynctype", _version = "1.5.0", _cbKey = "cb", _cb = "";
    function addSc(url, cbAndParam) {
        var script = createSc();
        script.setAttribute("src", url + "?" + cbAndParam);
        window.document.getElementsByTagName("head")[0].appendChild(script);
    };
    function delSc(id) {
        var scripts = getSc();
        for (var i = 0; i < scripts.length; i++) {
            if (scripts[i].attributes["tb_id"]) {
                if (parseInt(scripts[i].attributes["tb_id"].value) === parseInt(id)) {
                    remove(scripts[i]);
                }
            }
        }
    };
    function remove(script) {
        if ((script) && (script.parentNode)) {
            script.parentNode.removeChild(script);
        }
    };
    function clearSc() {
        var scripts = getSc();
        for (var i = 0; i < scripts.length; i++) {
            remove(scripts[i]);
        }
    };
    function getSc() {
        var s1 = [];
        var scripts = window.document.getElementsByTagName("script");
        for (var i = 0; i < scripts.length; i++) {
            if (scripts[i].attributes["tb_async"]) {
                if (scripts[i].attributes["tb_async"].value === _asyncType) {
                    s1.push(scripts[i]);
                }
            }
        }
        return s1;
    };
    function createSc() {
        _asyncID++;
        var script = window.document.createElement("script");
        script.setAttribute("tb_id", _asyncID);
        script.setAttribute("tb_async", _asyncType);
        script.setAttribute("type", "text/javascript");
        script.onload = script.onreadystatechange = function () {
            if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete") {
                // 加入等待队里。2秒后将此标签对象移除。避免过多跨域加载导致页面Script标签过多。
                // waitDel(this.attributes["tb_id"].value, 2000);
                delSc(this.attributes["tb_id"].value);
                // 解决内存泄露问题。IE6,7貌似无效
                script.onload = script.onreadystatechange = null;
            }
        }
        return script;
    }
    function waitDel(id, interval) {
        window.setInterval(delSc(id), interval);
    };
    _ap.fn = _ap.prototype = {
        constructor: _ap,
        version: _version,
        init: function (arg) {
            return new _ap().constructor;
        },
        get: function (url, cbk, cb, param) {
            if (!cb) cb = _cb;
            if (!cbk) cbk = _cbKey;
            var qs = this.map(‘,‘, param);
            addSc(url, _cbKey + "=" + cb + "&" + qs);
        },
        getEasy: function (url, cb, param) {
            if (!cb) cb = _cb;
            var qs = this.map(‘,‘, param);
            addSc(url, _cbKey + "=" + cb + "&" + qs);
        },
        getCustom: function (url, param) {
            addSc(url, this.map(‘,‘, param));
        },
        map: function (split, params) {
            var str, strs = [];
            if (typeof params != "string") {
                params = eval(params);
                for (var p in params) {
                    strs.push(p + "=" + params[p])
                }
                str = strs.join(split);
            } else {
                str = param;
            }
            return str;
        },
        clear: function () { clearSc(); }
    };
    // SyntaxError: expected expression, got ‘)‘
    _ap.fn.init.prototype = _ap.fn;
    window.TbAP = _ap.fn.init();
})(window);
时间: 2024-10-12 23:23:23

Javascript跨域解决方案之script标签实现的相关文章

javascript跨域解决方案

最近遇到了https跨域访问http域的问题,很多朋友理所当然的认为简单,问题是https跨域访问到http域上的资源,会进行相互通信,没有解决该问题,只能把外部资源扔到了新浪的sae上,通过https访问,别跨什么协议域了,只跨主域即可! 附两篇跨域的文档 http://jiangzhenghua.iteye.com/blog/1221178 http://jiangzhenghua.iteye.com/blog/1221184 HTTPS页面包含HTTP内容时浏览器提示的绕过 http://

javascript 跨域解决方案

1 用jsonp $.getJSON(" http://www.jinanwuliangye.com/document!searchJSONResult.action?name1="+value1+"&jsoncallback=?", function(json){ if(json.属性名==值){ // 执行代码 } }); $.getJSON(" http://www.tongxinglong.com/document!searchJSONRe

JavaScript跨域方法学习总结

JavaScript跨域: URL 说明 是否允许通信 http://www.a.com/a.js  http://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.js  http://www.a.com/script/b.js 同一域名下不同文件夹 允许 http://www.a.com:8000/a.js  http://www.a.com/b.js 同一域名,不同端口 不允许 http://www.a.com/a.js  https://www

Javascript 跨域访问解决方案 总结

在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法.那么什么叫相同域,什么叫不同的域呢? 同源策略 在客户端编程语言中,如javascript和 ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个

Javascript跨域访问解决方案

Javascript跨域访问解决方案 分类: WEB TIPS 2009-02-13 14:08 15882人阅读 评论(5) 收藏 举报 javascriptiframeservletcallbackdomainfunction 由于安全方面的考虑,Javascript被限制了跨域访问的能力,但是有时候我们希望能够做一些合理的跨域访问的事情,那么怎么办呢?这里分两类情况:一.基于同一父域的子域之间页面的访问:参见如下3个domain域:taobao.com.jipiao.taobao.com.

JavaScript 跨域漫游

前言: 最近在公司做了几个项目都涉及到了iframe,也就是在这些iframe多次嵌套的项目中,我发现之前对iframe的认识还是比较不足的,所以就静下心来,好好整理总结了iframe的相关知识:<Iframe 功能详解>. 在做公司项目的过程中,让我纠结之一的就是iframe的跨域问题,在网上查到的资料,基本都是给个思路,加个DEMO,也没有完整的解决方案.所以这里我结合公司的项目实际需求,从新整理了一下javaScript跨域的相关方法. PS:请转载的童鞋,请注明出处 ... 目录: 一

js最全的十种跨域解决方案

在客户端编程语言中,如javascript和ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同 源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法.那么什么叫相同域,什么叫不同的域呢? 同源策略 在客户端编程语言中,如javascript和 ActionScript,同源策略是一个很重要的安全理念,它在保证数据的安全性方面有着重要的意义.同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个

跨域解决方案二:使用JSONP实现跨域

跨域的实现方式有多种,除了 上篇文章 提到的CORS外,常见的还有JSONP.HTML5.Flash.iframe.xhr2等. 这篇文章对JSONP的跨域原理进行了探索,并将我的心得记录在这里和大家分享. JSONP跨域原理探秘 我们知道,使用 XMLHTTPRequest 对象发送HTTP请求时,会遇到 同源策略 问题,域不同请求会被浏览器拦截. 那么是否有方法能绕过 XMLHTTPRequest 对象进行HTTP跨域请求呢? 换句话说,不使用 XMLHTTPRequest 对象是否可以发送

前端常见跨域解决方案(全)

什么是跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 1.) 资源跳转: A链接.重定向.表单提交 2.) 资源嵌入: <link>.<script>.<img>.<frame>等dom标签,还有样式中background:url().@font-face()等文件外链 3.) 脚本请求: js发起的ajax请求.dom和js对象的跨域操作等 其实我们通常所说的跨域是狭义的,是由浏览器同源策略限制的一类请求场