ad_store.js 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989
  1. /**
  2. * Created by zhaoxueliang on 2020/5/22.
  3. */
  4. $(function () {
  5. // 页面编码
  6. var PAGE_CODE = {
  7. // 最近阅读
  8. 'RECENT_READ': 'recent_read',
  9. // 书架
  10. 'BOOK_SHELF': 'book_shelf',
  11. // 书籍详情页
  12. 'BOOK_DETAIL': 'book_detail',
  13. // 追更页
  14. 'TYPING': 'typing',
  15. // 阅读页
  16. 'BOOK_READING': 'book_reading',
  17. // 充值页
  18. 'CHARGE': 'charge',
  19. // 个人中心
  20. 'MY': 'my',
  21. // 排行榜
  22. 'RANKING_LIST': 'ranking_list',
  23. // 分类首页
  24. 'CATEGORY_MAIN': 'category_main',
  25. // 分类二级页
  26. 'CATEGORY_SUB': 'category_sub',
  27. // 书城首页
  28. 'BOOK_STORE': 'book_store',
  29. };
  30. // 广告位置编号
  31. var AD_POSITION_CODE = {
  32. // 书籍详情页广告位
  33. 'BOOK_DETAIL': 1,
  34. // 书籍详情页浮窗广告位
  35. 'BOOK_DETAIL_FLOW': 22,
  36. // 追更、完结页广告位
  37. 'TYPING': 2,
  38. // 最近阅读广告位
  39. 'RECENT_READ': 4,
  40. // 书架/阅读记录广告位
  41. 'BOOK_SHELF': 5,
  42. // 阅读页底部广告位
  43. 'BOOK_READING_BOTTOM': 3,
  44. // 阅读页顶部菜单悬浮广告位
  45. 'BOOK_READING_MENU': 6,
  46. // 阅读页中间插屏广告位1
  47. 'BOOK_READING_MIDDLE_PRIMARY': 7,
  48. // 阅读页中间插屏广告位2
  49. 'BOOK_READING_MIDDLE_LARGE': 8,
  50. // 阅读页中间插屏广告位3
  51. 'BOOK_READING_MIDDLE_THIRD': 9,
  52. // 充值页返回弹窗广告位
  53. 'CHARGE_LEAVE': 10,
  54. // 阅读页下一章弹窗广告位
  55. 'BOOK_READING_NEXT_CHAPTER': 11,
  56. // 阅读页顶部轮播广告位
  57. 'BOOK_READING_TOP_BANNER': 18,
  58. // 阅读页跳转广告章节广告位
  59. 'BOOK_READING_DELIVER': 19,
  60. // 签到弹窗广告位
  61. 'MY_CHECKIN_ALERT': 12,
  62. // 个人中心插屏广告位
  63. 'MY_CONTENT': 13,
  64. // 排行榜插屏广告位
  65. 'RANKING_LIST': 14,
  66. // 分类首页插屏广告位
  67. 'CATEGORY_MAIN': 15,
  68. // 分类二级页插屏广告位
  69. 'CATEGORY_SUB': 16,
  70. // 书城首页顶部轮播广告位
  71. 'BOOK_STORE_TOP_BANNER': 17,
  72. // 书城首页中间内容插屏广告位
  73. 'BOOK_STORE_MIDDLE_BANNER': 20,
  74. // 书城首页悬浮窗广告位
  75. 'BOOK_STORE_FLOW': 21,
  76. };
  77. var PAGE_POSITION_MAP = {
  78. 'recent_read': [4],
  79. 'book_shelf': [5],
  80. 'book_detail': [1, 22],
  81. 'typing': [2],
  82. 'book_reading': [3, 6, 7, 8, 9, 11, 18, 19],
  83. 'charge':[10],
  84. 'my':[12, 13],
  85. 'ranking_list':[14],
  86. 'category_main':[15],
  87. 'category_sub':[16],
  88. 'book_store':[17, 20, 21]
  89. };
  90. var REQUEST_INTERVAL = 60 * 60 * 1000;
  91. var STORE_TIME = 'storeTime';
  92. var LOCAL_AD_DATA = 'local_AD_data';
  93. var LATEST_VERSION = 'latestVersion';
  94. var READING_BANNER_CLOSE_TIME = 'reading_banner_close_time';
  95. var API_URL = {
  96. GET_AD_STRATEGY: '/api/aduserapi/advert'
  97. };
  98. var simpleAD = {
  99. userId: _getUserId(),
  100. channelId: _getChannelId()
  101. };
  102. // 当前章节是否需要跳转到广告章节页
  103. var shouldGoToADChapter = false;
  104. var read_chapter = 0;
  105. //拿到广告数据后插入广告
  106. simpleAD.render = function (pageCode) {
  107. var localADData = JSON.parse(localStorage.getItem(LOCAL_AD_DATA));
  108. var latestVersion = localStorage.getItem(LATEST_VERSION) || '';
  109. var lastStoreTime = localADData && localADData[STORE_TIME];
  110. var now = new Date().getTime();
  111. if (localADData && (now - lastStoreTime < REQUEST_INTERVAL) && latestVersion == window.$adLatestVersion) {
  112. _renderPageAD(localADData, pageCode);
  113. } else {
  114. $.ajax({
  115. type: 'POST',
  116. url: API_URL.GET_AD_STRATEGY,
  117. data: {
  118. pagecode: pageCode,
  119. uid: this.userId,
  120. channel_id: this.channelId
  121. },
  122. success: function (res) {
  123. if (res.code == 1 && (res.data instanceof Object)) {
  124. var storeData = {};
  125. storeData[STORE_TIME] = new Date().getTime();
  126. $.extend(storeData, res.data);
  127. localStorage.removeItem(LATEST_VERSION);
  128. localStorage.setItem(LATEST_VERSION,window.$adLatestVersion);
  129. localStorage.removeItem(LOCAL_AD_DATA);
  130. localStorage.setItem(LOCAL_AD_DATA, JSON.stringify(storeData));
  131. _renderPageAD(storeData, pageCode);
  132. }else{
  133. localStorage.removeItem(LOCAL_AD_DATA);
  134. }
  135. },
  136. error: function (error) {
  137. }
  138. });
  139. }
  140. };
  141. //下章节弹窗广告显示
  142. simpleAD.showReadAlert = function(){
  143. if(window.$isAdPick != '1'){
  144. return false;
  145. }
  146. var readedChapter = localStorage.getItem('readedChapterNum');
  147. if(!readedChapter){
  148. return false;
  149. }
  150. var readedChapterNum = JSON.parse(readedChapter).num;
  151. if(readedChapterNum >= read_chapter){
  152. // 用户当天阅读章节数达到后台下发的章节数后,清空当前缓存的章节数,重新开始计数,以实现每隔若干章弹一次“温馨提示”的需求
  153. localStorage.removeItem('readedChapterNum');
  154. }
  155. if(read_chapter == readedChapterNum){
  156. var ADElement = $('.ad-read-alert').find('.ad-image');
  157. if(ADElement.length == 0){
  158. return false;
  159. }
  160. var target = ADElement[0];
  161. var mId = target.dataset.mId;
  162. var adIds = target.dataset.adIds;
  163. var position = target.dataset.position;
  164. //发送报点
  165. _sendLog(adIds,position,mId);
  166. $('.ad_chapter_num').text(readedChapterNum);
  167. $('.ad-read-alert').show();
  168. return true;
  169. }
  170. return false;
  171. };
  172. //充值页广告弹窗
  173. simpleAD.showRechargeAlert = function(){
  174. var ADElement = $('.ad-recharge-alert').find('.ad-image');
  175. if(ADElement.length == 0){
  176. return false;
  177. }
  178. var target = ADElement[0];
  179. var mId = target.dataset.mId;
  180. var adIds = target.dataset.adIds;
  181. var position = target.dataset.position;
  182. _sendLog(adIds,position,mId);
  183. $('.ad-recharge-alert').show();
  184. return true;
  185. };
  186. simpleAD.getADChapterUrl = function(url){
  187. var search = url.split('?')[1];
  188. if(!shouldGoToADChapter|| !search){
  189. return '';
  190. }
  191. var book_id = _getQueryString(search,'book_id');
  192. var chapter_id = _getQueryString(search,'chapter_id');
  193. //不能拼死漏掉末尾参数???????????????
  194. return 'ad_chapter?'+search+"&chapter_name="+window.ad_chapter_name;
  195. };
  196. function _getQueryString(url,name) {
  197. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
  198. var r = url.match(reg);
  199. if (r != null)
  200. return decodeURI(r[2]);
  201. return '';
  202. }
  203. // 从cookie中获取userId
  204. function _getUserId() {
  205. return $.fn.cookie('user_id') || '';
  206. }
  207. // 从cookie中获取channelId
  208. function _getChannelId() {
  209. return $.fn.cookie('channel_id') || '';
  210. }
  211. // 渲染当前页面广告
  212. function _renderPageAD(localADData, pageCode) {
  213. //服务端缓存在本地数据,广告点位、渠道
  214. var positions = localADData.positions;
  215. var materials = localADData.materials;
  216. if(!positions || !materials){
  217. return ;
  218. }
  219. //判断如果是充值页就不加载福利广告,tabbar单独解析福利广告
  220. console.log(pageCode);
  221. if(pageCode !='charge'){
  222. window.ad_welfare && window.ad_welfare(localADData, pageCode);
  223. }
  224. //当前页设有有的广告点
  225. var localPositions = PAGE_POSITION_MAP[pageCode];
  226. for (var i = 0; i < localPositions.length; i++) {
  227. var positionIndex = localPositions[i];
  228. //当前页某点地广告策略数组集
  229. var positionData = positions[positionIndex];
  230. if (!positionData) {
  231. continue;
  232. }
  233. //某点广告的插入函数参数:策略集合、渠道、当前页具体点位、某页面
  234. _renderPositionAD(positionData, materials, positionIndex,pageCode);
  235. }
  236. }
  237. // 渲染当前页面某点广告
  238. function _renderPositionAD(positionData, materials, positionIndex,pageCode) {
  239. // 策略中的权重
  240. var maxWeight = 0;
  241. // 各权重包含的策略
  242. var classifyStrategies = {};
  243. var strategyKeys = Object.keys(positionData);
  244. var count = 0;
  245. for (var i = 0; i < strategyKeys.length; i++) {
  246. var strategyId = strategyKeys[i];
  247. //点中的某一个策略对象{}
  248. var strategy = positionData[strategyId];
  249. var weight = strategy.weight;
  250. if (!classifyStrategies[weight]) {
  251. classifyStrategies[weight] = [];
  252. }
  253. var now = new Date().getTime();
  254. // 只收集在推广期内的广告
  255. $.extend(strategy,{ad_ids:strategyId});
  256. if(strategy.show_starttime * 1000 < now && strategy.show_endtime * 1000 > now){
  257. classifyStrategies[weight].push(strategy);
  258. if (weight > maxWeight) {
  259. maxWeight = weight;
  260. }
  261. count+=1;
  262. }
  263. }
  264. if(count == 0){
  265. return;
  266. }
  267. var maxWeightStrategy = classifyStrategies[maxWeight];
  268. //多少个广告策略
  269. var maxWeightStrategySize = maxWeightStrategy && maxWeightStrategy.length;
  270. var resultIndex = maxWeightStrategySize > 1 ? Math.floor(Math.random() * maxWeightStrategySize) : 0;
  271. if(positionIndex == AD_POSITION_CODE.BOOK_READING_NEXT_CHAPTER){
  272. read_chapter = maxWeightStrategy[resultIndex].chapter_num;
  273. }
  274. _renderAD(maxWeightStrategy[resultIndex],positionIndex,pageCode,materials);
  275. }
  276. function _renderAD(ADData,positionIndex,pageCode,materials){
  277. switch (pageCode){
  278. case PAGE_CODE.BOOK_DETAIL:
  279. _renderDetailAD(ADData,positionIndex,materials);
  280. break;
  281. case PAGE_CODE.BOOK_READING:
  282. _renderReadingAD(ADData,positionIndex,materials);
  283. break;
  284. case PAGE_CODE.BOOK_SHELF:
  285. _renderShelfAD(ADData,positionIndex,materials);
  286. break;
  287. case PAGE_CODE.RECENT_READ:
  288. _renderRecentAD(ADData,positionIndex,materials);
  289. break;
  290. case PAGE_CODE.TYPING:
  291. _renderTypingAD(ADData,positionIndex,materials);
  292. break;
  293. case PAGE_CODE.CHARGE:
  294. _renderChargeAD(ADData,positionIndex,materials);
  295. break;
  296. case PAGE_CODE.MY:
  297. _renderMyAD(ADData,positionIndex,materials);
  298. break;
  299. case PAGE_CODE.RANKING_LIST:
  300. _renderRankingListAD(ADData,positionIndex,materials);
  301. break;
  302. case PAGE_CODE.CATEGORY_MAIN:
  303. _renderCategoryMainAD(ADData,positionIndex,materials);
  304. break;
  305. case PAGE_CODE.CATEGORY_SUB:
  306. _renderCategorySubAD(ADData,positionIndex,materials);
  307. break;
  308. case PAGE_CODE.BOOK_STORE:
  309. _renderBookStoreAD(ADData,positionIndex,materials);
  310. }
  311. }
  312. function _renderDetailAD(ADData,positionIndex,materials){
  313. if(AD_POSITION_CODE.BOOK_DETAIL_FLOW == positionIndex){
  314. _renderFlow(ADData,positionIndex,materials);
  315. }else{
  316. if(ADData.is_slide == 1){
  317. _renderSlide(ADData,positionIndex,materials);
  318. }else{
  319. _renderLarge(ADData,positionIndex,materials);
  320. }
  321. }
  322. }
  323. function _renderReadingAD(ADData,positionIndex,materials){
  324. if(window.location.pathname.indexOf('ad_chapter')>0){
  325. positionIndex == AD_POSITION_CODE.BOOK_READING_DELIVER && _renderADChapter(ADData,positionIndex,materials);
  326. return;
  327. }
  328. switch (positionIndex){
  329. case AD_POSITION_CODE.BOOK_READING_BOTTOM:
  330. if(ADData.is_slide == 1){
  331. _renderSlide(ADData,positionIndex,materials);
  332. }else{
  333. _renderLarge(ADData,positionIndex,materials);
  334. }
  335. break;
  336. case AD_POSITION_CODE.BOOK_READING_MENU:
  337. _renderSmall(ADData,positionIndex,materials);
  338. break;
  339. case AD_POSITION_CODE.BOOK_READING_MIDDLE_PRIMARY:
  340. var programs = $('.read_main_p').find('p');
  341. length = programs.length;
  342. if(length>0) {
  343. // 垃圾代码 ···
  344. var params = _getADMaskParams(positionIndex);
  345. // 垃圾代码结束
  346. var position = Math.floor(length * .25);
  347. _renderPrimary(ADData,positionIndex,materials,programs,position,params.hasBeStillToday,params.showMask);
  348. }
  349. break;
  350. case AD_POSITION_CODE.BOOK_READING_MIDDLE_LARGE:
  351. var programs = $('.read_main_p').find('p');
  352. length = programs.length;
  353. if(length>0) {
  354. // 垃圾代码 ···
  355. var params = _getADMaskParams(positionIndex);
  356. // 垃圾代码结束
  357. var position = Math.floor(length * .5);
  358. _renderLarge(ADData,positionIndex,materials,programs,position,params.hasBeStillToday,params.showMask);
  359. }
  360. break;
  361. case AD_POSITION_CODE.BOOK_READING_MIDDLE_THIRD:
  362. var programs = $('.read_main_p').find('p');
  363. length = programs.length;
  364. if(length>0) {
  365. // 垃圾代码 ···
  366. var params = _getADMaskParams(positionIndex);
  367. // 垃圾代码结束
  368. var position = Math.floor(length * .75);
  369. _renderPrimary(ADData,positionIndex,materials,programs,position,params.hasBeStillToday,params.showMask);
  370. }
  371. break;
  372. case AD_POSITION_CODE.BOOK_READING_NEXT_CHAPTER:
  373. _renderLarge(ADData,positionIndex,materials);
  374. break;
  375. case AD_POSITION_CODE.BOOK_READING_DELIVER:
  376. _renderADChapter(ADData,positionIndex,materials);
  377. break;
  378. case AD_POSITION_CODE.BOOK_READING_TOP_BANNER:
  379. var lastCloseTime = localStorage.getItem(READING_BANNER_CLOSE_TIME) || 0;
  380. //浮窗广告时间间隔,测试调到5分钟 上线得调回到15
  381. var latingTime = 15*60*1000;
  382. if($('.ad_welfare_banner').css('display') == 'none' && new Date().getTime()-lastCloseTime >= latingTime){
  383. // $('.ad_position_18').show();
  384. if(ADData.is_slide == 1){
  385. _renderSlide(ADData,positionIndex,materials);
  386. }else{
  387. _renderLarge(ADData,positionIndex,materials);
  388. }
  389. $('.ad_position_18_close').unbind().bind('click',function(e){
  390. //??????????????
  391. e.stopPropagation();
  392. $('.ad_position_18').hide();
  393. localStorage.setItem(READING_BANNER_CLOSE_TIME,new Date().getTime());
  394. });
  395. }else{
  396. console.log("福利广告已显示");
  397. $('.ad_position_18').hide();
  398. }
  399. }
  400. }
  401. function _getADMaskParams(positionIndex){
  402. var hasBeStillToday = 'no';
  403. var showMask = Math.random() < window.$ad_rate_chapter;
  404. var today = new Date(new Date().toLocaleDateString()).getTime();
  405. var stillClickPositionStatus = localStorage.getItem('still_click_position_'+positionIndex);
  406. stillClickPositionStatus = stillClickPositionStatus ? JSON.parse(stillClickPositionStatus) : null;
  407. if(stillClickPositionStatus){
  408. var lastRecord = stillClickPositionStatus.time;
  409. if(lastRecord<today){
  410. hasBeStillToday = 'no';
  411. }else{
  412. hasBeStillToday = stillClickPositionStatus.beStill;
  413. }
  414. }else{
  415. localStorage.setItem('still_click_position_'+positionIndex,JSON.stringify({beStill:'no',time:new Date().getTime()}));
  416. }
  417. return {
  418. hasBeStillToday: hasBeStillToday,
  419. showMask: showMask
  420. };
  421. }
  422. function _renderShelfAD(ADData,positionIndex,materials){
  423. _renderLarge(ADData,positionIndex,materials);
  424. }
  425. function _renderRecentAD(ADData,positionIndex,materials){
  426. _renderLarge(ADData,positionIndex,materials);
  427. }
  428. function _renderTypingAD(ADData,positionIndex,materials){
  429. if(ADData.is_slide == 1){
  430. _renderSlide(ADData,positionIndex,materials);
  431. }else{
  432. _renderLarge(ADData,positionIndex,materials);
  433. }
  434. }
  435. function _renderChargeAD(ADData,positionIndex,materials){
  436. _renderAlert(ADData,positionIndex,materials);
  437. }
  438. function _renderMyAD(ADData,positionIndex,materials){
  439. if(AD_POSITION_CODE.MY_CHECKIN_ALERT == positionIndex){
  440. if($('.ad_welfare_sign').css('display') != 'none'){
  441. return;
  442. }
  443. }
  444. _renderLarge(ADData,positionIndex,materials);
  445. }
  446. function _renderRankingListAD(ADData,positionIndex,materials){
  447. var contain = $(window.rankingContentMain);
  448. var programs = contain.find('.section-block');
  449. length = programs.length;
  450. if(length == 0){
  451. if(contain.find('.ad-image').length == 0){
  452. contain.append('<div class="ad_position_14"></div>');
  453. _renderLarge(ADData,positionIndex,materials);
  454. }
  455. }else{
  456. contain.find('.ad_position_14').remove();
  457. var existedAD = contain.find('.ad-image');
  458. // 页面上已存在广告,不再渲染新的广告
  459. if(existedAD.length>0){
  460. return;
  461. }
  462. var position = length >= 4 ? 2 : (length-1);
  463. _renderLarge(ADData,positionIndex,materials,programs,position);
  464. }
  465. }
  466. function _renderCategoryMainAD(ADData,positionIndex,materials){
  467. if(ADData.is_slide == 1){
  468. _renderSlide(ADData,positionIndex,materials);
  469. }else{
  470. _renderLarge(ADData,positionIndex,materials);
  471. }
  472. }
  473. function _renderCategorySubAD(ADData,positionIndex,materials){
  474. var contain = $('.r_img_ul');
  475. var programs = contain.find('.section-block');
  476. length = programs.length;
  477. if(length == 0){
  478. if($('.ad_position_16').find('.ad-image').length == 0){
  479. _renderLarge(ADData,positionIndex,materials);
  480. }
  481. }else{
  482. var existedAD = contain.find('.ad-image');
  483. // 页面上已存在广告,不再渲染新的广告
  484. if(existedAD.length>0){
  485. return;
  486. }
  487. var position = length >= 4 ? 2 : (length-1);
  488. _renderLarge(ADData,positionIndex,materials,programs,position);
  489. }
  490. }
  491. function _renderBookStoreAD(ADData,positionIndex,materials){
  492. if(AD_POSITION_CODE.BOOK_STORE_FLOW == positionIndex){
  493. _renderFlow(ADData,positionIndex,materials);
  494. }
  495. if(AD_POSITION_CODE.BOOK_STORE_TOP_BANNER == positionIndex){
  496. _renderBookStoreSlide(ADData,positionIndex,materials);
  497. }
  498. if(AD_POSITION_CODE.BOOK_STORE_MIDDLE_BANNER == positionIndex){
  499. var contain = $('.body_sytle');
  500. var programs = contain.find('.i_module_box');
  501. length = programs.length;
  502. _renderLarge(ADData,positionIndex,materials,programs,0);
  503. }
  504. }
  505. function _renderSlide(ADData,positionIndex,materials){
  506. if(!ADData || ADData.material_ids && ADData.material_ids.length<1){
  507. return;
  508. }
  509. var materialItems = _getSortedMaterials(ADData,materials,3);
  510. if(!materialItems || materialItems.length == 0){
  511. return;
  512. }
  513. if(positionIndex==AD_POSITION_CODE.BOOK_READING_TOP_BANNER){
  514. $('.ad_position_18').show();
  515. }
  516. var randomMaterialItems = materialItems;
  517. var template = (positionIndex == AD_POSITION_CODE.BOOK_READING_BOTTOM ? '':'<div class="ad_image_warp">')+
  518. '<div class="i_slide_box_ad">'+
  519. '<div class="ad-swiper-container">'+
  520. '<div class="swiper-wrapper">';
  521. var baiduCode = [];
  522. var js_code = '';
  523. for(var j = 0;j<randomMaterialItems.length;j++){
  524. var randomMaterialItem = randomMaterialItems[j];
  525. if(randomMaterialItem.type == 0){
  526. template+= '<div class="swiper-slide section-block">'+
  527. '<img class="ad-image-tip" src="http://'+window.location.host+'/assets/img/frontend/ad/ad_tip.png" />'+
  528. '<div href="javascript:;" class="ad-image" data-link-url="'+randomMaterialItem.link_url+'" data-m-id="'+randomMaterialItem.material_id+'" data-user-id="'+simpleAD.userId+'" data-position="'+positionIndex+'" data-ad-ids="'+ADData.ad_ids+'"><img alt="" src="'+randomMaterialItem.img_url+'"/></div>'+
  529. '</div>';
  530. } else if(randomMaterialItem.type == 1){
  531. js_code = randomMaterialItem.js_code;
  532. template+= '<div class="swiper-slide section-block">'+
  533. '<div class="ad-image js_ad" data-type="1"></div>'+
  534. '</div>';
  535. } else if(randomMaterialItem.type == 2){
  536. baiduCode.push(randomMaterialItem.ad_baidu);
  537. template+= '<div class="swiper-slide section-block">'+
  538. '<div class="ad-image"><div class="'+randomMaterialItem.ad_baidu+'"></div></div>'+
  539. '</div>';
  540. }
  541. _sendLog(ADData.ad_ids,positionIndex,randomMaterialItem.material_id);
  542. }
  543. template+='</div>'+
  544. '<div class="swiper-pagination"></div>'+
  545. '</div>'+
  546. '</div>'+
  547. (positionIndex == AD_POSITION_CODE.BOOK_READING_BOTTOM ? '':'</div>');
  548. $('.ad_position_'+positionIndex).append(template);
  549. // 渲染js和百度广告
  550. var jsElement = $('.ad_position_'+positionIndex+' .js_ad');
  551. jsElement.length && js_code && postscribe(jsElement[0], js_code);
  552. for(var k=0;k<baiduCode.length;k++){
  553. (window.slotbydup = window.slotbydup || []).push({
  554. id: baiduCode[k],
  555. container: baiduCode[k],
  556. async: true
  557. });
  558. }
  559. _addListener();
  560. _initSwiper();
  561. }
  562. function _renderBookStoreSlide(ADData,positionIndex,materials){
  563. if(!ADData || ADData.material_ids && ADData.material_ids.length<1){
  564. return;
  565. }
  566. var materialItems = _getSortedMaterials(ADData,materials,3);
  567. if(!materialItems || materialItems.length == 0){
  568. return;
  569. }
  570. $('.body_sytle .i_slide_box').hide();
  571. var randomMaterialItems = materialItems;
  572. var template = '<div class="ad_image_warp"><div class="i_slide_box_ad">'+
  573. '<div class="ad-swiper-container">'+
  574. '<div class="swiper-wrapper">';
  575. var baiduCode = [];
  576. var js_code = '';
  577. for(var j = 0;j<randomMaterialItems.length;j++){
  578. var randomMaterialItem = randomMaterialItems[j];
  579. if(randomMaterialItem.type == 0){
  580. template+= '<div class="swiper-slide section-block">'+
  581. '<img class="ad-image-tip" src="http://'+window.location.host+'/assets/img/frontend/ad/ad_tip.png" />'+
  582. '<div class="ad-image" data-link-url="'+randomMaterialItem.link_url+'" data-m-id="'+randomMaterialItem.material_id+'" data-user-id="'+simpleAD.userId+'" data-position="'+positionIndex+'" data-ad-ids="'+ADData.ad_ids+'"><img alt="" src="'+randomMaterialItem.img_url+'"/></div>'+
  583. '</div>';
  584. } else if(randomMaterialItem.type == 1){
  585. js_code = randomMaterialItem.js_code;
  586. template+= '<div class="swiper-slide section-block">'+
  587. '<div class="ad-image js_ad" data-type="1"></div>'+
  588. '</div>';
  589. } else if(randomMaterialItem.type == 2){
  590. baiduCode.push(randomMaterialItem.ad_baidu);
  591. template+= '<div class="swiper-slide section-block">'+
  592. '<div class="ad-image"><div class="'+randomMaterialItem.ad_baidu+'"></div></div>'+
  593. '</div>';
  594. }
  595. _sendLog(ADData.ad_ids,positionIndex,randomMaterialItem.material_id);
  596. }
  597. template+='</div>'+
  598. '<div class="swiper-pagination"></div>'+
  599. '</div>'+
  600. '</div></div>';
  601. $('.ad_position_'+positionIndex).append(template);
  602. // 渲染js和百度广告
  603. var jsElement = $('.ad_position_'+positionIndex+' .js_ad');
  604. jsElement.length && js_code && postscribe(jsElement[0], js_code);
  605. for(var k=0;k<baiduCode.length;k++){
  606. (window.slotbydup = window.slotbydup || []).push({
  607. id: baiduCode[k],
  608. container: baiduCode[k],
  609. async: true
  610. });
  611. }
  612. _addListener();
  613. _initSwiper();
  614. }
  615. function _renderSmall(ADData,positionIndex,materials){
  616. if(!ADData || ADData.material_ids && ADData.material_ids.length<1){
  617. return;
  618. }
  619. var materialItems = _getSortedMaterials(ADData,materials,1);
  620. if(!materialItems || materialItems.length == 0){
  621. return;
  622. }
  623. var materialItem = materialItems[0];
  624. if(materialItem.type==0){
  625. var template = '<div class="ad-image-small ad-image" class="ad-image" data-link-url="'+materialItem.link_url+'" data-m-id="'+materialItem.material_id+'" data-user-id="'+simpleAD.userId+'" data-position="'+positionIndex+'" data-ad-ids="'+ADData.ad_ids+'">'+
  626. '<img class="ad-image-tip" src="http://'+window.location.host+'/assets/img/frontend/ad/ad_tip.png" />'+
  627. '<img src="'+materialItem.img_url+'" alt=""/>'+
  628. '</div>';
  629. $('.ad_position_'+positionIndex).append(template);
  630. }else if(materialItem.type==1){
  631. var containElement = $('<div class="ad-image-small ad-image" data-type="1"></div>');
  632. $('.ad_position_'+positionIndex).append(containElement);
  633. postscribe(containElement[0], materialItem.js_code);
  634. }else if(materialItem.type==2){
  635. $('.ad_position_'+positionIndex).append('<div class="ad-image-small ad-image" data-type="2"><div class="'+materialItem.ad_baidu+'"></div></div>');
  636. (window.slotbydup = window.slotbydup || []).push({
  637. id: materialItem.ad_baidu,
  638. container: materialItem.ad_baidu,
  639. async: true
  640. });
  641. }
  642. _sendLog(ADData.ad_ids,positionIndex,materialItem.material_id);
  643. _addListener();
  644. }
  645. function _renderPrimary(ADData,positionIndex,materials,willInsertElements,insertPosition,hasBeStillToday,showMask){
  646. if(!ADData || ADData.material_ids && ADData.material_ids.length<1){
  647. return;
  648. }
  649. var materialItems = _getSortedMaterials(ADData,materials,1);
  650. if(!materialItems || materialItems.length == 0){
  651. return;
  652. }
  653. var materialItem = materialItems[0];
  654. if(materialItem.type == 0){
  655. var template = '<div class="ad-image-primary ad-image" class="ad-image" data-link-url="'+materialItem.link_url+'" data-m-id="'+materialItem.material_id+'" data-user-id="'+simpleAD.userId+'" data-position="'+positionIndex+'" data-ad-ids="'+ADData.ad_ids+'">'+
  656. '<img class="ad-image-tip" src="http://'+window.location.host+'/assets/img/frontend/ad/ad_tip.png" />'+
  657. '<img src="'+materialItem.img_url+'" alt=""/>'+
  658. // 垃圾代码:展示范围
  659. (hasBeStillToday && hasBeStillToday == 'no' && showMask ?'<div class="ad-mask"></div>':'')+
  660. '</div>';
  661. if(willInsertElements && insertPosition) {
  662. $(willInsertElements[insertPosition]).after(template);
  663. }
  664. }else if(materialItem.type==1){
  665. var container = $('<div class="ad-image ad-image-primary" data-type="1" data-position="'+positionIndex+'">'+
  666. // 垃圾代码:展示范围
  667. (hasBeStillToday && hasBeStillToday == 'no' && showMask ?'<div class="ad-mask"></div>':'')+
  668. '</div>');
  669. if(willInsertElements && insertPosition) {
  670. $(willInsertElements[insertPosition]).after(container);
  671. postscribe(container[0], materialItem.js_code);
  672. }
  673. }else if(materialItem.type==2){
  674. if(willInsertElements && insertPosition) {
  675. $(willInsertElements[insertPosition]).after('<div class="'+materialItem.ad_baidu+' ad-image"></div>');
  676. (window.slotbydup = window.slotbydup || []).push({
  677. id: materialItem.ad_baidu,
  678. container: materialItem.ad_baidu,
  679. async: true
  680. });
  681. }
  682. }
  683. _sendLog(ADData.ad_ids,positionIndex,materialItem.material_id);
  684. _addListener();
  685. }
  686. function _renderLarge(ADData,positionIndex,materials,willInsertElements,insertPosition,hasBeStillToday,showMask){
  687. if(!ADData || ADData.material_ids && ADData.material_ids.length<1){
  688. return;
  689. }
  690. var materialItems = _getSortedMaterials(ADData,materials,1);
  691. if(!materialItems || materialItems.length == 0){
  692. return;
  693. }
  694. if(positionIndex==AD_POSITION_CODE.BOOK_READING_TOP_BANNER){
  695. $('.ad_position_18').show();
  696. }
  697. var materialItem = materialItems[0];
  698. if(materialItem.type == 0){
  699. var template = ((positionIndex == AD_POSITION_CODE.BOOK_READING_BOTTOM || positionIndex == AD_POSITION_CODE.BOOK_READING_NEXT_CHAPTER || positionIndex == AD_POSITION_CODE.BOOK_READING_MIDDLE_LARGE || positionIndex == AD_POSITION_CODE.RANKING_LIST || positionIndex == AD_POSITION_CODE.BOOK_READING_TOP_BANNER) ? '':'<div class="ad_image_warp">')+
  700. '<div class="ad-image-large ad-image" class="ad-image" data-link-url="'+materialItem.link_url+'" data-m-id="'+materialItem.material_id+'" data-user-id="'+simpleAD.userId+'" data-position="'+positionIndex+'" data-ad-ids="'+ADData.ad_ids+'">'+
  701. '<img class="ad-image-tip" src="http://'+window.location.host+'/assets/img/frontend/ad/ad_tip.png" />'+
  702. '<img src="'+materialItem.img_url+'" alt=""/>'+
  703. // 垃圾代码:展示范围
  704. (hasBeStillToday && hasBeStillToday == 'no' && showMask ?'<div class="ad-mask"></div>':'')+
  705. '</div>'+
  706. ((positionIndex == AD_POSITION_CODE.BOOK_READING_BOTTOM || positionIndex == AD_POSITION_CODE.BOOK_READING_NEXT_CHAPTER || positionIndex == AD_POSITION_CODE.BOOK_READING_MIDDLE_LARGE || positionIndex == AD_POSITION_CODE.RANKING_LIST) ? '':'</div>');
  707. if(willInsertElements && insertPosition>=0) {
  708. $(willInsertElements[insertPosition]).after(template);
  709. }else{
  710. $('.ad_position_'+positionIndex).append(template);
  711. }
  712. }else if(materialItem.type==1){
  713. var container = $('<div class="ad-image ad-image-large" data-type="1" data-position="'+positionIndex+'">'+
  714. // 垃圾代码:展示范围
  715. (hasBeStillToday && hasBeStillToday == 'no' && showMask ?'<div class="ad-mask"></div>':'')+
  716. '</div>');
  717. if(willInsertElements && insertPosition>=0) {
  718. $(willInsertElements[insertPosition]).after(container);
  719. }else{
  720. $('.ad_position_'+positionIndex).append(container);
  721. }
  722. postscribe(container[0], materialItem.js_code);
  723. }else if(materialItem.type==2){
  724. if(willInsertElements && insertPosition>=0) {
  725. $(willInsertElements[insertPosition]).after('<div class="'+materialItem.ad_baidu+' ad-image"></div>');
  726. }else{
  727. $('.ad_position_'+positionIndex).append('<div class="'+materialItem.ad_baidu+' ad-image"></div>');
  728. }
  729. (window.slotbydup = window.slotbydup || []).push({
  730. id: materialItem.ad_baidu,
  731. container: materialItem.ad_baidu,
  732. async: true
  733. });
  734. }
  735. // 下一章所对应广告在弹窗中,不能在初始化时直接打点曝光 ,此项曝光在弹窗显示时打点,见:simpleAD.showReadAlert
  736. if(positionIndex != AD_POSITION_CODE.BOOK_READING_NEXT_CHAPTER){
  737. _sendLog(ADData.ad_ids,positionIndex,materialItem.material_id);
  738. }
  739. _addListener();
  740. if(positionIndex == AD_POSITION_CODE.MY_CONTENT){
  741. $('.ad_other_item').hide();
  742. }
  743. }
  744. function _renderFlow(ADData,positionIndex,materials){
  745. if(!ADData || ADData.material_ids && ADData.material_ids.length<1){
  746. return;
  747. }
  748. var materialItems = _getSortedMaterials(ADData,materials,1);
  749. if(!materialItems || materialItems.length == 0){
  750. return;
  751. }
  752. var materialItem = materialItems[0];
  753. var template = '<div class="ad-image-large ad-image" class="ad-image" data-link-url="'+materialItem.link_url+'" data-m-id="'+materialItem.material_id+'" data-user-id="'+simpleAD.userId+'" data-position="'+positionIndex+'" data-ad-ids="'+ADData.ad_ids+'">'+
  754. '<img src="'+materialItem.img_url+'" alt=""/>'+
  755. '</div>';
  756. $('.ad_position_'+positionIndex).append(template);
  757. _sendLog(ADData.ad_ids,positionIndex,materialItem.material_id);
  758. _addListener();
  759. }
  760. function _renderAlert(ADData,positionIndex,materials){
  761. if(!ADData || ADData.material_ids && ADData.material_ids.length<1){
  762. return;
  763. }
  764. var materialItems = _getSortedMaterials(ADData,materials,1);
  765. if(!materialItems || materialItems.length == 0){
  766. return;
  767. }
  768. var materialItem = materialItems[0];
  769. var materialItem = materialItems[0];
  770. if(materialItem.type == 0){
  771. var template = '<div class="ad-image-large ad-image" class="ad-image" data-link-url="'+materialItem.link_url+'" data-m-id="'+materialItem.material_id+'" data-user-id="'+simpleAD.userId+'" data-position="'+positionIndex+'" data-ad-ids="'+ADData.ad_ids+'">'+
  772. '<img class="ad-image-tip" src="http://'+window.location.host+'/assets/img/frontend/ad/ad_tip.png" />'+
  773. '<img src="'+materialItem.img_url+'" alt=""/>'+
  774. '</div>';
  775. $('.ad_position_'+positionIndex).append(template);
  776. }else if(materialItem.type==1){
  777. var container = $('<div class="ad-image"></div>');
  778. $('.ad_position_'+positionIndex).append(container);
  779. postscribe(container[0], materialItem.js_code);
  780. }else if(materialItem.type==2){
  781. $('.ad_position_'+positionIndex).append('<div class="'+materialItem.ad_baidu+' ad-image"></div>');
  782. (window.slotbydup = window.slotbydup || []).push({
  783. id: materialItem.ad_baidu,
  784. container: materialItem.ad_baidu,
  785. async: true
  786. });
  787. }
  788. _addListener();
  789. }
  790. function _renderADChapter(ADData,positionIndex,materials){
  791. if(window.location.pathname.indexOf('ad_chapter')>0){
  792. _renderLarge(ADData,positionIndex,materials);
  793. }else{
  794. // TODO:获取当前章节索引
  795. if((window.ad_chapter_index-ADData.chapter_start_num)%ADData.chapter_step_num == 0){
  796. shouldGoToADChapter = true;
  797. }else{
  798. shouldGoToADChapter = false;
  799. }
  800. var materialItems = _getSortedMaterials(ADData,materials,1);
  801. // 如果没有匹配到可展示素材,也不应该跳转到阅读页整屏插屏广告页
  802. if(!materialItems || materialItems.length == 0){
  803. shouldGoToADChapter = false;
  804. }
  805. }
  806. }
  807. function _getSortedMaterials(ADData,materials,count){
  808. var materialItems = [];
  809. var jsMaterialItems = [];
  810. var baiduMaterialItems = [];
  811. var weightClassifyItems = {};
  812. var materialKeys = ADData.material_ids || [];
  813. for (var i = 0;i<materialKeys.length;i++){
  814. var materialItemKey = materialKeys[i];
  815. var materialItem = materials[materialItemKey];
  816. var now = new Date().getTime();
  817. if(materialItem && materialItem.show_starttime * 1000 < now && materialItem.show_endtime * 1000 > now){
  818. materialItem = $.extend(true,{material_id:materialItemKey},materialItem);
  819. var weight = materialItem.weight;
  820. !weightClassifyItems[weight] && (weightClassifyItems[weight] = []);
  821. weightClassifyItems[weight].push(materialItem);
  822. }
  823. }
  824. var weightClassifyItemsKeys = Object.keys(weightClassifyItems);
  825. weightClassifyItemsKeys.sort(function(pre,next){
  826. return next -pre;
  827. });
  828. for(var j=0;j<weightClassifyItemsKeys.length;j++){
  829. // 还需要的素材个数
  830. var needToInsertNumber = count - materialItems.length;
  831. if(needToInsertNumber == 0){
  832. return materialItems;
  833. }
  834. // 当前权重的值
  835. var weightClassifyItemsKey = weightClassifyItemsKeys[j];
  836. // 当前权重所包含的全部素材
  837. var weightClassifyMaterialItems = weightClassifyItems[weightClassifyItemsKey];
  838. // 素材个数
  839. var length = weightClassifyMaterialItems.length;
  840. jsMaterialItems = [];
  841. baiduMaterialItems = [];
  842. // 遍历当前权重素材,找出js广告和百度广告
  843. for(var x=0;x<length;x++){
  844. var item = weightClassifyMaterialItems[x];
  845. // JS广告
  846. if(item.type == 1){
  847. jsMaterialItems = jsMaterialItems.concat(weightClassifyMaterialItems.splice(x,1));
  848. length -= 1;
  849. // 重新开始过滤
  850. x = -1;
  851. }
  852. // 百度广告
  853. if(item.type == 2){
  854. baiduMaterialItems = baiduMaterialItems.concat(weightClassifyMaterialItems.splice(x,1));
  855. length -= 1;
  856. // 重新开始过滤
  857. x = -1;
  858. }
  859. }
  860. // 优先筛选js广告
  861. if(jsMaterialItems.length){
  862. var jsFitItems = _getRandomItems(jsMaterialItems,needToInsertNumber);
  863. if(jsFitItems.length){
  864. materialItems = materialItems.concat(jsFitItems);
  865. needToInsertNumber = needToInsertNumber-jsFitItems.length;
  866. jsFitItems = [];
  867. if(needToInsertNumber == 0){
  868. return materialItems;
  869. }
  870. }
  871. }
  872. // 其次筛选百度广告
  873. if(baiduMaterialItems.length){
  874. var baiduFitItems = _getRandomItems(baiduMaterialItems,needToInsertNumber);
  875. if(baiduFitItems.length){
  876. materialItems = materialItems.concat(baiduFitItems);
  877. needToInsertNumber = needToInsertNumber-baiduFitItems.length;
  878. baiduFitItems = [];
  879. if(needToInsertNumber == 0){
  880. return materialItems;
  881. }
  882. }
  883. }
  884. // 如果js广告和百度广告没有获取到足够素材,则从剩余素材中随机选取所需素材
  885. var imageItems = _getRandomItems(weightClassifyMaterialItems,needToInsertNumber);
  886. if(imageItems.length){
  887. materialItems = materialItems.concat(imageItems);
  888. needToInsertNumber = needToInsertNumber-imageItems.length;
  889. imageItems = [];
  890. if(needToInsertNumber == 0){
  891. return materialItems;
  892. }else{
  893. continue;
  894. }
  895. }else{
  896. continue;
  897. }
  898. }
  899. return materialItems;
  900. }
  901. function _getRandomItems(totalItems,needToInsertNumber){
  902. var materialItems = [];
  903. // 素材个数小于所需素材数
  904. var length = totalItems.length;
  905. if(length <=needToInsertNumber){
  906. materialItems = materialItems.concat(totalItems);
  907. //素材个数大于所需素材数
  908. }else{
  909. // 从当前权重素材中随机取 needToInsertNumber 个素材
  910. for(var k=0;k<needToInsertNumber;k++){
  911. materialItems.push(totalItems.splice(Math.floor(Math.random()*length),1)[0]);
  912. length -= 1;
  913. }
  914. }
  915. return materialItems;
  916. }
  917. function _sendLog(adIds,position,mId){
  918. cpslog([702, {
  919. map: {
  920. ad_ids:parseInt(adIds),
  921. position:position,
  922. material_id:mId,
  923. channel_id: simpleAD.channelId || '',
  924. user_id:simpleAD.userId || ''
  925. }
  926. }, 'ad_sys_show']);
  927. }
  928. function _addListener(){
  929. $('.ad-image').unbind().bind('click',function(e){
  930. e.stopPropagation();
  931. var target = e.currentTarget;
  932. var mId = target.dataset.mId;
  933. var adIds = target.dataset.adIds;
  934. var position = target.dataset.position;
  935. var userId = target.dataset.userId;
  936. var type = target.dataset.type;
  937. // 垃圾代码:用户主动点击后,记录到localstorage中
  938. if($(e.target).hasClass('ad-mask')){
  939. localStorage.removeItem('still_click_position_'+position);
  940. localStorage.setItem('still_click_position_'+position,JSON.stringify({beStill:'yes',time:new Date().getTime()}));
  941. }
  942. cpslog([702, {
  943. map: {
  944. ad_ids:adIds,
  945. position:position,
  946. material_id:mId,
  947. channel_id: simpleAD.channelId || '',
  948. user_id:simpleAD.userId || ''
  949. }
  950. }, 'ad_sys_click']);
  951. if(type && type != 0){
  952. if($(e.target).hasClass('ad-image') || $(e.target).hasClass('ad-mask')){
  953. $(target).find('#equjhhhh a').click();
  954. return false;
  955. }
  956. }
  957. target.dataset.linkUrl && (location.href = target.dataset.linkUrl);
  958. });
  959. }
  960. function _initSwiper(){
  961. var ad_swiper = new Swiper('.ad-swiper-container', {
  962. loop : false,
  963. centeredSlides: true,
  964. autoplay: {
  965. delay: 2500,
  966. disableOnInteraction: false,
  967. },
  968. pagination: {
  969. el: '.swiper-pagination',
  970. clickable: true,
  971. },
  972. });
  973. }
  974. window.AD_PAGE_CODE = PAGE_CODE;
  975. window.simpleAD = simpleAD;
  976. });