JavaScript中多的是。你不知道的坑

1、最新的chrome浏览器:

使用方法:

function $ajax(a, c, b) {
    function e() {
        return g.status == 200 ? /xml/i.test(g.getResponseHeader("content-type")) ? g.responseXML: g.responseText: null
    }
    var i = ["MSXML2.XMLHTTP", "Microsoft.XMLHTTP"],
    g;
    try {
        g = new XMLHttpRequest
    } catch(h) {
        for (var j = 0; j < i.length; j++) try {
            g = new ActiveXObject(i[j]);
            break
        } catch(k) {}
    }
    if (g) {
        g.open(c ? "POST": "GET", a || location.href, !!b);
        g.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        g.setRequestHeader("If-Modified-Since", new Date(0));
        if (b) g.onreadystatechange = function() {
            if (g.readyState == 4) {
                var i = e();
                b(i) === !0 && setTimeout(function() {
                    $ajax(a, c, b)
                },
                1E3)
            }
        };
        g.send(c || "");
        return b ? g: e()
    } else $trackEvent("tuna-error", "$ajax", "xmlObj creation failure", $tunaVersion())
}

会出现下面以下错误:

  1. Uncaught SyntaxError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': 'Thu Jan 01 1970 08:00:00 GMT+0800 (中国标准时间)' is not a valid HTTP header field value. tuna_offline_101221.vpn.js?releaseno=20130320:680
    1. $ajax tuna_offline_101221.vpn.js?releaseno=20130320:680
    2. reasoncodeCheck HotelSearchResult.aspx:1261
    3. (anonymous function)

修改方案为

function $ajax(e,d,b){
            function f() {
                return a.status == 200 ? /xml/i.test(a.getResponseHeader("content-type")) ? a.responseXML: a.responseText: null
            }
            var g = ["MSXML2.XMLHTTP", "Microsoft.XMLHTTP"],
            a;
            try {
                a = new XMLHttpRequest
            } catch(h) {
                for (var c = 0; c < g.length; c++) try {
                    a = new ActiveXObject(g[c]);
                    break;
                } catch(i) {}
            }
            if (a) {
                a.open(d ? "POST": "GET", e || location.href, !!b);
                a.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
                a.setRequestHeader("If-Modified-Since", new Date(0).toGMTString());
                if (b) a.onreadystatechange = function() {
                    if (a.readyState == 4) {
                        var c = f();
                        b(c) === true && setTimeout(function() {
                            $ajax(e, d, b)
                        },
                        1E3)
                    }
                };
                a.send(d || "");
                return b ? a: f()
            }
        };

2、 

Js 对象原型,原型链,for循环读取多了属性

通过构造函数创建一个对象,再给构造函数的原型添加一个属性。下面:
用for in输出这个对象的所有属性和方法的时候。那么后来从原型添加的属性会不会被输出呢?
<pre id="answer-content-1517244599" class="answer-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 10px; padding: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; background-color: rgb(255, 255, 255);">会的,但是可以用  obj.hasOwnProperty(i)来进行判断筛选

 
http://www.cnblogs.com/xqhppt/archive/2012/02/01/2334355.html
</pre><pre class="line mt-10 q-content" name="code" style="white-space: pre-wrap; word-wrap: break-word; font-size: 14px; margin-top: 10px; margin-bottom: 0px; padding: 0px; font-family: arial, 'courier new', courier, 宋体, monospace; word-break: break-all; color: rgb(51, 51, 51); line-height: 24px; background-color: rgb(255, 255, 255);">http://blog.sina.com.cn/s/blog_51c99bb2010130xh.html

3、取值标签的文本问题:

当你需要取出某个标签内在文本的时候,你会发现:

<a href="javascript:;" ><span class="name"><b>汪</b>磊 wlei@ctrip.com</span></a> 

这个标签的内容包含有很多空格


那么,你会遇到如下问题:

你使用innerText的时候,会将多个空格忽略为1个。如t   est会变成t est

你使用textContent的时候,可以保留多个空格,但是这个属性在IE7或IE8里面是不支持的。


解决方法有:

1、将标签内在文本内容,用属性或者data存储。

2、正则表达式过滤html标签:

function setContent(str) {
str = str.replace(/<\/?[^>]*>/g,''); //去除HTML tag
str.value = str.replace(/[ | ]*\n/g,'\n'); //去除行尾空白
//str = str.replace(/\n[\s| | ]*\r/g,'\n'); //去除多余空行
return str;
}


3、

IE浏览器下面,IE7,等style,tr等某些元素的innerHTML只读

从MSDN上记录上看 col、colGroup、frameset、html、head、style、table、tfoot、tHead、title和tr的innerHTML都是只读的(IE6-IE9)。


document.createStyleSheet().cssText='body{background-color:red}'

        if (document.createStyleSheet) {
            document.createStyleSheet().cssText = d;
        } else {
            var link = document.createElement('style');
            link.type = 'text/css';
            link.innerHTML = d;
            document.getElementsByTagName("head")[0].appendChild(link);
        }


4、

正则表达式的true false转换:

/^NA$/gi.test('na')
true
/^NA$/gi.test('na')
true
var tmpReg = /^NA$/gi
undefined
tmpReg.test('na')
true
tmpReg.test('na')
false

为什么执行一次true,一次false?
每个正则表达式都有一个 lastIndex 属性,用于记录上一次匹配结束的位置
var re = /^[1-9]\d{4,10}$/gi;
var str = "123456";
alert(re.test(str));      //返回true

// 执行上面的 test 之后
我们可以弹出
alert(re.lastIndex); // 弹出6
即表示上一次在第6个字符之后结束

那么下一次再调用 test 的时候, 就会从第6个字符之后继续搜索

解决办法,将正则表达式的 lastIndex 属性设置为0 

具体代码如下:
<script type="text/javascript">
var re = /^[1-9]\d{4,10}$/gi;
var str = "123456";
alert(re.test(str));      //返回true
str = "1234567";
re.lastIndex=0;
alert(re.test(str));      //返回true
</script>
一共有两种解决办法
1. 正则模式去掉全局模式
2. 重新设置lastIndex为0

当然也可以使用"na".match(Reg)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值