成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何優(yōu)雅高效地插入百度廣告

ISherry / 2126人閱讀

摘要:什么是百度廣告最近跟百度廣告打了會交道,如果您正在或者即將和百度廣告打交道,那太好了,本文一定會讓您不虛此行。插入到新聞信息流將百度廣告插入到新聞信息流,這是很普遍的做法??偨Y(jié)對于百度廣告在不同環(huán)境中的投放,有不同的處理方式。

什么是百度廣告

最近跟百度廣告打了會交道,如果您正在或者即將和百度廣告打交道,那太好了,本文一定會讓您不虛此行。百度廣告,即百度聯(lián)盟廣告,在 這里 進(jìn)行注冊后,經(jīng)過 一些配置,便可以生成一段 js,將該 js 插入到 HTML 頁面中,便能出現(xiàn)百度的廣告。

恩,百度廣告您一定見過,隨便截張圖:

隨便給一段生成的百度廣告代碼感受下:


以上代碼如何能夠展現(xiàn)廣告?最重要的原因是 cm.js 中將廣告內(nèi)容用 document.write 方法輸出。

一般場景

一般場景,也是最簡單的使用,需要廣告出現(xiàn)在哪個位置,就把該段 js 放在哪個位置。非常容易理解,因為廣告的生成用的是 document.write,所以執(zhí)行到該段 js 時,會同步輸出廣告內(nèi)容。

使用方式大概這樣:











異步加載

以上的一般場景下,如果有性能瓶頸,很顯然是因為百度廣告圖片加載的問題,js 的加載并不是首要原因(js還有緩存)。出于好奇,還是首先對 cm.js 試試能否異步加載。



控制臺有個 warning,但是廣告也出來了:

之前我們說到百度廣告是用 document.write 同步輸出到頁面上的,很顯然,并不能異步加載有 document.write 方法的 js 文件(到底是重寫頁面呢,還是重寫頁面呢),所以會有該 warning。但是,為什么會有廣告呢?

這是因為百度有一套 "備胎" 方案。當(dāng) cm.js 內(nèi)部判斷該 js 是被異步加載的時候,隨即執(zhí)行這套備胎方案:

createBackupWrapper: function(t) {
    try {
        var e = document.getElementsByTagName("script")
          , i = e[e.length - 1];
        if (i) {
            var n = i.parentNode;
            if (n) {
                var o = document.createElement("div");
                return o.id = t.containerId,
                n.insertBefore(o, i),
                !0
            }
        }
    } catch (r) {}
    return !1
    },

代碼寫的很清楚,就是把廣告元素插入到最后一個 script 標(biāo)簽的前面。為了保證廣告所在的位置即是我們希望的位置,很顯然最后一個 script 元素必須就是 cm.js。

這樣理解的話,我們似乎可以得出這樣一個結(jié)論:當(dāng)廣告位置在頁面最底部時(并且只有一處廣告位),我們可以對這段廣告的 js 進(jìn)行如上的異步加載。但是 js 異步加載了,廣告所需要的圖片還得請求,標(biāo)簽頁上的小圈圈還是一直在轉(zhuǎn),所以我覺得對 cm.js 文件進(jìn)行異步加載,并沒有什么卵用。

事實上,cm.js 內(nèi)部就提供了異步加載的方案 -> 廣告位異步加載代碼

HELLO WORLD

這樣不僅 cm.js 只需加載一次,而且調(diào)用也方便多了。(好吧,之前的異步測試算是無用功)

延遲加載

單純的異步加載對于頁面整體的加載速度似乎并沒有什么提升(廣告圖片略多),是否可以用 setTimeout 進(jìn)行延遲的異步加載?ok,我們對之前的代碼進(jìn)行一點改造,用一個定時器延遲執(zhí)行 scriptDomElement 函數(shù)。



前面說了,異步加載僅適用于 cm.js 作為最后一個 script 標(biāo)簽的情況,也就是廣告在頁面最底部的情況。what"s more,經(jīng)過這樣的處理,大多數(shù)情況下是可以看到廣告的,但是小部分情況廣告無法展現(xiàn),究其原因,樓主覺得是 cm.js 內(nèi)部對該 js 是否是異步加載無法精確判斷。

所以樓主覺得,如果可以接受某些機器下無法展現(xiàn)百度廣告,這個方法還是可以一試的。

恩,其實我們完全可以用 cm.js 提供的 BAIDU_CLB_fillSlotAsync 方法和 setTimeout 進(jìn)行配合。

重寫 document.write

強勢插入硬廣一枚:樓主 Github 求關(guān)注~

非常簡單,寫個簡單的 DEMO(重寫完后記得改回來,DEMO 中沒改回來):


Hello world!


如何能做到延遲加載?我們可以采用 BigRender 的思路,將廣告代碼放在 textarea 標(biāo)簽中,當(dāng) textarea 出現(xiàn)在視野中時,取出廣告代碼執(zhí)行。參考雨夜帶刀的代碼:

延遲加載script并重寫document.write,下面是代碼實現(xiàn): var loadScript = function( elem ){ var url = elem.value.match( /src="([sS]*?)"/i )[1], parent = elem.parentNode, // 緩存原生的document.write docWrite = document.write, // 創(chuàng)建一個新script來加載 script = document.createElement( "script" ), head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement; // 重寫document.write document.write = function( text ){ parent.innerHTML = text; }; script.type = "text/javascript"; script.src = url; script.onerror = script.onload = script.onreadystatechange = function( e ){ e = e || window.event; if( !script.readyState || /loaded|complete/.test(script.readyState) || e === "error" ){ // 恢復(fù)原生的document.write document.write = docWrite; head.removeChild( script ); // 卸載事件和斷開DOM的引用 // 盡量避免內(nèi)存泄漏 head = parent = elem = script = script.onerror = script.onload = script.onreadystatechange = null; } } // 加載script head.insertBefore( script, head.firstChild ); };

如果有多個廣告片段,因為 document.write 是全局方法,所以不得不維護(hù)個腳本隊列,一個一個執(zhí)行,又退化成了同步執(zhí)行腳本。如果異步并發(fā)執(zhí)行的話,很可能廣告的位置會出現(xiàn)對調(diào)現(xiàn)象。當(dāng)然,有些百度廣告并不會十分在乎順序,比如下面要說的新聞信息流。

其實我覺得如果要延遲加載某些特定位置的廣告區(qū)域,可以用 BAIDU_CLB_fillSlotAsync 方法,將該方法所在的代碼塞入 textarea 中。 有一點需要注意的是,BAIDU_CLB_fillSlotAsync 必須指定廣告位置的 DOM id。

插入到新聞信息流

將百度廣告插入到新聞信息流,這是很普遍的做法。

比如網(wǎng)易:

那么如何將廣告插入到新聞信息流當(dāng)中去呢?我們還是可以用重寫 document.write 的方法。

舉個簡單的例子:


重寫一個系統(tǒng)的方法畢竟不是什么好事,網(wǎng)易、 頭條新聞 采用的都是另一種方法,套一個 iframe,非常巧妙。

index.htm 文件:


ad.htm 文件:


當(dāng)然,一些樣式方面的細(xì)節(jié)還需要自己去把握,這里只提供一個思路。

總結(jié)

對于百度廣告在不同環(huán)境中的投放,有不同的處理方式。主要有三種:

利用 cm.js 中的 BAIDU_CLB_fillSlotAsync 方法(該方法需要廣告位置的 DOM id)

重寫 document.write

新建 iframe,在該 iframe 中同步輸出廣告代碼

仁者見仁智者見智吧。

Read more:

重寫document.write實現(xiàn)無阻塞加載js廣告

讓document.write的廣告無阻塞的加載

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/79249.html

相關(guān)文章

  • 實用的IT類網(wǎng)站及工具大集合

    摘要:整理的一些實用的類網(wǎng)站及工具。鏈接云適配有時候我們做出的網(wǎng)站沒有用到響應(yīng)式布局,也可能我們的網(wǎng)站的像素寬度已經(jīng)規(guī)定成具體的多少像素了。同時提供多個開放,功能實用,非常強大。 整理的一些實用的IT類網(wǎng)站及工具。 1.聚合數(shù)據(jù) 大家在開發(fā)過程中,可能會用到各種各樣的數(shù)據(jù),想找一些接口來提供一些數(shù)據(jù)。比如天氣預(yù)報查詢,火車時刻表查詢,彩票查詢,身份證查詢等等。有了這個接口,直接調(diào)用即可。各種...

    rollback 評論0 收藏0
  • 前端資源收集整理

    摘要:工作原因,最近一年斷斷續(xù)續(xù)寫了一點前端代碼,收集整理了一些資料,和大家共享。 工作原因,最近一年斷斷續(xù)續(xù)寫了一點前端代碼,收集整理了一些資料,和大家共享。 Github版本:Front-End Resource Collection 前端相關(guān)資源匯總 學(xué)習(xí)指導(dǎo) 精華文章 Web前端的路該怎么走?:文章超長,但是干貨超級多,值得反復(fù)精讀! 聽說2017你想寫前端?:適合于已經(jīng)度過了小白階...

    awesome23 評論0 收藏0
  • 前端資源收集整理

    摘要:工作原因,最近一年斷斷續(xù)續(xù)寫了一點前端代碼,收集整理了一些資料,和大家共享。 工作原因,最近一年斷斷續(xù)續(xù)寫了一點前端代碼,收集整理了一些資料,和大家共享。 Github版本:Front-End Resource Collection 前端相關(guān)資源匯總 學(xué)習(xí)指導(dǎo) 精華文章 Web前端的路該怎么走?:文章超長,但是干貨超級多,值得反復(fù)精讀! 聽說2017你想寫前端?:適合于已經(jīng)度過了小白階...

    antyiwei 評論0 收藏0
  • 前端資源收集整理

    摘要:工作原因,最近一年斷斷續(xù)續(xù)寫了一點前端代碼,收集整理了一些資料,和大家共享。 工作原因,最近一年斷斷續(xù)續(xù)寫了一點前端代碼,收集整理了一些資料,和大家共享。 Github版本:Front-End Resource Collection 前端相關(guān)資源匯總 學(xué)習(xí)指導(dǎo) 精華文章 Web前端的路該怎么走?:文章超長,但是干貨超級多,值得反復(fù)精讀! 聽說2017你想寫前端?:適合于已經(jīng)度過了小白階...

    KavenFan 評論0 收藏0
  • 阿里開源首個深度學(xué)習(xí)框架 X-Deep Learning!

    摘要:此前,在月底,阿里媽媽就公布了這項開源計劃,引來了業(yè)界的廣泛關(guān)注。突破了現(xiàn)有深度學(xué)習(xí)開源框架大都面向圖像語音等低維稠密數(shù)據(jù)而設(shè)計的現(xiàn)狀,面向高維稀疏數(shù)據(jù)場景進(jìn)行了深度優(yōu)化,并已大規(guī)模應(yīng)用于阿里媽媽的業(yè)務(wù)及生產(chǎn)場景。 showImg(https://segmentfault.com/img/remote/1460000017508808); 剛剛,阿里媽媽正式對外發(fā)布了X-Deep Le...

    hankkin 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<