在Chrome中处理秘密更改的API

时间:2014-09-06 20:56:22

标签: javascript google-chrome google-chrome-extension internationalization chinese-locale

我已经制作了Chrome扩展程序,最近Chrome的更新破坏了我的一些代码。我发现他们已经秘密改变了.DateTimeFormat的行为(感谢让Google变得更难)。在更新到Chrome 38之前,此代码会根据中国日历返回当前年份的编号,即31(〜2014 - 2015年公历中的年份):

Intl.DateTimeFormat("zh-TW-u-ca-chinese",{year:"numeric"}).format(new Date()); //31年

由于在the Chinese numbering system中,base-10用于第10位,base-12用于第1位,要将数字31转换为中文编号,使用此代码:< / p>

var y = +Intl.DateTimeFormat("zh-TW-u-ca-chinese",{year:"numeric"}).format(date).match(/\d+/)[0],
    天干 = ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"],            //base 10
    地支 = ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"];  //base 12

y = 天干[(y-1)%10] + 地支[(y-1)%12];     //甲午

但是现在,Chrome 自动而不是返回号码,而是为我完成了所有转化。现在返回的值只是"甲午年",这会破坏我的代码,特别是这部分:

.match(/\d+/)[0]

我不能只删除我手动转换,因为不是每个用户都会使用最新版本的Chrome。处理这种情况的好方法是什么?

2 个答案:

答案 0 :(得分:1)

好吧,正如你所指出的那样,match(/\d+/)失败了。分支就是这样。

您可以执行以下操作:

var x = Intl.DateTimeFormat("zh-TW-u-ca-chinese",{year:"numeric"}).format(date);
if(x.match(/\d+/)){
  var y = +x.match(/\d+/)[0];
  /* old logic */
} else {
  /* new logic */
}

或者,或者,在清单中使用"minimum_chrome_version" : "38"推送更新。运行旧版本的用户应使用旧版扩展程序。

答案 1 :(得分:1)

在尝试转换之前,简单测试返回值是否包含数字(或者相反,在尝试提取数字之前检查返回值是否看起来像有效的日期格式):

var y = +Intl.DateTimeFormat("zh-TW-u-ca-chinese",{year:"numeric"}).format(date);
if (/\d/.test(y)) {
    y = y.match(/\d+/)[0];
    var 天干 = ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"];            //base 10
    var 地支 = ["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"];  //base 12
    y = 天干[(y-1)%10] + 地支[(y-1)%12];     //甲午
}

每当您遇到无法以这种方式检测到的问题时,您可以尝试确定在哪个版本的Chrome中引入了更改,并从navigator.userAgent中提取Chrome版本以进行比较。