我应该使用iframe而不是ajax吗?

我们正在构建一个带有音频播放器的Drupal站点,该站点应该在您浏览页面时继续播放(类似于soundcloud)。

目前我们正在使用ajax加载点击的网站,并将html注入页面并使用history.js来操纵位置。

但是有一个主要的缺点:

由于新加载的页面上可能有不同的css和js,我们必须将当前脚本,样式和链接元素与ajax响应文本(丑陋的正则表达式)进行比较,并且只添加新的但不存在的元素。 通过这样做,加载另一个页面一旦执行脚本就不会删除/删除/撤消。 这可能会成为一个性能问题(反正是针对标记的正则表达式)。

使用iframe可以解决这个问题和其他问题:

首次单击站点上的链接时,页面内容将替换为仅加载页面的iframe。 音频播放器位于原始dom中,即在iframe之外。 单击iframe内的链接可以在历史API中捕获并使用。

所以,虽然我从未想过我会这么认为:我认为使用iframe可能是更好的选择,不是吗?

PS:我的主要问题是我无法控制网站上的不同页面有不同的脚本,样式确实没问题。 如果网站上只有一个巨大的静态js和css,我没有遇到任何问题。

更新

除了在iOS中,iframe解决方案工作正常。 iframes就像地狱一样。 不过,我认为我们将采用iframe解决方案。

我会说……保持简单,愚蠢。 转到iframe解决方案,我知道它会扼杀你灵魂的一部分,但它是解决问题的最简单方法,代表了未来遇到问题的最低变化。

吻。

我没有看到你不应该使用iframe的原因。 我认为使用iframe在您的网站中嵌入页面很好。 这就是iframe的用途。

iframe曾经对SEO不利,但是,今天的网页抓取工具通常可以在您的网站和iframe内容之间旅行。

使用iframe对您来说更简单,更简单,而不是使用“丑陋的正则表达式”。 为什么不保持简单,对吧? KISS原则

你可以尝试做一些奇怪的事情。

首先,您可以将window对象与新window对象进行比较,并删除所有额外的属性( 这是一个示例 )。 同样的事情可以做documentHTMLElementArray.prototype对象和其他可能通过脚本扩展。 这样你就可以消除很多已定义的东西,垃圾收集器会在某些时候丢弃它。

其次,您要删除所有事件侦听器。 这可以通过重新定义addEventListener等来实现( 例如,参考这个问题 )。

第三,你不应该忘记间隔和超时,可以使用与前一个相同的方法处理(包装setTimeout等)( 在此处找到 )。

当然会留下很多东西,具体取决于页面中运行的脚本。 因此,当用户在没有播放歌曲时点击链接时可以刷新页面(可能在曲目之间转换)。 看到? 要做很多工作,这可能一事无成。 因此,在所有这些理论之后,我会使用iframe。 因为,你知道,例如:如果你的某些网站的脚本包装了任何js函数(就像我们在第二次和第三次那样),那么ajaxing会在这个函数上堆积调用,这真的很糟糕。

如你所说,

使用iframe可以解决此问题和其他问题:当您第一次单击站点上的链接时,页面内容将替换为仅加载页面的iframe。 音频播放器位于原始dom中,即在iframe之外。 单击iframe内的链接可以在历史API中捕获并使用。

你可以用ajax做类似的事情。 将所有需要替换的内容放在一个容器中,然后根据ajax响应替换该容器的内容。 请勿触摸该容器外部的内容。 我认为这也将解决您的性能问题。

如果你不介意的话,我想问你几个问题并在回复时编辑这个回复。 原因是我相信你在开始这个项目时做出了一些不方便的架构决策。 根据您的描述,我认为您在点击标签时加载静态html页面,如果没有,您的后端技术是什么?

理想情况下,您应该将逻辑分为前端和后端,并将前端分成模型,视图和控制器,不一定是使用框架工作,或者通过这样做(或MVVM,如角度那样)一些快速建议如何你’重新加载数据,不要直接注入html,使用你的后端技术将json或xml发送到前端,然后解析它以显示你的html,驻留在前端的模板上,而不是发送你的dom,这将这样做是不必要的缓慢和昂贵。 当你有一个后端时,尝试在黑盒子环境中构建你的持久层,并通过一个简单的API调用操纵器方法,这样它会更干净,执行更快,更可靠。 同样,当您构建移动本机应用程序时,您只需重新使用API​​层。

关于css和js的正则表达式比较听起来像一个完全糟糕的黑客,我同意,它更适合使用iframe,但同样,我需要更多信息来讨论你的整体设置,并希望从更广泛的角度帮助你。

更新:

我理解为什么页面可能有不同的CSS,但我认为你的音乐播放器js应该是相同的源,并附加不同的媒体ID。 假设这个设置,在您的drupal数据库中,我假设是MySql,为“音乐播放器”页面创建一个自定义表,除了标准id索引条目以及created_at,modified_at等之外,还有一个可播放源的字段。

在您创建实际播放器的Drupal前端模板上,从数据库中写入此源ID。 这样你的音乐页面就有一页。 对于CSS,将所有内容保存在一个文件中,可能使用类似SASS或LESS的内容来编译css文件,以使所有内容保持更多顺序。

有一个要点,有你的drupal方面,php用嵌入式JS编写你的html页面,并通过PHP变量将ID从DB传递到前端,因为PHP渲染发生在服务器端,当DOM加载到你的时候JS,页面ID将出现。 希望这有帮助,如果您有更多问题,请告诉我。