GVKun编程网logo

IE7 / IE8中的Javascript JSON日期解析返回NaN(js处理日期格式)

15

本文的目的是介绍IE7/IE8中的JavascriptJSON日期解析返回NaN的详细情况,特别关注js处理日期格式的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解I

本文的目的是介绍IE7 / IE8中的Javascript JSON日期解析返回NaN的详细情况,特别关注js处理日期格式的相关信息。我们将通过专业的研究、有关数据的分析等多种方式,为您呈现一个全面的了解IE7 / IE8中的Javascript JSON日期解析返回NaN的机会,同时也不会遗漏关于IE 7中的Javascript Date函数出现问题,返回NaN、IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)_javascript技巧、IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理_javascript技巧、IE8中javascript trim方法失效的知识。

本文目录一览:

IE7 / IE8中的Javascript JSON日期解析返回NaN(js处理日期格式)

IE7 / IE8中的Javascript JSON日期解析返回NaN(js处理日期格式)

我正在解析JSON事件供稿中的日期-但日期在IE7 / 8中显示为“ NaN”:

// Variable from JSON feed (using JQuery''s $.getJSON)var start_time = ''2012-06-24T17:00:00-07:00'';// How I''m currently extracting the Month & Dayvar d = new Date(start_time);var month = d.getMonth();var day = d.getDate();document.write(month+''/''+day);// "6/24" in most browsers, "Nan/Nan" in IE7/8

我究竟做错了什么?谢谢!

答案1

小编典典

在较旧的浏览器中,您可以编写一个函数来为您解析字符串。

这将创建一个Date.fromISO方法-如果浏览器可以从ISO字符串本地获取正确的日期,则使用该本地方法。

一些浏览器部分正确,但返回了错误的时区,因此仅检查NaN可能不会。

Polyfill:

(function(){    var D= new Date(''2011-06-02T09:34:29+02:00'');    if(!D || +D!== 1307000069000){        Date.fromISO= function(s){            var day, tz,            rx=/^(\d{4}\-\d\d\-\d\d([tT ][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/,            p= rx.exec(s) || [];            if(p[1]){                day= p[1].split(/\D/);                for(var i= 0, L= day.length; i<L; i++){                    day[i]= parseInt(day[i], 10) || 0;                };                day[1]-= 1;                day= new Date(Date.UTC.apply(Date, day));                if(!day.getDate()) return NaN;                if(p[5]){                    tz= (parseInt(p[5], 10)*60);                    if(p[6]) tz+= parseInt(p[6], 10);                    if(p[4]== ''+'') tz*= -1;                    if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);                }                return day;            }            return NaN;        }    }    else{        Date.fromISO= function(s){            return new Date(s);        }    }})()

结果:

var start_time = ''2012-06-24T17:00:00-07:00'';var d =  Date.fromISO(start_time);var month = d.getMonth();var day = d.getDate();alert(++month+'' ''+day); // returns months from 1-12

IE 7中的Javascript Date函数出现问题,返回NaN

IE 7中的Javascript Date函数出现问题,返回NaN

我有一个Twitter提要,并且创建了一个新的日期obj,因此可以根据自己的喜好格式化日期。

var created = new Date(this.created_at)适用于Firefox和Chrome,但不适用于IE7。我似乎在通过new Date()函数传递日期方面遇到麻烦。它只是返回undefined和NaN。

这是代码。如果您尝试对其进行测试,请不要忘记添加jquery。谢谢。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Twitter Test</title>
<script type="text/javascript" src="jquery-1.4.2.js"></script>
<script type="text/javascript" >

$(function(){
$.getJSON("http://twitter.com/statuses/user_timeline/google.json?count=1&callback=?",function(data){
    $.each(data,function(){
        var created = new Date(this.created_at)
        $("<div></div>").append("<ul><li>Unformatted: " + this.created_at + "</li><li>Formatted: " + created + "</li></ul>").appendTo("body")
    });

})

})

</script>
</head>

<body>
</body>
</html>

IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)_javascript技巧

IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)_javascript技巧

刚和同事讨论了一个很有趣的问题,有个idea,需要记录用户在页面选中的内容,在ff和ie9下有w3c的dom2级事件createRange,这里不再累赘。主要问题是在IE6,7,8只能通过createTextRange选中热区。假如我们知道用户选择开始元素和偏移量,以及结束元素以及偏移量,那么我们可以用下面的例子把用户选择的内容用js给标记起来

复制代码 代码如下:


<script> <BR>function mark() { <BR>var b= document.getElementById ("b"); <BR>var b1= document.getElementById ("b1"); <BR>var b2= document.getElementById ("b2"); <BR>var a1 = document.body.createTextRange(); <BR>a1.moveToElementText(b); <BR>a1.moveStart(''character'',17); <BR>var a2 = document.body.createTextRange(); <BR>a2.moveToElementText(b1); <BR>a2.moveEnd(''character'',-2); <BR>a1.setEndPoint ("EndToEnd",a2); <BR>a1.select(); <BR>}</script>


The contents of the source element.

The contents of the source element.

The contents of the source element.




ok,从上面的代码,我们可以知道,在IE6,7,8下,需要关联多个元素的选择时候,我们需要创建两个textRange,一个是开始节点,以及偏移量,还有一个结束节点,以及偏移量,两个textRange用a1.setEndPoint关联

参考文档:http://help.dottoro.com/ljgbbkjf.php

http://msdn.microsoft.com/en-us/library/ms535872%28VS.85%29.aspx

上面是我们知道开始结束位置的情况下,那我们如何知道用户自己选中的热区的开始,结束节点和偏移量呢?

很可惜查了半天,MSDN只有以下几个属性可以利用,

textRange.parentElement返回选中热区的父亲节点,可以帮助我们确定,一个大概的范围

boundingLeft,offsetLeft,可以知道热区的左偏移距离

boundingTop,offsetTop,可以知道热区的上偏移距离

text,选中的文本内容,htmlText选中的html内容

可以没有直接的index…,和开始节点。。。之类

好吧,如果我们要通过位置来算的话,我们可以通过每行的line-height,计算高度,如果是一个节点的话,要计算节点的height,padding,marging,

如果是计算左偏移的话,要计算font-size,margin,padding,letter-space,这样我们通过css的计算,可以得到大致的位置,

然后我们结合text,和htmlText去比对附近的元素的文本内容,可以得到索引的坐标

这样 基本上我们可以确定开始/结束节点,以及偏移量了,

不过这样做的成本也是比较高的,不知道大家还有没有好的办法,或者hacker的方法^_^

==================================================================================

刚才又看了下htmlText方法,有个惊奇的发现,还是上面的例子,htmlText返回如下

 

he source element.

The contents of the source element

可以看到开始节点的tagName,还有选中的内容,可以通过去掉开头结尾的html tag,然后用正则判断取到这段html代码在之前的parent.innerHTML的位置,这样偏移量也就取到了,ok,不需要通过判断offset的方式,我们就可以取到开始,结束节点,以及偏移量了

这样在IE6,7,8下,可以记录用户任意选中的内容的开始、结束节点,以及偏移量了^_^

 =============================================================

只是这样做,还有一个唯一的缺点就是对于单个字符,或者重复出现的单词,还是得通过css的offsetLeft 这样的属性 ,通过判断距离,还确定是否是选中的那个,不知道大家有没好的建议

===============================================================

然后今天早上,今天灵光一现,互发奇想,解决不需要通过offsetTop,left判断单个node内部,重复字符的偏移量问题

代码如下

复制代码 代码如下:


<script> <BR>function mark() { <BR>var selection=document.selection.createRange(); <BR>if(selection.text.length==0){ <BR>return; <BR>} <BR>var textLength=event.srcElement.innerText.length; <BR>var oldSelectionParent=selection.parentElement(); <BR>do{ <BR>selection.moveEnd("character",1); <BR>}while(selection.parentElement()==oldSelectionParent); <BR>selection.moveEnd("character",-1); <BR>alert(textLength - selection.text.length); <BR>} <BR>function load(){ <BR>document.body.onmouseup=mark; <BR>//document.body.onmousedown=mark; <BR>} <BR></script>


飞 a a a a 飞飞飞飞飞a飞 a a a



原理就是利用在一个节点内部,不断偏移1个字符,到底部或者顶部,计算偏移量的方法,因为对于单个元素内的热区,他的parentElement()返回就是他自己,如果跨多个节点,之后,返回的parentNode就是他自己的父节点了,可以通过这个变化,判断,是否移动到该节点文本的尽头。^_^这样就可以计算偏移量了




ok,总结,通过htmlText的属性可以解决多节点选中热区的定位问题,对于单节点内部重复字符,可以通过文中最后一部分代码解决,这样在IE下,记录光标选中位置,和复现的方法就完美了^_^


============================================

去kissy群问了下,原来承玉已经做过全兼容的取位置的代码,链接如下
http://www.jb51.net/article/28120.htm

代码:http://lite-ext.googlecode.com/svn/trunk/lite-ext/playground/range/ie.html

IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理_javascript技巧

IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理_javascript技巧

昨天在使用jquery ui datapicker做显示签到日历功能的时候,出现了js问题,在ie8/ie9以及ff、chrome下都显示正常,

但是在IE6/IE7以及IE8兼容视图下显示有问题,提示“页面上有错误”,进一步查看显示错误信息“缺少标识符、字符串或数字”,

一开始以为是Jquery 和Jquery Ui的版本不匹配导致的,后来尝试了其他支持的版本也是不行,

然后将自己的Js代码逐段调式,在花了两个多小时后终于以外的发现是由Json最后一个键值后加了逗号引起的问题。

在网上查了一下,发现好多人也遇到的这种问题。以后要小心了。

立即学习“Java免费学习笔记(深入)”;

复制代码 代码如下:

var obj = {
        ''name'': ''qqyumidi'',
        ''gender'': ''male''  //此处不能加上,  !!
    }
alert(obj.name);

真是万恶的IE6/IE7,什么时候才能告别专门为IE做hack的日子。。。。。忍不住要吐槽微软了

IE8中javascript trim方法失效

IE8中javascript trim方法失效

这是一个很纠结的问题,之前一直没在意,后来偶然一次发现写的代码在IE8下竟然报错!并且报错的是trim方法,百思不得其解,后来发现原来我用的是javascript中原生的trim方法,但是IE8下的确没有这个方法。

解决办法:

                使用jquery的$.trim()方法搞定!

例:

        var vistValues = $("#otherDiv #hidDiv input").val();    //需要回访的信息

var vistValue = $.trim(vistValues);        //IE8不支持trim方法。


$("#otherDiv #hidDiv input").val().trim();//此语句IE8不支持

今天的关于IE7 / IE8中的Javascript JSON日期解析返回NaNjs处理日期格式的分享已经结束,谢谢您的关注,如果想了解更多关于IE 7中的Javascript Date函数出现问题,返回NaN、IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)_javascript技巧、IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理_javascript技巧、IE8中javascript trim方法失效的相关知识,请在本站进行查询。

本文标签:

上一篇Python-从字符串创建Pandas DataFrame(python字符串创建方法)

下一篇来自XMLHttpRequest的空responseText(来自xml数据导入是什么意思)