在 ShopTalk,我们收到了很多用户的请求,他们希望我们在节目笔记中的链接在新标签页中打开。 他们已经厌倦了在通过嵌入式播放器收听播客时点击页面上的链接。 当浏览器离开我们的页面并转到链接时,音频将停止播放。 我们可以解决这个问题。
一个选择是在每个链接上直接应用 target 属性,以便这些链接在新窗口或标签页中打开。
<a href="#" target="_blank">Show Note Link</a>
我们必须浏览整个节目档案,才能将该属性添加到 HTML 中。 这并非不可能,但并不理想,也不够灵活。
我个人通常不喜欢在新标签页中打开链接,我认为这与一般的 UX 共识一致。 除非有充分的理由,否则不要更改默认行为。 我们这里确实有充分的理由,但如果我们再仔细考虑一下,我们实际上想要做的就是防止声音突然停止。 因此,只有在音频实际播放时才更改该行为。
我们使用 MediaElements.js 作为播放器,并在页面上使用 jQuery。 这个播放器提供了我们可以绑定到的事件,用于启动和停止音频。
var player = $('audio').mediaelementplayer();
$(player).on("play", function(event) {
// Links in new tabs
$("a").attr("target", "_blank");
});
酷。 你可以更复杂地处理它,例如在暂停时删除该属性。 我让你决定如何处理它。
但是,如果你不喜欢像这样改变默认行为怎么办? 这可以理解。 我们还可以通过另一种方式实现这一点,那就是使用 onbeforeunload 事件(在浏览器即将更改页面时触发)来确认导航。

这很容易实现。 我们只需要在音频没有播放时删除它。
var player = $('audio').mediaelementplayer();
$(player).on("play", function(event) {
window.onbeforeunload = function() {
return "The podcast will stop playing if you navigate away.";
}
}).on("pause", function(event) {
window.onbeforeunload = void(0);
});
这两种方法都有效。 我选择了 target=”_blank” 技术用于 ShopTalk,但 CodePen 在你对作品进行未保存的更改时会经常使用 onbeforeunload,以防止你丢失更改。 相关地,在过去,我们曾不遗余力地 将整个网站改为 Ajax,以防止你在浏览网站时音频停止。
很棒的解决方案,Chris! 我认为 AJAX/Canvas 似乎是唯一可行的选择,但看起来我错了。 每天学点新东西! 更令人高兴的是,这比使用 AJAX 深入挖掘你的网站要快得多。
干杯!
我一直很喜欢有人使用看似非常简单的解决方案来解决问题。 我喜欢你使用 MediaElements.js 的内置功能,只在实际播放音频时应用 target=”_blank”(或确认框),而不是在暂停时。
我认为这是一篇简短的文章,但它能激发脑洞 :)
为什么不利用 pushstate 动态更改内容呢? 这里提到的两种“解决方案”都有缺点,而 pushstate 可以完美地优雅地绕过问题。
当然。 这也是一个巨大的基础设施解决方案,用于解决一个小问题。 它也不能解决第三方链接的问题。
虽然 pushstate 无法解决第三方链接的问题,但它实际上并不复杂。
我在使用 jQuery 的时候写了一篇文章,它只需要大约 50 行代码。
很有趣的是,可以在网站上扩展它,使其不必加载整个页面,而只需加载内容。 例如,公开一个 API,它只返回内容,而不是标题、侧边栏、页脚以及所有其他不需要的东西。 使用 WordPress,你可以在 PHP 中测试它是否是一个 ajax 请求,然后只返回 the_content()(以及你需要的其他内容)。 或者更好的是,使用 JSON API 插件并重定向到该插件,以获得以 JSON 格式呈现的数据。
这是 第二部分!
我不确定是否要使用 JSON。 这是否会影响 jQuery 的 .load?
不错! 它可能会,但你可以使用 $.getJSON 或其他类似方法,因为你知道它的格式。
我很好奇使用 JSON 的优势是什么……你甚至可以保留文章中的 HTML 内容吗?
优点是,你将拥有所有这些分离的良好内容部分。 或许网站设计不够简单,无法让你只是用另一个 HTML 块替换这个大的主要内容部分。 如果你将数据以 JSON 格式返回,则可以将标题、日期、作者、文章和评论(或其他任何内容)作为分离的部分,并在需要时替换它们。 手术刀与大锤。
啊! 我没想到这一点。 这将非常有用。 我必须将 <title> 作为我返回的 HTML 的一部分,因此 JSON 会有所帮助。
但是,值得注意的是,你可以使用 .load 中的选择器,因此你可以将 HTML 块逐个放置,并定位它们。 但它绝对不如 JSON 清晰。
使用 .load 中的选择器是一个很酷的技巧,但这正是“加载过多”的问题所在。 要使用多个选择器,你必须反复加载,从而加剧问题。
嗯。 我假设 jQuery 应该有一种方法,让我可以传递 XMLHttpRequest 而不是 URL 或类似的东西来缓存响应。 也许没有。
还可以保存播放时间位置,以便可以在新页面中恢复它。 在新的 URL 中添加一个简单的变量就足够了。 例如:
用户点击一个链接;
js 处理程序在新的 URL 中添加“?play=1234”;
在新页面中,js 函数验证是否存在有效的“play”变量并控制播放器以恢复之前的时间。
这仅适用于内部链接。
我个人更喜欢所有将带我到其他网站的链接在新标签页中打开。 因此,我总是使用 Cmd+click 打开几乎所有链接,因为我知道大多数 UX 专家(所有 3 个)以及那些将内容输入 WordPress 的人不会使用 target=”_blank”,rel=”external” 或任何其他解决方案。
如果我在阅读一本实体杂志,然后拿起另一本杂志来阅读里面的内容,它不会擦除我的旧杂志并将所有页面覆盖成新的杂志。 真实生活就是新标签页。
@Nathan:有道理。 我实际上更喜欢看到某种指示,表明链接将在新标签页中打开。 当链接在没有通知的情况下在新标签页中打开时,我会感到有点害怕。
我也是 avid ctrl+clicker。 我不喜欢打扰我打开的内容或正在做的事情,即使是内部链接,但在外部链接上几乎总是如此。
实际上,我通常使用鼠标滚轮点击,除非我在使用笔记本电脑。
我要反驳一下,说这是一个 UX 情况的完美例子,在其中
target=_blank
不仅完全合适,而且是正确且首选的解决方案。但是,与其让每个链接都打开一个新窗口[标签页],不如让播客在新窗口[标签页]中打开。
播客属于播放器,而不是网页。 它在逻辑上应该与网页导航完全分离(不仅仅是通过链接进行导航)。 将它放在它自己的窗口[标签页]中,让用户可以自由地做任何事情,包括使用后退按钮或地址栏。
我还建议将播放器放在单独的窗口中会让人感觉它是一个独立的“应用程序”,就像本机媒体播放器一样——由于这种相似性,我不预计会遇到太多困惑或不便。
它易于实现,并且可以很好地降级。
使用 target 属性而不是弹出一个确认框,这样不是更好吗? 在我 7 年的互联网浏览生涯中,如果你离开一个播放音频或视频的页面,你通常会预期音频或视频会丢失。
或者看看这个疯狂的解决方案。 用户转到一个剧集页面,他们点击“收听”按钮,一个新的预定义窗口打开,其中包含一个播放器。 允许用户浏览整个网站,同时仍然可以选择控制音频? 我在许多电台网站上都遇到过这种情况,只是一个想法。
我以为当人们在线收听音频时,他们会点击“播放”并开始浏览网页。 你让我很惊讶。
好吧,采取额外的步骤来制作一个考虑用户操作的自定义播放器不应该这么困难。
使用
href="#"
通常是一个坏主意。你这样做有特定的原因吗?通常,更好的做法是省略href
,并在 CSS 中应用指针属性,而不是为了获得鼠标指针而添加 href。@Chris 哇。当我对你说这个建议的时候,我并没有想要引发这么大的事情。然而,感觉被倾听很好。我理解有些人对打开新窗口或标签的问题,但是,对我来说,当网站上的子链接干扰我正在做的事情(即更改页面)时,我更生气,而不是仅仅在一个新标签中打开我点击的内容。部分原因是,然后点击后退箭头需要重新渲染页面,并且通常需要重新上传,而仅仅在新标签页上点击关闭,会立即将我带回到我正在做的事情,没有任何延迟。
请注意,我并没有谈论在没有我自愿点击某个链接启动的情况下打开的标签/窗口。在 ShopTalk 的情况下,在我看来,“合理的人”标准应该是,点击播放器意味着这个人想要收听,而不是他们想要停止浏览其他链接——从定义上说,这给了你打开一个新标签的权限。借用你的话来说——“别想太多,只需播放音频即可”。[我理解你的解决方案需要一些脚本,这些脚本需要考虑之前很多帖子的 HTML 代码。]
我认为,只有在音频播放时,页面才能在新窗口中打开,这有点奇怪。我认为,你应该要么让外部网站在新窗口中打开,要么就不要。就像确认解决方案一样,只要它不会在有人选择在新窗口中打开它时触发,那就很酷。
在这种情况下,一个简单的警报竟如此有用,真是令人惊讶。感谢分享!