【问题标题】:All Bootstrap dropdowns show the same item所有 Bootstrap 下拉菜单都显示相同的项目
【发布时间】:2014-11-28 04:12:58
【问题描述】:

我正在使用一段 Js 代码来显示 Bootstrap 下拉菜单的选定项。我的 ASP.NET 页面上有几个下拉菜单。当我使用此代码并选择第一个(或任何)下拉列表中的一个项目时,所有其他下拉列表也会更改它们的值。我是 Javascript 和 Bootstrap 的新手,已经搜索过类似的问题,但没有找到任何结果...

JS代码(找到here):

$(function(){
   $(".dropdown-menu li a").click(function(){
     $(".btn:first-child").text($(this).text());
     $(".btn:first-child").val($(this).text());
   });

});

我已经尝试了上述的一些有趣的变体。包括一个用每个下拉列表的 div 类的名称替换“.btn:first-child”的方法,然后列出所有这些,希望 JS 知道要更改哪些下拉列表……那没用.

使用的标记(我在 row/col-md-6 中使用了几个下拉菜单):

    <div class="row">
        <div class="col-md-6">
            <div class="dropdown">
                <button class="btn btn-default dropdown-toggle" type="button" id="ddlForwardTo" data-toggle="dropdown">
                    Select a Forward To
                    <span class="caret"></span>
                </button>
              <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
              </ul>
            </div>
        </div>
        <div class="col-md-6">
            <div class="dropdown">
                <button class="btn btn-default dropdown-toggle" type="button" id="ddlManufacturing" data-toggle="dropdown">
                    Select a Manufacturing contact
                    <span class="caret"></span>
                </button>
              <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
                <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
              </ul>
            </div>
        </div>
    </div>

任何帮助。

更新:


总结超过 12 小时工作的挫败感 - 如果您遇到此类错误,请务必清除 Google Chrome 中的缓存! Chrome 缓存 Javascript。

Chrome -> 工具 -> 清除浏览数据... -> 选择“缓存的图像和文件”并清除它。

【问题讨论】:

  • 你可以尝试从this(被点击的元素)开始导航DOM。查看closest 函数。

标签: javascript asp.net twitter-bootstrap


【解决方案1】:

具体来说,你可以考虑这样的事情:

$(function(){
   $(".dropdown-menu li a").click(function(){
       $(this).parents('.dropdown-menu').siblings('.btn').text($(this).text());
       $(this).parents('.dropdown-menu').siblings('.btn').val($(this).text());
   });
});

这样,当在 dropdown-menu 类的元素内的列表项内单击锚点时,您将向上移动 DOM 以找到该锚点元素的 .dropdown-menu 父级。然后,您只需更改该特定父级的文本和值。正如@jjk_charles 指出的那样,您发布的代码选择了所有下拉菜单。

JSFiddle

【讨论】:

  • 我不知道如何,但这在我的环境中不起作用。我看到它在链接中有效,这让我感到困惑。我想知道是否有什么东西正在与这段 JS 发生冲突,并且没有让它正常工作......
【解决方案2】:

我刚刚遇到了类似的问题。要考虑的事情是按钮标签的“id”和 aria-labelled by。但解决问题的方法是将按钮包装在“btn-group”div 中。

(引导程序 4)

<div class="btn-group"> <!-- Here -->
   <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false" id="editDetailsLink">Edit Details</button>
   <div class="dropdown-menu" x-placement="bottom-start" style="position: absolute; will-change: top, left; top: 38px; left: 0px;" aria-labelledby="editDetailsLink">
      <a class="dropdown-item" href="#">Retailer</a>
      <a class="dropdown-item" href="#">Websites</a>
   </div>
</div>
<div class="btn-group"> <!-- Here -->
   <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown" aria-expanded="false" id="viewChildrenLink">Children</button>
   <div class="dropdown-menu" x-placement="bottom-start" style="position: absolute; will-change: top, left; top: 38px; left: 0px;" aria-labelledby="viewChildrenLink">
      <a class="dropdown-item" href="#">Retailers</a>
      <a class="dropdown-item" href="#">Ratings</a>
   </div>
</div>

【讨论】:

    【解决方案3】:

    $(function(){
       $(".dropdown-menu li a").click(function(){
         $(this).parents('.dropdown').children('.btn').text($(this).text());
         $(this).parents('.dropdown').children('.btn').val($(this).text());
       });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet"/>
    
    <div class="row">
            <div class="col-md-6">
                <div class="dropdown">
                    <button class="btn btn-default dropdown-toggle" type="button" id="ddlForwardTo" data-toggle="dropdown">
                        Select a Forward To
                        <span class="caret"></span>
                    </button>
                  <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
                    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
                    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
                    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
                  </ul>
                </div>
            </div>
            <div class="col-md-6">
                <div class="dropdown">
                    <button class="btn btn-default dropdown-toggle" type="button" id="ddlManufacturing" data-toggle="dropdown">
                        Select a Manufacturing contact
                        <span class="caret"></span>
                    </button>
                  <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
                    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
                    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
                    <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
                  </ul>
                </div>
            </div>
        </div>

    在你点击事件中:

    $(this).parents(".dropdown").children(".btn").text($(this).text());
    

    可以将children 替换为find

    【讨论】:

    • 我添加了对 bootstrap.min.css 的引用(我有其他的)。在那之后,控制台中唯一的错误是启动时出现的错误,说明该 CSS 文件中的某些内容是错误的。当我实际更改下拉所选项目时,Chrom 开发工具控制台中没有错误。太奇怪了,因为我们有完全相同的代码......但它对你有用。
    • 顺便说一句,控制台中的错误是“意外令牌:{”。通过CSS验证器运行bootstrap.min.css,出现几十个错误。我怀疑令牌错误与我的问题有关。
    • @Paul 通过 cdn 发布的代码存在错误的可能性很小。检查您的 html 头部部分,如果单击事件不会触发并且控制台中没有错误,则表示您将 js 代码放置在错误的位置。放置一些断点检查它是如何工作的。
    • 嗯,所有的答案都是正确的。想知道为什么吗?谷歌浏览器缓存 Javascript。在清除缓存并将 JS 放入您的答案(或者可能是其他任何一个)之后,下拉列表现在可以正常工作。 GRR 铬!!!
    • 为避免这种情况,请将您的代码放在单独的文件中并为其添加时间戳。防止浏览器缓存js的解决方案有很多。
    【解决方案4】:

    使用选择器$(".btn:first-child"),您实际上是选择了类btn 的所有元素中的所有第一个子元素。相反,您想要做的是,您需要编写一个选择器,使其仅选择与被选择的下拉列表直接链接的选择器。

    您可以执行以下类似的操作,以达到相同的目的:

    $(this).parent().parent().parent().find(".caret").text("new text");
    

    当然,上述内容可能不是直接在您的代码中使用的最佳选择,请相应地修改选择器以适合您的实际 html 代码结构。

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 2018-11-29
      • 2018-03-22
      • 2020-10-01
      • 2014-11-06
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多