我有以下一段 HTML,单击时会创建一个新窗口:
<a href="/path/to/site" target="_blank">glide by the people</a>
问题是它没有通过 W3C 验证器。如何创建一个像上面那样验证的链接?
使用此文档类型:
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhmtl1/DTD/xhmtl1-transitional.dtd">
1.0 过渡版包含一些 html“遗留”代码,包括 target="_blank"。
假设严格的 XHTML,您会将 onclick 事件绑定到有问题的锚点。就像是:
<a href="/path/to/my/link" onclick="window.open('/path/to/my/link');return false;">My link</a>
有人还会争辩说,由于渐进式增强和将行为与标记分开,您应该将该 onclick 操作与外部 JavaScript 单独绑定,但这是实现它的基本方法。
我想你问错问题了。target 属性在严格的 XHTML 1.0 中是无效的,无论您是使用 JavaScript 插入它还是仅仅将它放在服务器响应中。
如果您真的想要该属性,则必须使用不同的文档类型,但这也不是正确的答案。
您应该问自己为什么需要该属性。我猜你正在尝试创建一个新的选项卡或窗口。不用说,这通常被认为是糟糕的设计(它剥夺了用户的控制权),但如果你真的想这样做,你可以用 JavaScript 来做。
就是这样:
保留您的链接,但添加一个特殊的类,例如“弹出”给它们。然后添加一行 JavaScript(最好使用 jQuery 或 Prototype 之类的框架以使其更容易),获取该类的所有链接并为它们提供单击处理程序,从而创建新选项卡/窗口并取消默认值操作(即停止链接作为链接工作)。但是,这仍然会惹恼人们,因为它会覆盖预期的行为。
您不应该做的是用虚拟链接替换链接并依赖 JavaScript 来使链接正常工作。
不理会。该target
属性在 HTML 中不再被弃用(生活标准或“5”,取决于您遵循 WHAT WG 还是 W3C)。今天正确的答案是用这个替换你的 DOCTYPE:
<!doctype html>
请注意,它不再必须是大写的,也不必看起来像一个完整的 SGML DOCTYPE 声明。它只是将文档标识为符合标准的 HTML 的残留人工制品。
验证并不是编码质量的全部和全部。
有些东西在浏览器中是“标准的”,而不是 w3c 标准。
当函数已经存在时,使用一点 JS 有点矫枉过正。
如果它只是一两个链接,你可以内联
<a href="http://stackoverflow.com" onclick="window.open(this.href); return false;"></a>
不仅如此,您可能还想要上面的 js 解决方案之一。
而不是使用:
目标="_空白"
利用:
onclick="this.target='_blank'"
注意双引号内的单引号。这为我解决了验证问题,而无需重新定义文档类型。
rel="new-window"
属性添加到链接(而不是target="_blank"
)将 jquery 脚本添加到页面头部并添加以下代码段
<script type="text/javascript">
$(document).ready(function(){
$('a[rel="new-window"]').click(function(){
window.open(this.href);
})
});
</script>
(请注意,当我在 stackoverflow 文本框中输入此内容时,我尚未对其进行测试。)
实际上,这里提出的通过 JavaScript 添加“target”属性的解决方案完全符合标准!
问题是,根据 W3C DOM Level 1 规范,接口HTMLLinkElement DO 具有 target 属性,尽管 HTML 4.01 规范中的 A 元素没有它。
所以在 html 文件中写入“target”属性是无效的,但是稍后通过 DOM 接口使用 JS 将其添加到文档树中是有效的。
如果您需要可访问性或跨平台互操作性,您可能希望验证您的网页。有一个很好的文档回答了关于“为什么要验证?”的问题。W3.org 发布http://validator.w3.org/docs/why.html
恕我直言,当您花额外的时间进行验证时,它表明您关心您的观众。然后,您将拥有在 IE、Opera、Safari 和 Firefox 上显示几乎相同的页面。
你不能通过 W3C 严格验证来做到这一点。
解决方案是:
已经提到的过渡文档类型
不同的验证器(例如CSE)
使用 JavaScript 替换“_blank” - 请参阅http://www.ajaxblender.com/open-links-new-window-w3c-valid-target-blank.html(该链接显示了如何使用 jQuery 巧妙地做到这一点 - 我我粘贴下面的 2 个示例)。
$(文档).ready(函数(){ $('A[rel="_blank"]').each(function() { $(this).attr('target', '_blank'); }); }); // ...或者... $(文档).ready(函数(){ $('A[rel="_blank"]').click(function() { window.open($(this).attr('href')); 返回假; }); });
<a href="..." onclick="return !window.open(this.href)">...</a>