我们有一个网站,几乎完全由knockout驱动,我们需要支持所有主流浏览器,包括IE7(不包括IE6)及以上版本的Internet Explorer。
Chrome已经支持了我们实际关心的HTML5功能,而Modernizr则处理CSS hack得非常好。但是,有时我们仍然需要使用polyfills,其中两个值得注意的例子是placeholder属性和最近出现的details元素。
大多数polyfills都是基于jQuery插件的,这在理论上很好。不幸的是,它们也往往无法有效处理动态加载的内容——当您使用knockout(或任何模板引擎)时,这种情况就会很常见。更加复杂的是,我们将knockout用作真正的MVVM,因此没有合适的地方来插入一堆JS hack以重新加载插件(就我们的架构而言,这可能是一件好事,但在这个问题上令人沮丧)。
我们能够使用
Chrome已经支持了我们实际关心的HTML5功能,而Modernizr则处理CSS hack得非常好。但是,有时我们仍然需要使用polyfills,其中两个值得注意的例子是placeholder属性和最近出现的details元素。
大多数polyfills都是基于jQuery插件的,这在理论上很好。不幸的是,它们也往往无法有效处理动态加载的内容——当您使用knockout(或任何模板引擎)时,这种情况就会很常见。更加复杂的是,我们将knockout用作真正的MVVM,因此没有合适的地方来插入一堆JS hack以重新加载插件(就我们的架构而言,这可能是一件好事,但在这个问题上令人沮丧)。
我们能够使用
DOMNodeInserted
事件(已弃用,我知道)在Firefox和IE9中提供半可靠的实现。不幸的是,在IE8中它不起作用,因为旧版IE不支持它,在这些浏览器中似乎几乎不可能复制。一开始onreadystatechange
看起来很有前途,但事件往往会过早地触发-即使明确检查了readyState
,而且polyfill也会错过目标,可以说。
我们唯一尝试过并在IE7/IE8中真正可靠的选项是使用重复的超时来每50毫秒重新运行polyfills。不幸的是,这也会消耗整个CPU,并将其增加到100毫秒甚至会导致UI中出现明显的延迟,因此不适合生产使用。
所以:是否有任何可靠的方法将传统的polyfill技术与动态内容和模板引擎(如knockoutjs)结合使用,可以在至少IE7的所有主要浏览器中工作?
< p > < em >(顺便说一句,我们最终使用了 Knockout 的 < code > afterRender 绑定来解决问题,但这有点让“polyfill”变得不太“poly”了。我希望有一种方法可以编写一次,然后就可以忘记它。)
placeholder
属性的可用性,特别是因为我(故意)没有提及我们如何使用它,而且我们已经有一个[ux.se]网站来处理这个问题。我感谢您对这个主题的关注,但我宁愿不要有噪音,也不相信这会使其他成员受益。 - Aaronaught