2

我有一个奇怪的问题,我想知道这是否可能。

我正在解析 DOM,并且有一个像这样的元素:

<!-- <a class="pager" title="next" href="www.text.com">NEXT</a> -->

我需要能够用 jQuery 选择这个元素并返回它的href值。我试过这个:

$('a.pager[title="Next"]').attr('href');

但无济于事 - 从这里阅读Selecting HTML Comments with jQuery看来 jQuery 只能选择具有特定nodetype.

www.text.com是否可以从HTML上面的元素返回值?为了让事情变得更棘手,我需要在不依赖 jQuery 插件的情况下做到这一点 - 请只使用本机 Javascript 或纯 jQuery。

以下代码返回整个评论(以及页面上所有其他评论中包含的文本):

$("*")
    .contents()
    .filter(function(){ return this.nodeType == 8;})
    .each(function(){ alert(this.nodeValue);});

但我只需要返回 的值a href,不需要其他评论。想法?

4

3 回答 3

3

实际上,您所要做的就是修剪它:

var markup = $("*").contents().filter(function(){ 
    return this.nodeType == 8;
}).get(0).nodeValue;

var href = $($.trim(markup)).attr('href');

小提琴

编辑:

为了使其更具体,您总是可以进行一些字符串匹配:

var markup = $("*").contents().filter(function(){ 
    return this.nodeType == 8 && this.nodeValue.indexOf('class="pager"') != -1;
});

再次编辑:

你也可以这样做:

var href = $.map($("*").contents(), function(el) {
    var html   = $.parseHTML( $.trim(el.nodeValue) ),
        anchor = $('<div />').append(html).find('a.pager[title="next"]');

    return el.nodeType === 8 && anchor.length ? anchor.attr('href') : null;
});

小提琴

于 2013-06-20T10:31:26.337 回答
2

选择评论后,您需要将其文本内容解析为 HTML,然后才能可靠地遍历编码的 DOM:

var matches = [];
$("*").contents().each(function(){
  if(this.nodeType != 8) return;
  var $div = $("<div>");
  $div.append(this.nodeValue);
  $div.find("a.pager[title='next']").each(function(){
    //replace $(this).attr("href") with this.href if you don't mind
    //relative URLs getting converted to absolute URLs
    matches.push($(this).attr("href"))
  });
});
于 2013-06-20T10:47:53.597 回答
-1
$("*")
    .contents()
    .filter(function(){ return this.nodeType == 8;})
    .each(function(){
        var regex = new RegExp('href=\"(.*)\"','g');
        var hrefValue = regex.exec(this.nodeValue)[1];
        alert(hrefValue);
    });
于 2013-06-20T11:00:29.490 回答