【发布时间】:2016-02-02 09:24:39
【问题描述】:
我们正在构建一个带有音频播放器的 Drupal 站点,该播放器在您浏览页面时会一直播放(类似于 soundcloud)。
目前我们正在使用 AJAX 加载被点击的<a> 的站点,并将 HTML 注入页面并使用 history.js 来操纵位置。
但有一个主要缺点:
由于新加载的页面上可能有不同的 CSS 和 JS,我们必须将当前的脚本、样式和链接元素与 AJAX 响应文本(丑陋的 regex)进行比较,然后只添加新的,但不存在的元素。通过这样做,加载另一个页面不会在执行脚本后删除/删除/撤消。这可能会成为一个性能问题(而 regex 无论如何都是针对标记的)。
使用 iframe 可以解决这个问题和其他问题:
当您第一次点击网站上的链接时,页面内容会被替换为 iframe,它只会加载页面。音频播放器位于原始 DOM 中,即在 iframe 之外。 iframe 内的点击链接也可以在历史 API 中被捕获和使用。
所以,虽然我从没想过我会这样想:我认为在这里使用 iframe 可能是更好的选择,不是吗?
PS:我的主要问题是我无法控制网站上不同的页面有不同的脚本,样式真的没问题。如果网站范围内只有一个巨大的静态 JS 和 CSS,我没有问题。
更新
iframe 解决方案工作正常,iOS 除外。 Iframes 简直是天方夜谭。不过,我认为我们将使用 iframe 解决方案。
【问题讨论】:
-
你可以有一个“reset.css”文件来清理所有以前加载的css——但是你需要确切地知道每个页面将以css的方式应用什么,听起来你无法控制。如果通过
links 加载,也可以卸载 css,但同样取决于您加载 css 的方式,请看这里:stackoverflow.com/questions/1598899/unload-css-from-webpage -
css 没问题。如果您删除样式或链接元素,则 css 将被撤消。如果您附加新的,样式会更新。但脚本的行为不同
-
为什么需要不同的css/js文件?你不能连接/缩小它们并服务一次吗?这样,当更改页面时,您只需要正确处理不同的状态(绑定事件,取消绑定它们......)。
-
您是否使用 pjax(或类似的,例如 github.com/defunkt/jquery-pjax)来处理这些请求?
-
@luchaos nope,常见的 jquery ajax
标签: jquery ajax iframe drupal html5-history