2011-09-20 106 views
0

我正在使用JavaScript代碼在我的頁面中顯示廣告。如下圖所示爲相應的廣告顯示的JavaScript代碼:Javascript與string.replace方法衝突

var ad = { 
    encode: function(str) { 
     return escape(this._utf8_encode(str)); 
    }, 

    _utf8_encode: function(str) { 
     str = str.replace(/\r\n/g, "\n"); 
     var utftext = ""; 

     for (var n = 0; n < str.length; n++) { 

      var c = str.charCodeAt(n); 

      if (c < 128) { 
       utftext += String.fromCharCode(c); 
      } 
      else if ((c > 127) && (c < 2048)) { 
       utftext += String.fromCharCode((c >> 6) | 192); 
       utftext += String.fromCharCode((c & 63) | 128); 
      } 
      else { 
       utftext += String.fromCharCode((c >> 12) | 224); 
       utftext += String.fromCharCode(((c >> 6) & 63) | 128); 
       utftext += String.fromCharCode((c & 63) | 128); 
      } 

     } 
     return utftext; 
    } 
} 

var partnerId = "b7241ebe72fa74ce"; 
var siteId = "11738"; 

var targetparams = new Array(); 
targetparams['ad_platform'] = "ros"; 
var targetparams_str = ""; 
for (var key in targetparams) { 
    if (targetparams_str != "") { 
     targetparams_str += "||"; 
    } 
    targetparams_str += ad.encode(key) + "=>" + ad.encode(targetparams[key]); 
} 
targetparams_str = ad.encode(targetparams_str); 

var m3_u = 'http://ads.admarvel.com/fam/javascriptGetAd.php'; 
var m3_r = Math.floor(Math.random() * 99999999999); 
document.write("<scr" + "ipt type='text/javascript' src='" + m3_u); 
document.write("?partner_id=" + partnerId); 
document.write('&amp;site_id=' + siteId); 
document.write('&amp;target_params=' + targetparams_str); 
document.write('&amp;version=1.5'); 
document.write('&amp;language=javascript'); 
document.write('&amp;format=wap'); 
document.write('&amp;cb=' + m3_r); 
document.write("'><\/scr" + "ipt>"); 

上面的代碼是在HTML主體中的元件內部。 現在在我的頁面我想包括一個外部js庫protoaculous.1.8.2.min.js當我把這個js文件放在頭上時,不知何故,我的廣告消失了,但只要我刪除了外部庫,廣告就會顯示出來。

我頁的概要如下:

<head> 
<script type="text/javascript" src="http://www.ectnews.com/shared/ajax/protoaculous.1.8.2.min.js"></script> 
<body> 
    <div> 
     //Javascript code for the ad display 
    </div> 
</body> 

以下是我在測試服務器上創建的鏈接到場景:

非工作HTML:

http://m.smartdevicemedia.com/test_external_js.htm

Working html:

http://m.smartdevicemedia.com/test_external_js_good.htm

+0

你可以縮小嗎?看不到一半的代碼。 –

回答

1

我懷疑問題就在這裏:

var targetparams = new Array(); 
targetparams['ad_platform'] = "ros"; 
var targetparams_str = ""; 
for (var key in targetparams) { 
    if (targetparams_str != "") { 
     targetparams_str += "||"; 
    } 
    targetparams_str += ad.encode(key) + "=>" + ad.encode(targetparams[key]); 
} 

Prototype庫增加了大量的方法添加到Array原型,而你的「爲......在」循環會看到這些。但是,沒有理由將「targetparams」作爲Array實例。它應該只是一個對象:

var targetparams = {}; 

其實,從上面的代碼,我們沒有理由爲「targetparams」,甚至存在。你可以簡單地初始化字符串來表示一個鍵,你實際上已經得到了在環上方的線條硬編碼有:

var targetparams_str = ad.encode("ad_platform") + "=>" + ad.encode("ros"); 

它也似乎很奇怪,你會經過重新編碼整個字符串從編碼的部分建立字符串。

+0

你可能在這裏有一些東西 - 當我在這兩個頁面中查看'targetparams_str'的​​值時,我在'bad'頁面中看到了'ad_platform => ros ||'(查看我的答案爲什麼)和'ad_platform%3D% '好'頁面中的3Eros'。注意好頁面沒有'||'最後。 –

+0

謝謝@pointy,我現在得到了錯誤。非常感謝。:) – debaShish

0

檢查您的開發者控制檯:

Uncaught TypeError: Object function (C,B){var A=0;try{this._each(function(E){C.call(B,E,A++)})}catch(D){if(D!=$break){throw D}}return this} has no method 'replace'

test_external_js.htm:45

這一行:

string = string.replace(/\r\n/g,"\n");

現在,爲什麼它這樣做...

+0

你...我已經看到...即使,我很驚訝,不知何故外部js腳本修改了String類的方法?即使你註釋了這一行,它也會在包含** string **對象的immidiate下一行中引發一個錯誤。 – debaShish

+0

@debaShish:恩,你是否嘗試將名稱改爲中性,如'theValue'? –

+0

你...也嘗試過......但它給出了這樣的錯誤:「對象不支持這種方法或屬性」 – debaShish

0

您不能將該代碼放在包含document.write的html標記標記的頭部中。您會將代碼放在希望廣告出現在頁面上的位置。

<head> 
</head> 
<body> 
    <div> 
     <script type="text/javascript" src="yourAdCode.js"></script> 
    </div> 
</body> 
+0

他已經在做你正在做的事,我想。 – Pointy