2012-10-16 13 views
8

私は次のJavaScriptのためにIE8のエラーを取得しています: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日=新しいDate()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()polyfillを探してください。要旨この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

詳細な回答ありがとうございます。私は間違いなく、あなたがリンクしたテーブルを調べています。私はBillの答えを受け入れることを選択しましたが、純粋に、この複雑さのコードが将来の時点で何をするのかを覚えていないという事実が原因です。大いに助け、感謝! – dk123

0

代わりにtoJSON methodを使用していませんか? IE8でサポートされています。

+0

これは質問に対する答えを提供しません。批評をしたり、著者の説明を求めるには、投稿の下にコメントを残してください。 - [レビューから](レビュー/低品質の投稿/ 10597816) –

+0

@JonSurrellはその方法を試しましたか? [toJSONを呼び出すと、Dateオブジェクトの値を表す文字列が返される](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON#Description )。 – Knu

関連する問題