IE7中的功能失败,但适用于所有现代浏览器。怎么修好?

时间:2012-08-03 08:35:06

标签: javascript function internet-explorer-7

我有这个JavaScript代码来格式化美元的数字,这个数字在Stackoverflow上得到了很多赞许。它在最新的Web浏览器中运行良好,但它会导致JavaScript在IE7中失败。我试图使用一个不需要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的调试模式中,抱怨它不是On Click行上提交的表单的预期Object。如果我删除上面的函数并让它传递数字而不格式化它在IE7中工作。它还抱怨从第一个“返回”开始的行。我已经从JavaScript中删除了其他所有内容,而这个功能是它出现的罪魁祸首。

1 个答案:

答案 0 :(得分:4)

reduce函数仅在JavaScript 1.8(ECMAScript 5)及更高版本中可用,IE7未实现。如果您还没有使用任何跨浏览器提供其功能的库,则可以这样实现:

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的简化语法,只需在函数中将其替换为等效循环(例如上面的while循环或for } varient)。

Reference