我有一个页面上有NoGray Time Picker控件和Google地图实现。如果我删除NoGray时间选择器,Google地图效果很好(渲染,显示地图点等)。但是当我包含NoGray Time Picker时,我收到以下javascript错误:
Uncaught TypeError: Cannot read property 'kc' of undefined
当我使用Chrome进行调试时,它会在调用堆栈的基础上显示NoGray对Function prototype的扩展。这个错误发生在Google API代码中......
没有泄露他们的大部分代码(但希望任何人都可以找到/重现)......我在谈论ng_all.js中的以下内容:
ng.extend_proto(Function, { set: function(
[...] //removed several lines
return a.apply(f, h.concat(d))
这一切都在第一次实现时起作用,但现在正在给出错误(我们的结尾没有任何代码更改),这导致地图无法正确渲染(有时没有地图点,有时根本没有地图)。有任何想法吗?无论如何都要保持这个原型扩展不影响Google Map功能吗?
答案 0 :(得分:1)
NoGray正在延长Function.prototype
?对他们感到羞耻!
我查看了他们的代码,他们为Function.prototype
添加了几种方法:set
,bind
,delay
,repeat
,defer
,inherit
和rename_method
。
最令人担忧的是Function.prototype.bind()
。现代浏览器已have a Function.prototype.bind()
method!它与NoGray定义的不一样。
因此,当包含NoGray并且它会覆盖该方法时,任何试图使用标准.bind()
的代码都将被破坏。
我不知道这是什么打破谷歌地图,但它根本不会让我感到惊讶。
这里最好的解决方案就是抛弃这个表现不佳的库,找到另一个不踩这样的标准JavaScript方法的时间选择器。
但是,如果您想尝试实验,则可以进行搜索并替换并将NoGray代码中的bind
的所有实例更改为bindx
或类似的内容。这样可以避免标准.bind
上的冲突,如果我的理论是正确的,它可能会解决这个问题。
Function
之外,它们还扩展了RegExp
,Array
,String
,Number
和Date
的原型!!!
(这是我第一次使用" !!!"在Stack Overflow回答中,但它在这里当之无愧。)
我没有耐心查看他们添加到这些原型中的所有方法以查找潜在的冲突,但是如果将bind
更改为bindx
则无法修复它,您可以浏览所有其他原型扩展,找到每个本机对象的MDN文档页面,并查看是否有任何其他标准方法被覆盖。
或者,正如我之前所说,只是放弃了这件事!