【问题标题】:Have javascript make a list of all internal href=#'s on a page让 javascript 列出页面上所有内部 href=# 的列表
【发布时间】:2011-11-19 00:47:00
【问题描述】:

有没有办法让 javascript 在页面上创建一个包含所有内部 href=# 的数组?

这个想法是有一个下拉菜单,其中包含指向页面上所有锚点的链接。

【问题讨论】:

  • 您是否打算加载代码库来完成此操作?还是我们应该尊重您为问题选择的标签?
  • document.links 就是为此量身定做的。
  • 我在想直接的 javascript,因为我对 jquery 的经验为零,但我可能会重新考虑。基本上,现在我所需要的就是输出锚列表的任何东西,无论是在警报中,还是作为 document.write 或任何东西,这样我就可以进一步弄清楚如何处理它
  • 我重新阅读了人们的 cmets,并意识到你是对的,我实际上没有 href。这就是我需要脚本的目的。我确实有一堆
  • @unomyname:我更新了我的答案以获取名称。

标签: javascript html dom hyperlink internal


【解决方案1】:

根据您需要的浏览器支持,您可以这样做:

var elems = document.getElementsByTagName( 'a' );

var hashes = Array.prototype.map.call( elems, function( v, i ) {
    return v.hash;
}).filter( function( v, i, a ) { return !!v && a.indexOf( v ) === i; });

您可以使用 MDN 提供的填充程序获得对旧浏览器的支持。


在您的评论中,您指出您想要name 而不是href

您可以这样做,它会自动带来更好的浏览器支持,但您仍然希望获得对 indexOf() 的支持。

var elems = document.getElementsByTagName( 'a' );

var names = [];

for( var i = 0, len = elems.length; i < len; i++ ) {
    if( elems[i].name && names.indexOf( elems[i].name ) === -1 ) {
        names.push( elems[i].name ); 
    }
}

【讨论】:

  • !!v &amp;&amp; a.indexOf( v ) ==== i; 对我来说是黑魔法,为什么indexOf 检查会失败?
  • @Raynos:当有重复时。在此页面上以两种方式将其复制/粘贴到控制台中。 :) (或者当没有哈希时,但我假设你知道那个。)
  • 谢谢,这很有魅力。也感谢 indexOf 参考。非常有帮助,因为我一直在努力让一切恢复到 ie6
  • @patrick dw:还有一种方法可以同时获取每个这样的锚的标题属性吗?理想情况下,将其推送到哈希数组的第二维?
  • PS 想出了如何将它推送到一个单独的数组中,所以我知道解决方法,但如果可以将 push 用于多维数组,我仍然很感激
【解决方案2】:

这是一个非常简单的函数来返回你想要的数组。不需要 jQuery。

function linksArray(){
    var links = document.getElementsByTagName("a"), linklist = [];
    for(var i=0, len=links.length; i<len; ++i){
        linklist.push(links[i].attributes.getNamedItem("href").value);
    }
    return linklist;
}

【讨论】:

    【解决方案3】:

    您不想要一个锚点列表而不是指向锚点的链接列表吗?使用a[name],a[id]:not([href]) 选择器查找所有具有名称或id 但没有href 的锚元素。

    $('a[name],a[id]:not([href])').each(function(i,e){
      var name = $(e).attr('name') | $(e).attr('id');
      $('<option/>', { value: '#'+name, text: e.text() }).appendTo('#TheSelect');
    });
    

    【讨论】:

    • 为什么投反对票?如果你不解释你认为错的地方是什么,就无法改进答案。
    【解决方案4】:

    jQuery 让这变得非常简单:

    $("a").filter( function() {
        return $(this).attr("href")[0] == "#";
    } ).each( function() {
        $("select").append("<option>" + $(this).attr("href") + "</option>");
    } );
    

    这只是将“href”字段的文本作为“option”标志的文本添加到页面上的每个“select”字段。显然,您需要对其进行定制以满足您的需求,但这应该可以帮助您入门。

    【讨论】:

    • 使用[0] 获取字符串的第一个字符在IE 的早期版本中不起作用。请改用charAt 方法。
    • 问题什么时候提到了 jQuery?
    • @Raynos,这个问题什么时候提到你不能使用 jQuery? jQuery 是一个 JavaScript 库,旨在简化此类任务。问题的作者会很好地学习如何有效地使用它。
    • @Stargazer712 问题的作者最好学习如何有效地使用 DOM。不要用你不理解的抽象来推广黑客攻击。此外,如果我们要使用 DOM 库,我会建议他选择一个好的不,而不仅仅是使用通用的流行 jQuery 库。这与建议某人在询问有关 C 的问题时使用 Boost 库是一样的。
    • 这段代码非常慢,滥用了文档对象模型,而且对跨浏览器不友好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多