2011-09-20 90 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