【问题标题】:JQuery Add/ Remove LinksJQuery 添加/删除链接
【发布时间】:2011-10-28 22:46:54
【问题描述】:

我有一个链接列表,用于过滤结果,例如

过滤器 1、过滤器 2、过滤器 3、过滤器无

单击过滤器链接时,我使用 JQuery 加载命令更新 div 的内容。

然后我想要发生的是用户单击的过滤器链接只是文本而不是链接(这将阻止用户重新单击该链接,并显示他们正在使用的过滤器)。如果用户然后单击另一个过滤器链接,我希望恢复以前的链接,然后将他们单击的过滤器上的链接删除。

我将如何使用 JQuery 执行此操作?我找到了删除命令,但我认为这不会有帮助,因为当用户点击不同的过滤器时我将无法恢复它。

谢谢

【问题讨论】:

    标签: jquery


    【解决方案1】:

    你应该在这里找到答案Disabling links with JQuery

    感谢@Will 提供这个优雅的解决方案。

    jQuery('#path .to .your a').each(function(){
        var $t = jQuery(this);
        $t.after($t.text());
        $t.remove();
    });
    

    【讨论】:

    • 但是当另一个链接被点击时,你将如何反转这个操作并恢复链接呢?目标是在文本之间切换链接,而不是单向转换。
    • 我会使用.html() 而不是.text() 来保留<a> 标签内的元素。
    【解决方案2】:

    例如,与添加类相比,绑定和取消绑定需要大量开销。

    绑定/取消绑定解决方案可行,但不是最佳解决方案。

    这里有一个更好的解决方案。

    .disabled {
                text-decoration:none;
                color: black;
            }
    <div>
        <a href="" class="filterLink">link</a><br />
        <a href="" class="filterLink">link</a><br />
        <a href="" class="filterLink">link</a><br />
    </div>
    
        $('document').ready(function() {
    
                $('.filterLink').click(function() {
                    if($(this).hasClass('disabled')) {
                        return false;
                    }
                    $(this).addClass('disabled');
                    $(this).siblings().removeClass('disabled');
                    return false;
                });
    
        });
    

    【讨论】:

      【解决方案3】:

      你可以做的最简单和最干净的方法是定义两个css类,activefilter和inactivefilter,第一个让它看起来像一个链接,第二个让它看起来不活跃,你的HTML/jQuery会是这样的:

      <a href="#" class="filter">Filter 1</a>
      <a href="#" class="filter">Filter 2</a>
      <a href="#" class="filter">Filter 3</a>
      <a href="#" class="filter">Filter None</a>
      
      var doStuff = function() {
        alert('stuff');
      };
      $(function() {
        $('a.filter').bind('click', function() {
          $('a.filter').removeClass('activefilter').unbind('click.stuff');
          $(this).addClass('activefilter').bind('click.stuff',doStuff);                
          return false;
        });
      });
      

      【讨论】:

      • 这是这里唯一好的解决方案,除了你不需要两个类。忽略 inactivefilter 类,它仍然可以工作:)
      • 不,因为据我了解,当您开始时,没有应用任何过滤器,因此没有一个处于活动状态,所有这些都是可点击的。关于您的另一个问题,您可以轻松添加一个命名空间单击事件,您可以绑定和取消绑定到活动和非活动过滤器,但由于不清楚并且主要问题似乎是链接,我没有产生任何代码,但我可以做到
      • 我删除了我之前的评论。您更正了代码上的类命名。我毫不怀疑你能做到。你是对的,问题不是很清楚。尽管据我了解,绑定和解除绑定需要大量开销。我倾向于测试是否存在您正在添加和删除的“activefilter”类,而不是绑定和取消绑定。制作完美的旗帜,而且速度更快。不过,无论哪种方式都行得通。
      • 是的,我刚刚添加了一个命名空间事件,正是因为我不知道他将在何时何地添加处理程序来做他的事情,如果我将所有内容都包含在同一个处理程序中,事情会很紧凑耦合。
      【解决方案4】:

      将两个元素一个是锚标记,另一个只是普通文本在 span 内进行标识。然后在两个/所有过滤器上使用 jQuery toggle() 循环启用/禁用或显示隐藏锚标记或跨度元素。

      【讨论】:

        【解决方案5】:

        这是锚点:

        <a id="myLink" href="myPage.html" onclick="return true" />
        

        调用禁用函数

        disableLink('#myLink');
        

        调用启用函数

        enableLink('#myLink');
        

        当你想禁用链接时,只需让 onclick 返回 false

        function disableLink(selector){
            $(selector).attr('onclick', 'return false'); // disable link
            $(selector).css('text-decoration', 'none'); // remove underline
        }
        

        当你想启用它时

        function enableLink(selector){
            $(selector).attr('onclick', 'return true'); // enable link
            $(selector).css('text-decoration', 'underline'); // add underline
        }
        

        【讨论】:

        • 我认为问题的重点不是防止链接被点击,而是通过将链接转换为纯文本来向用户显示他们所在的链接。 (然后如果单击另一个链接并变为“活动”,则恢复该更改)
        • @Seth Petry-Johnson,好吧,上面的链接并没有删除链接,但它使它看起来像文本,并且还阻止了再次单击它。这样问题就轻松解决了。
        • 同意,我认为您的更新答案在回答问题方面做得更好。我仍然认为添加/删除“活动链接”CSS类比通过JS显式设置“文本装饰”属性更干净。我宁愿在 .css 文件中进行样式设置,也不愿修改 jquery 调用:)
        【解决方案6】:

        jquery:

            $(function(){
             $("a:first").bind("click",function(){
                 $("div").append("<span>Link</span>");
                $(this).remove(); 
            });
               $("a:last").bind("click",function(){
            $(this).prev().find("span").wrap("<a href=#>");
            });
        });
        

        HTML:

        <body>
        <div><a href="#">Link</a></div>
        <a href="#">Link2</a>
        </body>
        

        【讨论】:

          【解决方案7】:

          我知道这有点晚了,但我发现使用 a 标签的一个问题是,除非你拿走指针光标,否则你仍然会得到指针。即使您删除了单击的绑定。所以还应该做的一件事是:

          光标:文本

          【讨论】:

            【解决方案8】:

            与其将“活动”链接转换为文本,更简单的解决方案是使用 CSS 来指示哪个链接是活动的。例如,您可以定义一个名为“active”的样式。每次点击链接时,您都会:

            1. 从任何其他链接中删除“活动”类;
            2. 将“活动”类添加到刚刚单击的链接中

            如果你真的想将链接转换为文本,你可以创建一个这样的 html 结构:

            <div class="link-wrapper">
                <div class="link"><a href="">...</a></div>
                <div class="text" style="display: none">Text-version of the link</div>
            </div>
            

            然后,每次点击链接时你:

            1. 使用 .parent() 方法获取对“链接包装器”div 的引用
            2. 在“链接”div 上调用 .hide()
            3. 在“文本”div 上调用 .show()
            4. 将步骤 2 和 3 反向用于当前活动的那个。

            【讨论】:

            • 现在你必须维护双倍的内容链接
            • 这就是为什么我推荐我的答案的第一部分,即“使用 CSS 来反映哪个链接是‘活动的’”。但是这个问题明确询问了用文本替换链接以及稍后恢复它的方法,而我发布的标记是这样做的一种方法,而不会丢失有关链接的任何信息(如他们的目标 URL)。这里的其他解决方案非常适合删除链接并放入文本,但它们没有解决单击下一个链接时如何反转该操作。
            • 我的解决方案不会删除任何东西。它使链接不可点击,并且在视觉上使其看起来像文本。另外,我的解决方案不是为自己做更多的工作,而您的解决方案则必须保持双倍的内容。例如,如果链接文本发生更改,您必须在两处而不是一处进行更改。
            猜你喜欢
            • 1970-01-01
            • 2015-03-27
            • 1970-01-01
            • 1970-01-01
            • 2016-01-08
            • 2011-10-16
            • 1970-01-01
            • 2013-12-27
            • 2011-04-29
            相关资源
            最近更新 更多