NoGray Time Picker conflict with Google Maps api

NoGray Time Picker conflict with Google Maps api

本文关键字:Google Maps api with conflict Time Picker NoGray      更新时间:2023-09-26

我有一个页面,上面有NoGray Time Picker控件和一个Google地图实现。如果我移除NoGray Time Picker, Google地图的效果会很好(渲染、显示地图点等)。但是当我包含NoGray时间选择器时,我得到以下javascript错误:

Uncaught TypeError: Cannot read property 'kc' of undefined

当我使用Chrome调试时,它显示NoGray的扩展到函数原型在调用堆栈的基础。这个错误是发生在谷歌的api代码…

没有给出太多的代码(但希望足够让任何人找到/复制)…我说的是ng_all.js中的以下内容:

ng.extend_proto(Function, { set: function(
[...] //removed several lines
return a.apply(f, h.concat(d))

这在第一次实现时都是有效的,但现在给出了错误(在我们端没有任何代码更改),这导致地图无法正确渲染(有时没有地图点,有时根本没有地图)。什么好主意吗?无论如何要保持这个原型扩展从影响谷歌地图功能?

NoGray正在扩展Function.prototype ?他们真可耻!

我看了他们的代码,他们给Function.prototype添加了几个方法:set, bind, delay, repeat, defer, inheritrename_method

最令人担忧的是Function.prototype.bind()。现代浏览器已经有一个Function.prototype.bind()方法!它和NoGray定义的不一样。

所以任何试图使用标准.bind()的代码将被打破,当NoGray被包含,它覆盖该方法。

我不知道这是不是破坏谷歌地图的原因,但我一点也不惊讶。

最好的解决方案是抛弃这个行为不良的库,并找到另一个时间选择器,它不会像这样践踏标准的JavaScript方法。

如果你想尝试一个实验,你可以做一个搜索,替换和改变NoGray代码中bind的所有实例到bindx或类似的东西。这将避免标准.bind上的冲突,如果我的理论是正确的,它可能会修复这个错误。

哦,等。更糟的是。他们也扩展了一堆其他的标准原型!除了Function,他们还扩展了RegExp, Array, String, NumberDate的原型!!

(这是我第一次在Stack Overflow的回答中使用"!!",但它在这里是当之无愧的)

我没有耐心查看他们添加到这些原型中的所有方法以寻找潜在的冲突,但如果将bind更改为bindx并不能解决它,您可以查看所有其他原型扩展,找到每个本机对象的MDN文档页面,并查看是否有任何其他标准方法被覆盖。

或者,就像我之前说的,抛弃这个东西!