2012-10-16 4 views
8

ich einen Fehler auf IE8 für das folgende Javascript bekommen:ie8 Date() Kompatibilitätsfehler

<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> 

Das Problem in der Linie zu sein scheint. Var date = new Date() toISOString(); Ich habe Probleme Pin zeigen, was genau das Problem ist. Alles andere scheint gut zu funktionieren; nur dieser Knopf klicken und der Code folgt durch. Irgendwelche Ideen?

Antwort

24

IE8 unterstützt .toISOString() nicht. Sie können diesen Code als Beilage (von Mozilla) verwenden:

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

Schönes einfaches Stück Code. Vielen Dank! – dk123

3

Natürlich Sie http://kangax.github.com/es5-compat-table einen Fehler. Suchen Sie nach date.prototype.toISOString() Polyfill in Google. Fand diesen https://gist.github.com/1044533

Vom Kern:

// 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') 
} 

Hinweis: Dies ist möglicherweise nicht der meist lesbare Code oder bestes Beispiel für polyfill aber es scheint nach den Ausführungen im Kern zu arbeiten, so dass es eine ist schnelle Kopie/Paste Lösung.

+0

Wow, ich würde diesen Code nicht beibehalten wollen :) (Der Golf-Code versucht herauszufinden, wie man etwas mit der geringsten Anzahl von Zeichen erreicht). – Bill

+0

Es ist ein 140bytes Beispiel durch das Lesen der Kommentare. Mein Punkt ist, OP zu zeigen, wonach er suchen sollte. Das soll eine Kopier-/Pasten-Lösung sein. Kommentare scheinen zu implizieren, dass es bessere Möglichkeiten gibt, aber die Leute berichten, dass sie in IE6 und anderen Browsern funktionieren. – elclanrs

+0

Danke für die ausführliche Antwort. Ich werde auf jeden Fall in die Tabelle schauen, die du verlinkt hast. Ich habe mich dafür entschieden, Bills Antwort zu akzeptieren, obwohl ich nur schwer daran denken kann, was ein Code dieser Komplexität in zukünftigen Zeitpunkten tun würde; große Hilfe, aber danke! – dk123

0

Warum verwenden Sie nicht stattdessen die toJSON method? Es wird von IE8 unterstützt.

+0

Dies liefert keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klärung zu bitten, hinterlasse einen Kommentar unter seinem Beitrag. - [Aus Bewertung] (/ review/low-quality-posts/10597816) –

+0

@JonSurrell haben Sie versucht, diese Methode zu verwenden? Es behebt sein Problem, da [durch den Aufruf von 'toJSON' eine Zeichenfolge zurückgegeben wird, die den Wert des Date-Objekts darstellt (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON#Description)). – Knu