Javascript与string.replace方法冲突

时间:2011-09-20 12:15:04

标签: javascript conflict

我正在使用javascript代码在我的页面中显示广告。相应广告显示的javascript代码如下所示:

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

使用html:

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

3 个答案:

答案 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原型添加了一堆方法,你的“for ... in”循环将会看到这些。但是,“targetparams”没有理由成为Array实例。它应该只是一个对象:

var targetparams = {};

事实上,从上面的代码来看,“targetparams”甚至没有理由存在。您可以简单地将字符串初始化为您在循环上方的行中实际硬编码的单个键:

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

在从编码片段构建字符串后重新编码整个字符串似乎很奇怪。

答案 1 :(得分: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");

现在为什么要这样做......

答案 2 :(得分:0)

你不能把这些代码放在文件的头部。写出html标记标签。你可以把代码放在你希望广告出现在页面上的位置。

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