我们有一个几乎完全淘汰淘汰的网站,我们需要支持所有主流浏览器,包括回到 IE7(而不是 IE6)的 Internet Explorer。
Chrome 已经支持几乎所有我们真正关心的 HTML 5 功能,Modernizr 像冠军一样处理 CSS hack。但有时我们仍然不得不求助于 polyfill,两个值得注意的例子是placeholder
属性和最近的<details>
元素。
大多数 polyfill 都是或依赖于 jQuery 插件,这在理论上很好。不幸的是,它们在处理动态加载的内容方面也往往效率低下——当您使用淘汰赛(或任何模板引擎,真的)时,这种情况很多。更复杂的事情是我们使用淘汰赛作为真正的 MVVM,所以在一堆 JS hack 中没有合适的地方来重新加载插件(就我们的架构而言,这可能是一件好事,但令人沮丧的是正面)。
DOMNodeInserted
我们能够为 Firefox 和 IE9 使用事件(我知道已弃用)提出了一个半可靠的实现。不幸的是,它在 IE8 中不起作用,因为旧版 IE 不支持它,而且在那些浏览器中复制似乎几乎不可能。onreadystatechange
一开始似乎很有希望,但该事件往往触发得太早 - 即使readyState
已明确检查 - 并且 polyfills 可以说没有达到目标。
我们尝试过的唯一在 IE7/IE8 中真正可靠工作的选项是使用重复超时以每 50 毫秒重新运行一次 polyfill。不幸的是,这也不断消耗整个 CPU,甚至将其提高到 100 毫秒都会导致 UI 延迟太明显,因此不太适合生产使用。
那么:是否有任何可靠的方法可以将传统的 polyfill 技术与动态内容和模板引擎(如 knockoutjs)相结合,至少在 IE7 等主流浏览器中都可以使用?
(FWIW,我们最终确实使用淘汰赛的afterRender
绑定管理了一个解决方法,但是这种方法将“poly”从“polyfill”中取出。我希望我们可以写一次然后忘记的东西。)