2012-10-16 77 views
8

我在IE8得到一個錯誤以下的javascript:IE8日期()兼容性錯誤

<script type="text/javascript"> 
    //when html doc is all ready 
    $(document).ready(function() { 
     var socket = io.connect(); 
     var room = 'public'; 
     socket.emit('join', room); 

     socket.on('message', function (data) { 
      var output = ''; 
      output += '<div class="trace-content">'; 
      output += ' <div class="mname">' + data.name + '</div>'; 
      output += ' <div class="mdate">' + data.date + '</div>'; 
      output += ' <p class="mtext">' + data.message + '</p>'; 
      output += '</div>'; 

      $(output).prependTo('#traces'); 
     }); 

     $('button').click(function() { 
      var date = new Date().toISOString(); 
      socket.emit('message', { 
       name: $('#name').val(), 
       message: $('#message').val(), 
       date: date.slice(2,10) + ' ' + date.slice(11, 19) 
      }); 
     }); 
    }); 
</script> 

的問題似乎是在該行:VAR日期=新的日期()toISOString(); 我遇到了麻煩,指出究竟是什麼問題。 其他一切似乎工作正常;只需點擊該按鈕並通過下面的代碼。有任何想法嗎?

回答

24

IE8不支持.toISOString()。您可以使用此代碼(從Mozilla)墊片:

if (!Date.prototype.toISOString) {   
    (function() {   
     function pad(number) { 
      var r = String(number); 
      if (r.length === 1) { 
       r = '0' + r; 
      } 
      return r; 
     }  
     Date.prototype.toISOString = function() { 
      return this.getUTCFullYear() 
       + '-' + pad(this.getUTCMonth() + 1) 
       + '-' + pad(this.getUTCDate()) 
       + 'T' + pad(this.getUTCHours()) 
       + ':' + pad(this.getUTCMinutes()) 
       + ':' + pad(this.getUTCSeconds()) 
       + '.' + String((this.getUTCMilliseconds()/1000).toFixed(3)).slice(2, 5) 
       + 'Z'; 
     };  
    }()); 
} 
+0

很簡單的一段代碼。謝謝! – dk123

3

當然,你得到一個錯誤http://kangax.github.com/es5-compat-table。在Google中查找date.prototype.toISOString()填充。發現這個https://gist.github.com/1044533

從要點:

// thanks to @fgnass and @subzey for their awesome golf skills 
// annotation by @fgnass 

function(a){ 
    a=this; 
    return (
    1e3 // Insert a leading zero as padding for months < 10 
    -~a.getUTCMonth() // Months start at 0, so increment it by one 
    *10 // Insert a trailing zero as padding for days < 10 
    +a.toUTCString() // Can be "1 Jan 1970 00:00:00 GMT" or "Thu, 01 Jan 1970 00:00:00 GMT" 
    +1e3+a/1 // Append the millis, add 1000 to handle timestamps <= 999 
    // The resulting String for new Date(0) will be: 
    // "-1010 Thu, 01 Jan 1970 00:00:00 GMT1000" or 
    // "-10101 Jan 1970 00:00:00 GMT1000" (IE) 
    ).replace(
     // The two digits after the leading '-1' contain the month 
     // The next two digits (at whatever location) contain the day 
     // The last three chars are the milliseconds 
     /1(..).*?(\d\d)\D+(\d+).(\S+).*(...)/, 
    '$3-$1-$2T$4.$5Z') 
} 

注:這可能不是最可讀的代碼或填充工具的最好的例子,但它似乎根據要點的意見所以這是一個工作快速複製/粘貼解決方案。

+0

哇,我不想維護那個代碼:)(高爾夫代碼是搞清楚如何用最少的字符完成某件事)。 – Bill

+0

閱讀評論是一個140字節的例子。我的觀點是向OP展示他應該在尋找什麼。這意味着一個複製/粘貼解決方案。評論似乎暗示有更好的選擇,但人們報告它在IE6和其他瀏覽器中工作。 – elclanrs

+0

感謝您的詳細解答。我一定會查看你已經鏈接的表格。我選擇接受比爾的答案,儘管純粹是因爲我將無法記住這種複雜性的代碼在未來的時間點會做什麼;儘管很大的幫助,謝謝! – dk123

0

爲什麼不使用toJSON method代替? 它受IE8支持。

+0

這不提供問題的答案。要批評或要求作者澄清,請在其帖子下方留言。 - [來自評論](/ review/low-quality-posts/10597816) –

+0

@JonSurrell你嘗試過使用這種方法嗎?它確實解決了他的問題,因爲[調用'toJSON'返回一個代表Date對象值的字符串](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON#Description )。 – Knu