1

Stackoverflowで多くの賛成を得た米ドルの数値をフォーマットするためのこのJavaScriptコードがあります。最新のWebブラウザーでは正常に機能しますが、IE7ではJavaScriptが失敗します。このプロジェクトの残りの部分ではJQueryを使用していないため、JQueryを必要としない関数を使用しようとしました。

 function formatDollar(num) {
     var p = num.toFixed(2).split(".");
     return "$" + p[0].split("").reverse().reduce(function(acc, num, i, orig) {
         return  num + (i && !(i % 3) ? "," : "") + acc;
     }, "") + "." + p[1];
 }

ユーザーへのIE7は単に「ページ上のエラー」と言います。IE7のデバッグモードでは、OnClick行で送信されるフォームのオブジェクトとして期待されていないと不平を言います。上記の関数を削除して、フォーマットせずに数値を渡すようにすると、IE7で機能します。また、最初の「return」で始まる行についても文句を言います。JavaScriptから他のすべてを削除しましたが、この関数が原因です。

4

1 に答える 1

4

このreduce関数は、IE7が実装していないJavaScript 1.8(ECMAScript 5)以降でのみ使用できます。クロスブラウザ機能を提供するライブラリをまだ使用していない場合は、次のように実装できます。

if (!Array.prototype.reduce) {  
  Array.prototype.reduce = function reduce(accumulator){  
    if (this===null || this===undefined) throw new TypeError("Object is null or undefined");  
    var i = 0, l = this.length >> 0, curr;  

    if(typeof accumulator !== "function") // ES5 : "If IsCallable(callbackfn) is false, throw a TypeError exception."  
      throw new TypeError("First argument is not callable");  

    if(arguments.length < 2) {  
      if (l === 0) throw new TypeError("Array length is 0 and no second argument");  
      curr = this[0];  
      i = 1; // start accumulating at the second element  
    }  
    else  
      curr = arguments[1];  

    while (i < l) {  
      if(i in this) curr = accumulator.call(undefined, curr, this[i], i, this);  
      ++i;  
    }  

    return curr;  
  };  
}  

または、の簡略化された構文を使用しなくてもかまわない場合は、関数内で同等のループ(上記のループやバリアントなど)reduceに置き換えてください。whilefor

参照

于 2012-08-03T08:41:12.317 に答える