PageSourceSearch

https://static.to8to.com/to8to_pc/common/widgets/adLoader/adLoader.js?v=1756313563

js to8to.com collected 2026-10-02 18:55:13 UTC 32,428 bytes, 1,020 lines download raw bytes

1;(function(root, factory) {
2    if (typeof exports === 'object') {
3        require('./adLoader.css')
4        module.exports = factory(require('jquery'))
5    } else {
6        if (typeof jQuery === 'undefined') {
7            throw new Error(
8                "adloader's JavaScript requires jQuery. jQuery must be included before adloader's JavaScript. "
9            )
10        }
11        root.AdLoader = factory(jQuery)
12    }
13})(window, function($) {
14    window.Global || (Global = {fullHost: window.location.origin, authHost: window.location.origin,apiHost:window.location.origin});
15    Global.isAndroid = window.navigator.userAgent.indexOf('Android') > -1 || window.navigator.userAgent.indexOf('Linux') > -1; //android终端或者uc浏览器;
16    Global.isiOS = /iPhone|iPad|iPod|ios|IOS/.test(window.navigator.userAgent);
17
18    var loadedAdsKeys = []
19    // 获取城市名
20    function getCityName() {
21        return userInfo('to8to_wap_tname', 'to8to_tname')
22    }
23
24    // 获取 uid
25    function getUid() {
26        return userInfo('to8to_uid', 'to8to_uid')
27    }
28
29    // 获取cookie。  name 中不得含有需要转义的字符
30    function getCookie(name) {
31        var r = new RegExp('(\\b)' + name + '=([^;]*)(;|$)')
32        var m = document.cookie.match(r)
33        var val = ''
34        try {
35            val = !m ? '' : decodeURIComponent(m[2])
36        } catch (e) {
37            val = !m ? '' : m[2]
38        }
39        return val
40    }
41    // 判断移动端。 移动端返回 true
42    function getDeviceInfo() {
43        return !!navigator.userAgent.match(
44            /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i
45        )
46    }
47    /*
48     * 取用户信息
49     * wap 为取移动端存储的信息
50     * pc 为PC上存储的信息
51     */
52    function userInfo(wap, pc) {
53        return getDeviceInfo() ? getCookie(wap) : getCookie(pc)
54    }
55
56    function findItem(dataSource, key, value) {
57        var item = {}
58        if ($.isArray(dataSource)) {
59            for (var i = dataSource.length; i > 0; i--) {
60                if (dataSource[i - 1][key] === value) {
61                    item = dataSource[i - 1]
62                    break
63                }
64            }
65        } else if (dataSource && dataSource[key] === value) {
66            item = dataSource
67        }
68        return item
69    }
70
71    function isIncludeKeys(keys, key) {
72        var flag = false
73        $.each(keys, function(index, value) {
74            if (value === key) {
75                flag = true
76                return false
77            }
78        })
79        return flag
80    }
81
82    function getInlineWidthAndHeight($container) {
83        var $c = $($container[0])
84        return {
85            width: $c.width(),
86            height: $c.height(),
87        }
88    }
89
90    function mergeClass() {
91        var classes = []
92        $.each(arguments, function(index, value) {
93            if (value && typeof value === 'string') {
94                classes.push(value)
95            }
96        })
97        return classes.join(' ')
98    }
99
100    function getAdNodesProps(selector) {
101        var props = []
102        var $adConatiners = $(selector)
103        if ($adConatiners.length === 0) {
104            return props
105        }
106        $.each($adConatiners, function(index, item) {
107            var id = $(item).attr('id')
108            if (id && !isIncludeKeys(loadedAdsKeys, id)) {
109                props.push({
110                    id: id,
111                })
112            }
113        })
114        return props
115    }
116
117    function hiddenContainer(container) {
118        $(container).css({
119            display: 'none',
120        })
121    }
122    function showContainer(container) {
123        $(container).css({
124            display: 'block',
125        })
126    }
127    /**
128     * 添加广告标识
129     * @param {*} options
130     */
131    function getAdmarkDomString(options) {
132        var size = options.size || 'normal'
133        var theme = options.theme
134        var className = mergeClass('ad-mark', size, theme)
135        return '<div class="' + className + '"></div>'
136    }
137
138    function getAdLoaderUrl(adskeys, options) {
139        var api = options.api
140        var client = options.client
141        var pt = options.pt
142        var city = getCityName()
143        var material_type = $(options.selector).attr('material-type')
144        var joinedKeys = adskeys.join(',')
145        var userUid = getUid() || '' // 用户id
146        var url = api + '?' + 'adskey=' + joinedKeys + '&pt=' + pt
147        if (city !== '') {
148            url = url + '&city=' + city
149        }
150        if (client) {
151            url = url + '&client=' + client
152        }
153        if (material_type !== '' && material_type != undefined) {
154            url = url + '&material_type=' + material_type
155        }
156        if (userUid) {
157            url = url + '&uid=' + userUid
158        }
159        return url
160    }
161
162    function setWidthAndHeight($ele, width, height) {
163        var css = {}
164        if (width && parseInt(width) !== 0) {
165            css.width = width
166        }
167        if (height && parseInt(height) !== 0) {
168            css.height = height
169        }
170        $ele.css(css)
171    }
172
173    function isWap() {
174        var userAgentInfo = navigator.userAgent
175        var agents = ['Android', 'iPhone', 'Windows Phone', 'iPad', 'iPod']
176        var flag = false
177        for (var v = 0; v < agents.length; v++) {
178            if (userAgentInfo.indexOf(agents[v]) > 0) {
179                flag = true
180                break
181            }
182        }
183        return flag
184    }
185
186    /**
187     * 自定义广告渲染
188     * @param {*}
189     * @param {*} renderOption
190     */
191    function supportCustomRender(data, $container, renderOption) {
192        var render = renderOption.render
193        var appendedCallback = renderOption.appendedCallback
194        if (typeof render === 'function') {
195            var element = render(data)
196            $container.append(element)
197            if (typeof appendedCallback === 'function') {
198                appendedCallback(element)
199            }
200            return true
201        } else {
202            return false
203        }
204    }
205
206    /**
207     * 点击、曝光统计
208     */
209    function reportData() {
210        var exptags = []
211        var selector = this.config.selector
212        var report = function() {
213            $(selector + ' [data-ptag]').each(function(index, ele) {
214                var $ele = $(ele)
215                var ptag = $ele.data('ptag')
216                var exptag = $ele.data('exptag')
217                if (exptags.join().indexOf(exptag) === -1) {
218                    exptags.push(exptag)
219                }
220                $ele.click(function() {
221                    clickStream.getCvParams(ptag)
222                })
223            })
224            for (var i = exptags.length; i > 0; i--) {
225                clickStream.getCvParams(exptags[i - 1])
226            }
227        }
228        if (
229            typeof clickStream !== 'undefined' &&
230            typeof clickStream.getCvParams === 'function'
231        ) {
232            report()
233        }
234    }
235
236    function reportCountData() {
237        if (typeof t8tc !== 'undefined') {
238            t8tc.postParams({
239                evt: 'click',
240                pg: $(this).data('pg'),
241                rsc: [
242                    {
243                        rty: $(this).data('rty'),
244                        rid: $(this).data('rid'),
245                        rtt: $(this).data('rtt'),
246                        radk: $(this).data('radk'),
247                    },
248                ],
249            })
250        }
251    }
252
253    function reportExposureData(el) {
254        if (typeof t8tc !== 'undefined') {
255            t8tc.postParams({
256                evt: 'show',
257                pg: el.data('pg'),
258                rsc: [
259                    {
260                        rty: el.data('rty'),
261                        rid: el.data('rid'),
262                        rtt: el.data('rtt'),
263                        radk: el.data('radk'),
264                    },
265                ],
266            })
267        }
268    }
269
270    function isEleInView(el) {
271        var elOffsetTop = $(el).offset().top,
272            elOuterHeight = $(el).outerHeight(),
273            windowHeight = $(window).height(),
274            windowScrollTop = $(window).scrollTop()
275
276        return (
277            !(windowScrollTop > elOffsetTop + elOuterHeight) &&
278            !(windowScrollTop < elOffsetTop - windowHeight)
279        )
280    }
281
282    function debounce(method, delay) {
283        var timer = null
284        return function() {
285            var self = this,
286                args = arguments
287            timer && clearTimeout(timer)
288            timer = setTimeout(function() {
289                method.apply(self, args)
290            }, delay)
291        }
292    }
293
294    function adHasBeenExposed(ad) {
295        return exposureAds.indexOf(ad) > -1
296    }
297
298    function initReportExposureData() {
299        $.each($('.ad-data-report'), function(index, el) {
300            var ad = $(el).data('rid')
301
302            if (adHasBeenExposed(ad) || !isEleInView(el)) {
303                return
304            } else {
305                if (
306                    $(el).hasClass('ad-data-report-carousel') &&
307                    !$(el)
308                        .parent()
309                        .hasClass('swiper-slide-active')
310                ) {
311                    return
312                }
313
314                exposureAds.push(ad)
315                reportExposureData($(el))
316            }
317        })
318    }
319
320    var exposureAds = []
321
322    ;(function() {
323        $(window).on('scroll', debounce(initReportExposureData, 200))
324
325        $('body').on('click', '.ad-data-report', function() {
326            reportCountData.call(this)
327        })
328    })()
329
330    /**
331     * 静态图式广告
332     * @param {*} data
333     * @param {*} container
334     * @param {*} renderOption
335     */
336    function loadAdWithBanner(data, container, renderOption) {
337        var $container = $(container)
338        if (supportCustomRender(data, $container, renderOption)) {
339            return
340        }
341        if (!data || !data.folder || !data.folder.length > 0) {
342            hiddenContainer(container)
343            return
344        }
345
346        var folder = data.folder[0]
347        var theme = renderOption.theme || {}
348        var showTxt = renderOption.showTxt || ''
349        var adMarkOption = renderOption.adMark || {}
350        var linkClasses = mergeClass(
351            'ad-data-report',
352            'ad-banner-link',
353            theme.link
354        )
355        var imgClasses = mergeClass(theme.img)
356        var txtClasses = mergeClass('ad-banner-txt', theme.txt)
357
358        var rty = 'ad',
359            rid = folder.adpos_id || '',
360            rtt = folder.txt || '',
361            radk = data.adskey || ''
362
363        if (!folder.resource_url) {
364            if (Array.isArray(folder.material) && folder.material.length >= 1) {
365                folder.resource_url = folder.material[0]['resource_url']
366            }
367        }
368
369        if (!folder.link_to) {
370            folder.link_to = Global.isiOS ? folder.ios_url : folder.android_url
371        }
372
373        var fragment =
374            '<a href="' +
375            folder.link_to +
376            '" rel="nofollow" class="' +
377            linkClasses +
378            '" data-ptag="' +
379            (folder.ptag || '') +
380            '" data-exptag="' +
381            (folder.exptag || '') +
382            '" data-pg="' +
383            (folder.ptag || '') +
384            '" data-rty="' +
385            rty +
386            '" data-rid="' +
387            rid +
388            '" data-rtt="' +
389            rtt +
390            '" data-radk="' +
391            radk +
392            '">' +
393            '<img src="' +
394            folder.resource_url +
395            '" class="' +
396            imgClasses +
397            '">'
398        if (showTxt) {
399            fragment =
400                fragment +
401                '<span class="' +
402                txtClasses +
403                '">' +
404                folder.txt +
405                '</span>'
406        }
407        fragment = fragment + '</a>'
408        if (parseInt(folder.flag)) {
409            fragment = fragment + getAdmarkDomString(adMarkOption)
410        }
411        $container.append(fragment)
412
413        if (!this.config.isWap) {
414            setWidthAndHeight($container.find('img'), data.width, data.height)
415        }
416        showContainer(container)
417    }
418
419    /**
420     * 轮播式广告
421     * @param {*} data
422     * @param {*} container
423     * @param {*} renderOption
424     */
425    function loadAdWithCarousel(data, container, renderOption) {
426        var $container = $(container)
427        if (supportCustomRender(data, $container, renderOption)) {
428            return
429        }
430        if (!data || !data.folder || !data.folder.length > 0) {
431            hiddenContainer(container)
432            return
433        }
434        var folder = data.folder
435        var result = folder.length > 1
436        var size = getInlineWidthAndHeight($container)
437        var swiperId = 'swiperContainer' + data.adskey
438        var swiperBtnsId = 'swiperBtns' + data.adskey
439        var sliders = ''
440
441        var rty = 'ad',
442            radk = data.adskey || ''
443        var swiperOptions = $.extend(
444            {
445                autoplay: result ? 3000 : 0,
446                loop: false,
447                simulateTouch: result ? true : false,
448                pagination: result ? '#' + swiperBtnsId : '',
449                paginationType: this.config.isWap ? 'bullets' : 'line',
450                autoplayDisableOnInteraction: false,
451                onSlideChangeEnd: function(swiper) {
452                    var el = $(swiper.slides[swiper.activeIndex]).find(
453                        '.ad-data-report'
454                    )
455                    var ad = el.data('rid')
456
457                    if (
458                        adHasBeenExposed(ad) ||
459                        !isEleInView('.t8t-ad-swiper')
460                    ) {
461                        return
462                    } else {
463                        exposureAds.push(ad)
464                        reportExposureData(el)
465                    }
466                },
467            },
468            renderOption.swiperOptions
469        )
470
471        var theme = renderOption.theme || {}
472        var showTxt = renderOption.showTxt || ''
473        var adMarkOption = renderOption.adMark || {}
474        var autoplay = renderOption.adMark || 3000
475        var loop = renderOption.adMark || true
476
477        // custom theme
478        var rootClass = mergeClass('ad-carousel-container', theme.root)
479        if (result) {
480            var arrowLeftClass = mergeClass(
481                'ad-carousel-arrow-left',
482                theme.arrow,
483                theme.arrowLeft
484            )
485            var arrowRightClass = mergeClass(
486                'ad-carousel-arrow-right',
487                theme.arrow,
488                theme.arrowRight
489            )
490        }
491        var arrowIconLeftClass = mergeClass(
492            'ad-carousel-arrow-icon',
493            'ad-carousel-arrow-icon-left',
494            theme.arrowIconLeft
495        )
496        var arrowIconRightClass = mergeClass(
497            'ad-carousel-arrow-icon',
498            'ad-carousel-arrow-icon-right',
499            theme.arrowIconRight
500        )
501
502        var swiperContainerClass = mergeClass(
503            'swiper-container',
504            't8t-ad-swiper',
505            theme.swiperContainer
506        )
507        var swiperWrapperClass = mergeClass(
508            'swiper-wrapper',
509            theme.swiperWrapper
510        )
511        var swiperSlideClass = mergeClass(
512            'swiper-slide',
513            'ad-carousel-swiper-slide',
514            theme.swiperSlide
515        )
516
517        var swiperSlideLinkClass = mergeClass(
518            'ad-data-report',
519            'ad-data-report-carousel',
520            'ad-carousel-swiper-slide-link',
521            theme.swiperSlideLink
522        )
523        var swiperSlideTitle = mergeClass(
524            'ad-carousel-swiper-slide-title',
525            theme.swiperSlideTitle
526        )
527        var sliderBtnsClass = mergeClass(
528            'ad-carousel-slider-btns',
529            'slider-btns-style-' + swiperOptions.paginationType,
530            theme.sliderBtns
531        )
532
533        for (var i = 0, length = folder.length; i < length; i++) {
534            var folderItem = folder[i],
535                rid = folderItem.adpos_id || '',
536                rtt = folderItem.txt || ''
537
538            if(!folderItem.resource_url) {
539                if (Array.isArray(folderItem.material) && folderItem.material.length >= 1) {
540                    folderItem.resource_url = folderItem.material[0]['resource_url']
541                }
542            }
543
544            if (!folderItem.link_to) {
545                folderItem.link_to = Global.isiOS ? folderItem.ios_url : folderItem.android_url
546            }
547
548            var sliderItem =
549                '<div class="' +
550                swiperSlideClass +
551                '">' +
552                '<a href="' +
553                folderItem.link_to +
554                '" target="_blank" class="' +
555                swiperSlideLinkClass +
556                '" data-ptag="' +
557                (folderItem.ptag || '') +
558                '" data-exptag="' +
559                (folderItem.exptag || '') +
560                '" data-pg="' +
561                (folderItem.ptag || '') +
562                '" data-rty="' +
563                rty +
564                '" data-rid="' +
565                rid +
566                '" data-rtt="' +
567                rtt +
568                '" data-radk="' +
569                radk +
570                '">' +
571                '<img src="' +
572                folderItem.resource_url +
573                '">'
574
575            if (showTxt) {
576                sliderItem =
577                    sliderItem +
578                    '<span class="' +
579                    swiperSlideTitle +
580                    '">' +
581                    folderItem.txt +
582                    '</span>'
583            }
584            sliderItem = sliderItem + '</a>'
585            if (parseInt(folderItem.flag)) {
586                sliderItem = sliderItem + getAdmarkDomString(adMarkOption)
587            }
588            sliderItem = sliderItem + '</div>'
589            sliders = sliders + sliderItem
590        }
591        var swiperContainer =
592            '<div class="' +
593            swiperContainerClass +
594            '">' +
595            '<div class="' +
596            swiperWrapperClass +
597            '">' +
598            sliders +
599            '</div>' +
600            '</div>'
601
602        swiperContainer =
603            '<div class="' +
604            rootClass +
605            '" id="' +
606            swiperId +
607            '">' +
608            '<a href="javascript:void(0);" class="' +
609            arrowLeftClass +
610            '"><span class="' +
611            arrowIconLeftClass +
612            '"></span></a>' +
613            '<a href="javascript:void(0);" class="' +
614            arrowRightClass +
615            '"><span class="' +
616            arrowIconRightClass +
617            '"></span></a>' +
618            swiperContainer
619        if (swiperOptions.pagination) {
620            swiperContainer =
621                swiperContainer +
622                '<div class="' +
623                sliderBtnsClass +
624                '" id="' +
625                swiperBtnsId +
626                '"></div>'
627        }
628
629        swiperContainer = swiperContainer + '</div>'
630
631        $container.append(swiperContainer)
632
633        if (!this.config.isWap) {
634            setWidthAndHeight(
635                $container.find('.swiper-container'),
636                data.width || size.width,
637                data.height || size.height
638            )
639            setWidthAndHeight($container.find('.swiper-container img'), '100%')
640        }
641
642        var initSwiper = function() {
643            var swiperObj = new Swiper(
644                '#' + swiperId + ' .swiper-container',
645                swiperOptions
646            )
647
648            $('#' + swiperBtnsId).css({
649                marginLeft:
650                    '-' + parseFloat($('#' + swiperBtnsId).width()) / 2 + 'px',
651                left: '50%',
652            })
653
654            $('#' + swiperId + ' .ad-carousel-arrow-left').click(function() {
655                swiperObj.swipePrev()
656                setTimeout(function() {
657                    swiperObj.startAutoplay()
658                }, 3000)
659            })
660            $('#' + swiperId + ' .ad-carousel-arrow-right').click(function() {
661                swiperObj.swipeNext()
662                setTimeout(function() {
663                    swiperObj.startAutoplay()
664                }, 3000)
665            })
666            var $switch = $('#' + swiperBtnsId + ' .swiper-pagination-switch')
667            $switch.click(function() {
668                var index = $switch.index(this)
669                swiperObj.swipeTo(index, 1000, false)
670                swiperObj.stopAutoplay()
671                setTimeout(function() {
672                    swiperObj.startAutoplay()
673                }, 0)
674            })
675        }
676
677        if (!window.Swiper) {
678            var cssURL =
679                '//static.to8to.com/to8to_pc/common/libs/swiper-2.7/swiper.css'
680            var linkTag = $(
681                '<link href="' +
682                    cssURL +
683                    '" rel="stylesheet" type="text/css" " charset="utf-8"/>'
684            )
685            $($('head')[0]).append(linkTag)
686            $.getScript(
687                '//static.to8to.com/to8to_pc/common/libs/swiper-2.7/swiper-2.7.js',
688                initSwiper
689            )
690        } else {
691            initSwiper()
692        }
693        showContainer(container)
694    }
695
696    function loadAdWithScript(data, container, renderOption) {
697        var $container = $(container)
698        if (supportCustomRender(data, $container, renderOption)) {
699            return
700        }
701        if (!data || !data.folder || !data.folder.length > 0) {
702            hiddenContainer(container)
703            return
704        }
705        var folder = data.folder[0]
706        var size = getInlineWidthAndHeight($container)
707
708        var theme = renderOption.theme || {}
709        var showTxt = renderOption.showTxt || ''
710        var adMark = renderOption.adMark || {}
711        var iframeClass = mergeClass('ad-script-iframe', theme.iframe)
712        var txtClasses = mergeClass('ad-script-txt', theme.txt)
713
714        var adFrame =
715            '<iframe src="' +
716            folder.resource_url +
717            '" class="' +
718            iframeClass +
719            '" data-ptag="' +
720            (folder.ptag || '') +
721            '" data-exptag="' +
722            (folder.exptag || '') +
723            '">' +
724            '</iframe>'
725        if (showTxt) {
726            adFrame =
727                adFrame +
728                '<span class="' +
729                txtClasses +
730                '">' +
731                folder.txt +
732                '</span>'
733        }
734        if (parseInt(folder.flag)) {
735            adFrame = adFrame + getAdmarkDomString(adMark)
736        }
737        $container.append(adFrame)
738        if (!this.config.isWap) {
739            setWidthAndHeight(
740                $container.find('iframe'),
741                data.width || size.width,
742                data.height || size.height
743            )
744        }
745    }
746
747    function loadAdWithxTile(data, container, renderOption) {
748        var $container = $(container)
749        if (supportCustomRender(data, $container, renderOption)) {
750            return
751        }
752        if (!data || !data.folder || !data.folder.length > 0) {
753            hiddenContainer(container)
754            return
755        }
756    }
757
758    function loadAdWithyTile(data, container, renderOption) {
759        var $container = $(container)
760        if (supportCustomRender(data, $container, renderOption)) {
761            return
762        }
763        if (!data || !data.folder || !data.folder.length > 0) {
764            hiddenContainer(container)
765            return
766        }
767
768        var folder = data.folder
769        var theme = renderOption.theme || {}
770        var showTxt = renderOption.showTxt || ''
771        var adMarkOption = renderOption.adMark || {}
772        var linkClasses = mergeClass(
773            'ad-data-report',
774            'ad-banner-link',
775            theme.link
776        )
777        var imgClasses = mergeClass(theme.img)
778        var txtClasses = mergeClass('ad-banner-txt', theme.txt)
779
780        var rty = 'ad',
781            radk = data.adskey || ''
782
783        var childs = ''
784        $.each(folder, function(index, item) {
785            var rid = item.adpos_id || '',
786                rtt = item.txt || ''
787            var fragment =
788                '<a href="' +
789                item.link_to +
790                '"target="_blank" class="' +
791                linkClasses +
792                '" data-ptag="' +
793                (item.ptag || '') +
794                '" data-exptag="' +
795                (item.exptag || '') +
796                '" data-pg="' +
797                (item.ptag || '') +
798                '" data-rty="' +
799                rty +
800                '" data-rid="' +
801                rid +
802                '" data-rtt="' +
803                rtt +
804                '" data-radk="' +
805                radk +
806                '">' +
807                '<img src="' +
808                item.resource_url +
809                '" class="' +
810                imgClasses +
811                '">'
812            if (showTxt) {
813                fragment =
814                    fragment +
815                    '<span class="' +
816                    txtClasses +
817                    '">' +
818                    item.txt +
819                    '</span>'
820            }
821            if (parseInt(item.flag)) {
822                fragment = fragment + getAdmarkDomString(adMarkOption)
823            }
824            fragment = fragment + '</a>'
825
826            childs = childs + fragment
827        })
828
829        $container.append(childs)
830
831        if (!this.config.isWap) {
832            setWidthAndHeight($container.find('img'), data.width, data.height)
833        }
834        showContainer(container)
835    }
836
837    /**
838     * 纯文字式
839     * 首次使用: 选材手册中的相关问答,纯文字建议自定义加载
840     * @param {*} data
841     * @param {*} container
842     * @param {*} renderOption
843     */
844    function loadAdWithText(data, container, renderOption) {
845        var $container = $(container)
846        if (supportCustomRender(data, $container, renderOption)) {
847            return
848        }
849        if (!data || !data.folder || !data.folder.length > 0) {
850            hiddenContainer(container)
851            return
852        }
853    }
854
855    var loaders = {
856        carousel: loadAdWithCarousel,
857        banner: loadAdWithBanner,
858        xTile: loadAdWithxTile,
859        yTile: loadAdWithyTile,
860        third_party_script: loadAdWithScript,
861        text: loadAdWithText,
862    }
863
864    function fetchJavaAdData(adskeys, options, cb) {
865        $.ajax({
866            type: 'post',
867            url: options.javaApi,
868            data: JSON.stringify({
869                adskey: adskeys.join(','),
870                pt: options.pt,
871                city: getCityName() || '',
872                client: options.client || '',
873                material_type: $(options.selector).attr('material-type') || '',
874                uid: getUid() || ''
875            }),
876            dataType: 'json',
877            success: function(data) {
878                cb(data.result)
879            },
880        })
881    }
882
883    function fetchAdData(adskeys, url, cb) {
884        var jsonpCallback = 'jsonpCallbackOfGlobalADS' + adskeys.join('')
885        $.ajax({
886            type: 'get',
887            url: url,
888            dataType: 'jsonp',
889            jsonpCallback: jsonpCallback,
890            cache: true,
891            success: function(data) {
892                cb(data)
893            },
894        })
895    }
896
897    function renderAdNode(data, element, renderOption) {
898        let defaultLoader = data.folder && data.folder.length >= 2 ? 'carousel' : 'banner'
899        if (typeof loaders[data.display || defaultLoader] === 'function') {
900            loaders[data.display || defaultLoader].call(
901                this,
902                data,
903                element,
904                renderOption
905            )
906
907            if (
908                renderOption &&
909                typeof renderOption.appendedCallback === 'function'
910            ) {
911                renderOption.appendedCallback(data)
912            }
913        } else {
914            throw new Error(
915                'can not find any ad loader to mathch `' +
916                    data.display +
917                    '` display type'
918            )
919        }
920    }
921
922    function renderAllAdNodes(adskeys, data, renderOptions, callback) {
923        var $containers = $(this.config.selector)
924        if ($containers.length === 0) {
925            return
926        }
927        if (this.config.isWap) {
928            $containers.addClass(this.config.wapClass)
929        }
930        var self = this
931        var adskeyStr = adskeys.join()
932        $.each($containers, function(index, element) {
933            var adskey = $(element).attr('id')
934            var dataItem = findItem(data, 'adskey', adskey)
935            // 只处理当前请求下的广告位
936            if (adskeyStr.indexOf(adskey) === -1) {
937                return true
938            }
939            var renderOption = findItem(renderOptions, 'id', adskey)
940            renderAdNode.call(self, dataItem, element, renderOption)
941        })
942        if (typeof callback === 'function') {
943            callback(data)
944        }
945        return reportData.call(this)
946    }
947
948    var defaultConfig = {
949        selector: '.ad-rabbit',
950        wapClass: 'ad-rabbit-wap',
951        javaApi: '//apigwc1.to8to.com/cgi/aoc/ad/operation',
952        api: '//secure.to8to.com/api/ggdata.php',
953        pt: 'to8to',
954        isWap: isWap(),
955    }
956
957    /**
958     *
959     * @param {Object} 可选配置覆盖默认配置
960     *
961     */
962    function AdLoader(cfg) {
963        var config = findItem(window.__adLoaderOptions, 'global', true)
964        this.config = $.extend({}, defaultConfig, config.config, cfg)
965    }
966
967    /**
968     *
969     * 原型方法,加载页面所有广告
970     *
971     * @param {*} [renderOption]
972     *
973     */
974    AdLoader.prototype.loadAllAds = function() {
975        var callback,
976            renderOptions = []
977        if (arguments.length === 1 && typeof arguments[0] === 'function') {
978            callback = arguments[0]
979        } else {
980            renderOptions = arguments[0] || []
981            callback = arguments[1]
982        }
983
984        if (window.__adLoaderOptions && $.isArray(window.__adLoaderOptions)) {
985            $.merge(renderOptions, window.__adLoaderOptions)
986        }
987
988        var selector = this.config.selector
989        if ($(selector).length === 0) {
990            return
991        }
992        var props = getAdNodesProps(selector)
993        if (props.length === 0) {
994            return
995        }
996        var adskeys = $.map(props, function(item) {
997            // use container's id as adskey
998            return item.id
999        })
1000        $.merge(loadedAdsKeys, adskeys)
1001        var url = getAdLoaderUrl(adskeys, this.config)
1002        var self = this
1003        fetchJavaAdData(adskeys, this.config, function(data) {
1004            renderAllAdNodes.call(self, adskeys, data, renderOptions, callback)
1005        })
1006        // fetchAdData(adskeys, url, function(data) {
1007        //     renderAllAdNodes.call(self, adskeys, data, renderOptions, callback)
1008        // })
1009    }
1010
1011    $(function() {
1012        // 等待获取城市站信息回调cookie重设   紧急修复的写法 tracy.xu
1013        setTimeout(function() {
1014            var adLoaderInstance = new AdLoader()
1015            adLoaderInstance.loadAllAds(initReportExposureData)
1016        }, 400)
1017    })
1018
1019    return AdLoader
1020})

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.