【问题标题】:javascript test if URL relative or absolute and not mailto:javascript 测试 URL 是相对的还是绝对的,而不是 mailto:
【发布时间】:2012-10-11 13:02:29
【问题描述】:

我有带有按钮/链接/带有mailto的电子邮件的表格:并编写了一个默认的双击功能,双击该行会将用户引导到表格中的最后一个链接。

99% 的表格将在最后一列有“编辑”按钮。

$('table:not(.noDoubleClick) tr td').dblclick(function() {
    var linkEl = $(this).parents('tr').find('td:last-child a');

    if(!linkEl.length){
        return false;
    }

    if (linkEl.attr('href') && linkEl.attr('onclick') === undefined && !linkEl.hasClass("popme")) {
        document.location = linkEl.attr('href');
    } else {
        linkEl.click();
    }
});

这很好用,直到我有一个罕见的表,其中最后一列是带有 mailto 的电子邮件地址。

问:如何检查href 是否只是相对/绝对链接。这样这将排除 mailto: 以及任何其他非标准 URL 的链接。

我知道我可以这样做:linkEl.attr('href').substring(0, 7) == "mailto:" 专门针对 mailto 进行测试,但是是否有更好的方法来执行此操作,而无需对要排除的不同协议进行大量 IF 测试。

使用来自@epascarello 的工作解决方案进行更新:

$('table:not(.noDoubleClick) tr td').dblclick(function(e) {
    var linkEl = $(this).parents('tr').find('td:last-child a');
    var linkElHref = linkEl.attr('href');

    // Check if has href and http protocol
    if(!linkElHref.length || this.protocol.indexOf("http") !== 0){
        e.preventDefault();
        return false;
    }

    if (linkElHref && linkEl.attr('onclick') === undefined && !linkEl.hasClass("popme")) {
        document.location = linkElHref;
    } else {
        linkEl.click();
    }
});

【问题讨论】:

  • 为什么你认为这不是解决问题的好方法?
  • mailto 之类的其他内容是什么意思?有大量可用的协议。如果您只想处理 http(s) 或相对链接,那么这就是您应该测试的内容。
  • 好吧没意识到他们是协议。 “有没有更好的方法来做到这一点,而无需对要排除的不同协议进行大量 IF 测试”。即测试这是否只是一个相对/绝对链接

标签: javascript jquery


【解决方案1】:

您可以使用链接的属性查找协议。

var theProtocol = linkEl.prop("protocol");
var isHttp = linkEl.prop("protocol").indexOf("http") === 0;

【讨论】:

  • 我很好奇。你能再解释一下吗?如果是 mailto 或相对链接,会是哪种协议?
  • 那么相对链接会默认使用http协议吗?
  • 仅供参考:您可以写 this.protocol 而不是 $(this).prop('protocol')
  • @David, this 不是链接,它是一个 td 元素。所以不,this.protocol 在这种情况下不起作用。
  • 你为什么使用 "===" ?我认为“==”就足够了
【解决方案2】:

对于文本解决方案,您可以使用以下正则表达式:

var x = new RegExp('^([^:/?#]+:)?(//[^/?#]*)?([^?#]*)');
x.match(url);

如果第二个内存位置是 undefinedhttp:https:,那么您可能正在处理常规 URL。

【讨论】:

    猜你喜欢
    • 2012-05-28
    • 2011-04-29
    • 2011-07-19
    • 2011-01-13
    • 1970-01-01
    • 2015-01-09
    • 2011-05-22
    • 1970-01-01
    相关资源
    最近更新 更多