我们有一个网站几乎完全是淘汰出局的,我们需要支持所有主流浏览器,包括Internet Explorer回到IE7(不是IE6)。
Chrome已经支持我们实际关注的几乎所有HTML 5功能,而且Modernizr像Champ一样处理CSS黑客攻击。但有时候我们仍然需要使用polyfill,两个值得注意的例子是placeholder
属性,最近是<details>
元素。
大多数polyfill是或依赖于jQuery插件,这在理论上是很好的。不幸的是,它们在处理动态加载的内容时往往也是无效的 - 当你使用knockout(或者任何模板引擎)时,它会有 ton 。进一步复杂化的问题是我们使用淘汰赛作为真正的MVVM,所以在一堆JS黑客中没有好的地方可以重新加载插件(就我们的架构而言,这可能是件好事,但令人沮丧的是前)。
我们能够为Firefox和IE9使用DOMNodeInserted
事件(我不知道)推出一个半可靠的实现。不幸的是它在IE8中不起作用,因为legacy IE doesn't support it并且在这些浏览器中似乎几乎不可能复制。 onreadystatechange
一开始似乎很有希望但事件往往过早发生 - 即使明确检查readyState
- 并且polyfills会错过目标,可以这么说。
我们尝试过的唯一一个在IE7 / IE8中可靠运行的选项是使用重复超时来每50毫秒重新运行polyfill。不幸的是,它也不断消耗整个CPU,并且将其提升到甚至100毫秒,导致UI的延迟过于明显,因此不适合生产使用。
所以:是否有任何可靠的方法将传统的polyfill技术与动态内容和模板引擎(如knockoutjs)相结合,在每个主流浏览器中都可以使用至少IE7?
(FWIW,我们最终使用knockout afterRender
绑定管理了一个解决方法,但是这种方法将“poly”从“polyfill”中取出。我希望能找到一些我们可以编写的内容然后忘了。)
答案 0 :(得分:2)
我解决同样问题的方法是在敲除绑定(http://knockoutjs.com/documentation/custom-bindings.html)中包装我的大多数jQuery插件和一般行为。所以我有一个占位符“绑定”,我在每个输入上使用<input data-bind="placeholder:'Some Placeholder Text'"/>
,或者根据需要简单地设置placeholder
属性或做一些IE黑客攻击。
更广泛的解决方案是增强敲除绑定提供程序(http://www.knockmeout.net/2011/09/ko-13-preview-part-2-custom-binding.html)。绑定提供程序是遍历DOM的东西(在加载时和动态加载时)并标识绑定。默认情况下,这实际上意味着它只是寻找数据绑定属性和ko注释,但您可以更改此选项以查找占位符,日期或数字输入的输入类型等属性,并添加您的IE黑客。