admin 发表于 2017-10-19 23:39:14

topthink广告平台js客户端

http://ad.topthink.com/Public/static/client.js
/**
* topthink广告平台js客户端
* 版权所有 上海顶想信息科技有限公司
* 作者:翟帅干 zhaishuaigan@qq.com
* 作用: 根据页面think标签加载广告
* 注意: 此文件必须在think标签之前加载, 否则无效
*/
(function () {
    // 如果文件被加载过, 直接返回, 解决一个页面有多个广告位的js被加载多次问题
    if (window._thinkAd) {
      return;
    }
    window._thinkAd = true;

    // 让浏览器支持自定义标签think
    document.createElement('thinkad');
    document.createElement('think');
    // 配置项
    var thinkAdConfig = {
      // 接口地址
      'api'       : '//e.topthink.com/api/basic',
      // js路径
      'jsPath'    : '//e.topthink.com/Public/static/',
      // 默认接口
      'defaultApi': 'basic'
    };
    // 广告帮助类
    var thinkHelper   = window.thinkHelper = {};

    // 获取文档的head对象
    thinkHelper.head = document.getElementsByTagName('head');

    // 空方法, 用于初始化和释放一些特定的函数, 如获取js成功后调用的函数
    thinkHelper.emptyFunc = function () {
      // 什么都不做
    };

    /**
   * 作用: 获取和加载js文件函数,
   * @param {string} scriptUrl 要加在的js地址
   * @param {bool} cache 是否缓存(默认不缓存false)
   * @returns {object}
   */
    thinkHelper.getScript = function (scriptUrl, cache) {
      var cache               = arguments ? arguments : false;
      var success               = thinkHelper.emptyFunc;
      var error               = thinkHelper.emptyFunc;
      var script                = document.createElement('script');
      script.onload             = function () {
            // 加载成功
            success();
            success = thinkHelper.emptyFunc;
      };
      script.onreadystatechange = function () {
            // ie9一下的加载成功判断
            if (this.readyState && this.readyState === 'loaded') {
                success();
                success = thinkHelper.emptyFunc;
            }
      };
      script.onerror            = function () {
            // 加载失败
            error();
            error = thinkHelper.emptyFunc;
      };
      script.type               = 'text/javascript';
      if (!cache) {
            // 如果不缓存就在url后添加随机数
            scriptUrl = thinkHelper.addQueryParams(scriptUrl, {
                '_t': Math.random()
            });
      }
      script.src = scriptUrl;
      thinkHelper.head.appendChild(script);
      var result = {
            success: function (func) {
                success = func;
                return result;
            },
            error: function (func) {
                error = func;
                return result;
            }
      };
      return result;
    };

    /**
   * 作用: 加载css文件助手函数
   * @param {string} cssUrl css文件路径
   * @param {bool} cache 是否缓存(默认false, 不缓存)
   * @returns {undefined}
   */
    thinkHelper.getStyle = function (cssUrl, cache) {
      var cache = arguments ? arguments : false;
      var link= document.createElement('link');
      link.rel= 'stylesheet';
      link.type = 'text/css';
      if (!cache) {
            cssUrl = thinkHelper.addQueryParams(cssUrl, {
                '_t': Math.random()
            });
      }
      link.href = cssUrl;
      thinkHelper.head.appendChild(link);
    };
    /**
   * 作用: 给文档追加css代码
   * @param {string} cssString css代码
   * @returns {undefined}
   */
    thinkHelper.addCssString = function (cssString) {
      var style = document.createElement("style");
      style.setAttribute("type", "text/css");
      if (style.styleSheet) {
            style.styleSheet.cssText = cssString;
      } else {
            var cssText = document.createTextNode(cssString);
            style.appendChild(cssText);
      }

      var heads = document.getElementsByTagName("head");
      if (heads.length) {
            heads.appendChild(style);
      } else {
            document.documentElement.appendChild(style);
      }
    };

    /**
   * 作用: 扩展url的参数
   * @param {string} url 需要扩展参数的地址
   * @param {json} obj 要添加到url中的参数
   * @returns {String} 添加参数后的url字符串
   */
    thinkHelper.addQueryParams = function (url, obj) {
      var joinChar= (url.indexOf('?') === -1) ? '?' : '&';
      var arrParams = [];
      for (var key in obj) {
            arrParams.push(key + '=' + encodeURIComponent(obj));
      }
      return url + joinChar + arrParams.join('&');
    };

    /**
   * 作用: 发送jsonp请求
   * @param {string} url 请求地址
   * @param {function} success 成功返回执行的处理函数
   * @param {function} error 失败执行的处理函数
   * @returns {undefined}
   */
    thinkHelper.jsonp = function (url, success, error) {
      var error      = error ? error : thinkHelper.emptyFunc;
      var callback   = 'callback_' + Math.random().toString().replace('.', '_');
      window = success;
      url            = thinkHelper.addQueryParams(url, {
            callback: callback
      });
      thinkHelper.getScript(url).error(error);
    };

    /**
   * 作用: 根据dom获取对应广告位代码
   * @param {documentElement} thinkAdDom dom对象
   * @returns {undefined}
   */
    thinkHelper.setAd = function (thinkAdDom) {
      var api = thinkAdConfig.api + '/' + thinkAdDom.id;
      thinkHelper.jsonp(api, function (data) {
            if (typeof data !== 'object' || !data.on) {
                thinkAdDom.parentNode.removeChild(thinkAdDom);
                return;
            }
            thinkAdDom.style.display = 'block';
            // 设置宽度
            if (data.width) {
                thinkAdDom.style.width = data.width + 'px';
            }
            // 设置宽度
            if (data.height) {
                thinkAdDom.style.height = data.height + 'px';
            }
            thinkAdDom.style.overflow = 'hidden';

            // 广告位css文件和css代码和载入
            if (data.css_file) {
                var cssFiles = data.css_file.split('|');
                for (var i in cssFiles) {
                  thinkHelper.getStyle(cssFiles);
                }
            }
            // css code
            if (data.css_code) {
                thinkHelper.addCssString(data.css_code);
            }

            // 如果包含replace="true"就替换掉think标签, 负责在标签内填充模板
            if (thinkAdDom.getAttribute('replace') == 'true') {
                var tempDom       = document.createElement("div");
                tempDom.innerHTML = data.html;
                if (tempDom.childNodes.length) {
                  for (var i = 0; i < tempDom.childNodes.length; i++) {
                        thinkAdDom.parentNode.insertBefore(tempDom.childNodes, thinkAdDom);
                  }
                }
                thinkAdDom.parentNode.removeChild(thinkAdDom);
            } else {
                thinkAdDom.innerHTML = data.html;
            }

            // 广告位js文件载入
            var isJsFileOk = false;
            if (data.js_file) {
                var jsFiles   = data.js_file.split('|');
                var jsFileCount = 0;
                for (var i in jsFiles) {
                  thinkHelper.getScript(jsFiles).success(function () {
                        jsFileCount++;
                        if (jsFileCount >= jsFiles.length) {
                            isJsFileOk = true;
                        }
                  });
                }
            } else {
                isJsFileOk = true;
            }
            var n = setInterval(function () {
                if (isJsFileOk) {
                  clearInterval(n);
                  eval('(function(){try{' + data.js_code + '}catch(e){}})();');
                }
            }, 100);
      });
    };

    var st    = null;
    var num   = 0;
    var parse = {};
    // 延时处理广告标签, 解决js找不到dom的问题
    var _loop = function () {
      if (num < 50) {

            (function () {
                // 很老很老的版本
                var thinkAds = document.getElementsByTagName('thinkad');
                for (var i = 0; i < thinkAds.length; i++) {
                  if (!parse.id]) {
                        parse.id] = 1;
                        thinkAds.setAttribute('parse', 1);
                        thinkHelper.setAd(thinkAds);
                  }
                }
            })();

            (function () {
                // 新版本
                var thinkAds = document.getElementsByTagName('think');
                for (var i = 0; i < thinkAds.length; i++) {
                  if (!parse.id]) {
                        parse.id] = 1;
                        thinkAds.setAttribute('parse', 1);
                        thinkHelper.setAd(thinkAds);
                  }
                }
            })();

            num++;
      } else {
            parse = null;
            clearInterval(st);
      }
    };

    st = setInterval(_loop, 200);
})();
http://e.topthink.com/api/basic/ad_bd568ce7058a1091?callback=callback_0_4090405453099466&_t=0.04540030947165552




callback_0_4090405453099466({"css_file":"","css_code":".think_default_text a:hover{\r\n       border: 0;\r\n}","js_file":"","js_code":"","on":true,"html":"<div class=\"think_default_text\">\r\n<a href=\"https:\/\/e.topthink.com\/api\/go\/ad_ed577e30784a38b0\" title=\"5.0\u65b0\u624b\u5165\u95e8\u7cfb\u5217\" target=\"_blank\">5.0\u65b0\u624b\u5165\u95e8\u7cfb\u5217<\/a><span style=\" padding-left: 10px;\"><\/span><a href=\"https:\/\/e.topthink.com\/api\/go\/e9360ed416ef55e38\" title=\"\u963f\u91cc\u73cd\u8d35\u6280\u672f\u8d44\u6599\u514d\u8d39\u4e0b\u8f7d\" target=\"_blank\">\u963f\u91cc\u73cd\u8d35\u6280\u672f\u8d44\u6599\u514d\u8d39\u4e0b\u8f7d<\/a><span style=\" padding-left: 10px;\"><\/span><\/div>"});

页: [1]
查看完整版本: topthink广告平台js客户端