在自己的項目中嵌入過廣告的朋友們可能都用過百度聯盟, 只需要嵌入如下一段js
代碼片段, 就可以在自己的項目中嵌入廣告, 來獲得收益.
<script type="text javascript">
var cpro_id ="u2557752";
</script>
<script src="http://cpro.baidustatic.com/cpro/ui/cm.js?id='i9898'" type=“text/javascript”></script>
本文就是主要介紹如何通過嵌入js
片段的方式來嵌入廣告等第三方的應用的, 具體的實現方案有兩種:
在服務端生成腳本:
服務端接收到請求後, 從url
中提取到參數, 再根據參數從數據庫中查找出對應的數據信息,比如是廣告的話, 就查找到對應的廣告素材, 並將查詢到的數據信息插到javascript
模板中,
瀏覽器執行js
腳本代碼,創建出廣告
直接引入靜態js腳本:
首先js
文件中提取到參數,根據參數向服務端發起請求, 獲取到對應的數據, 再通過js
創建html
片段,輸出到頁面上
兩種方案對比:
服務端生成腳本,所有的代碼和數據都包含在生成的js
文件中,不需要做額外的請求,適用於內容及樣式相對簡單的頁面.比如只有一個圖片的廣告展示.
對於內容較多,樣式較爲複雜的內容展示通過第二種方案實現更加靈活.
兩種方案實現起來, 主要以下幾步:
1.獲取參數 --> 2.獲取數據 --> 3.輸出html
1.傳遞參數
下面介紹一下腳本參數傳遞的幾種方式的優缺點:
1.通過拼接URL
傳遞
<script src="http://cpro.baidustatic.com/cpro/ui/cm.js?cpro_id=u2557752" type=“text/javascript”></script>
優點: 可通過URL
傳遞到服務器
缺點: 必須進行DOM
查詢,無法緩存
2.通過hash
傳
<script src="http://cpro.baidustatic.com/cpro/ui/cm.js#cpro_id=u2557752" type=“text/javascript”></script>
優點: 使用URL
,便於緩存
缺點: 必須進行DOM
查詢
3.自定義屬性
<script data-hxh-coupon-id=‘1234’ src=“http://cpro.baidustatic.com/cpro/ui/cm.js type=“text/javascript”></script>
優點: 可讀性強, 便於緩存, 易於識別腳本引入代碼的位置
缺點: 必須進行DOM
查詢
4.使用全局變量
<script type=“text/javascript”>
var couponId = ‘87393’;
</script>
<script src=“http://cpro.baidustatic.com/cpro/ui/cm.js type=“text/javascript”></script>
優點: 可讀性強,便於緩存,參數類型靈活,無需進行DOM
查詢
缺點: 使用了全局變量
2.獲取數據
關於獲取數據, 服務端生成腳本, 服務端直接查詢數據, 靜態js
腳本方案中, 可使用jsonP
, Cors
等方案進行跨域請求.
3.輸出html
1.使用document.write
document.write
直接在當前文檔流中寫入字符串,一旦文檔流已經關閉,就打開新的文檔流並寫入,原來的文檔流會被清空,已渲染好的頁面就會被清除,瀏覽器將重新構建DOM
並渲染頁面.所以使用這種方案, 就一必須是同步執行嵌入的這段js
代碼, 作爲第三方腳本引入,阻塞性的腳本會阻止主頁面的渲染,如果js
文件加載遲緩,甚至不可用的, 會給主頁面造成嚴重的性能問題, 所有不建議使用.
2.操作DOM
添加
-
在目標位置嵌入
js
片段, 並使用預先定義的ID,class,data-*
等(如上) -
js
文件中創建DOM
元素,將HTML
字符串賦值給元素的innerHTML
屬性 -
根據
ID,calss,data-*
等查詢到腳本所在位置,並將元素添加到DOM
中
<script id='hxh-coupon-scandown' type="text/javascript">
(function(){
var script = document.createElement('script');
script.async = true;
script.src = 'http://www.boxmars.com?id=123';
var entry = document.getElementsByTagName('script')[0];
entry.parentNode.insertBefore(script, entry);
})()
</script>
優點:
- 可以異步加載第三方
DOM
, 不阻塞主頁面的渲染,即使js
出錯,也不會影響到主頁面 - 可以將創建的
DOM
動態插入到已存在的元素之後(即可以追加到已知位置)
缺點:
- 使用字符串拼接不利於
HTML
片段的編寫和維護 - 會繼承父頁面樣式
- 主頁面可更改
DOM
內容
字符串拼接不利於編寫和維護的問題,可以通過JavaScript
模板引擎庫來編寫HTML
片段, 流行模板庫:HandlebarsJS,Mustache,BAIDU-Template,artTemplate
等
使用不設置src
的iframe
主頁面提供一個不設置src
的iframe
標籤,通過iframe
的contentWindow
訪問iframe
的DOM
,使用document.write
將HTML
直接寫入到iframe
中
var doc = document.getElementsByTagName('iframe')[0].contentWindow.document;
doc.writeln("<button id=\'btn\'>點擊</button>");
doc.writeln("<script type=\'text/javascript\'>");
doc.writeln("var btn = document.getElementById(\'btn\');");
doc.writeln("btn.onclick = function(){");
doc.writeln("parent.parentEvent();");
doc.writeln("</script>");
doc.close();
注:
iframe
由瀏覽器異步處理, 所以此處使用document.write()
並不會阻止父頁面的加載
優點:
-
完全獨立的
DOM
環境,不會繼承父頁面的樣式 -
完全獨立的
window
,避免和主頁面其他腳本衝突 -
可直接與主頁面進行交互(與iframe引入外部頁面對比)
缺點:
Iframe
標籤的創建速度慢- 主頁面可以訪問
iframe
的DOM
環境並可進行更改
嵌入第三方頁面兩種方案中,另一種方案(http://www.cnblogs.com/yuqing6/p/8462239.html) 都大篇幅介紹使用了
iframe
進行html
輸出,iframe
提供了一種最佳的避免樣式和腳本衝突的嵌入途徑,但是有些情況在主頁面的DOM
中去渲染更爲合適
不適合使用iframe
的情況:
- 需要在
iframe
外部呈現內容, 場景: 第三方應用中需要彈出對話框時,如果iframe
不是覆蓋整個頁面的, 就無法正常展示對話框 - 一個頁面引入很多個
iframe
嵌入頁面, 同一個頁面引入許多個iframe
時, 會帶來主頁面很大的性能開銷, 對於只是渲染一兩次情況, 這種性能消耗可以忽略不計 - 需要繼承父頁面的基礎樣式, 有些時候,希望第三方應用繼承父頁面的基礎樣式, 來和主頁面的樣式風格保持一致,這種情況不適用於使用
iframe