【问题标题】:How can I make clicking a link populate a value of an input element that appears before it?如何使单击链接填充出现在它之前的输入元素的值?
【发布时间】:2012-04-16 14:10:49
【问题描述】:

我有以下:

<div class="btn-group">
    <input disabled="disabled" id="dialogType">
    <button data-toggle="dropdown" class="dropdown-toggle">
    <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" id="towns">
        <li><a data-value="0Z" href="#">A</a></li>
        <li><a data-value="10" href="#">B</a></li>
    </ul>
</div>

<div class="btn-group">
    <input disabled="disabled" id="dialogStatus">
    <button data-toggle="dropdown" class="dropdown-toggle">
    <span class="caret"></span>
    </button>
    <ul class="dropdown-menu" id="places">
        <li><a data-value="22" href="#">C</a></li>
        <li><a data-value="33" href="#">D</a></li>
    </ul>
</div>

过去,当单击其中一个链接时,我使用以下 javascript 填充#town 标签字段:

$('#towns > li > a').click(function (e) {
    e.preventDefault();
    $('#town').text($(this).html())
 });

现在我想让这个 javascript 适用于 DIV 内的任何类似的 ul 类下拉菜单。

所以我想要的是:

  • 当用户单击 A 等链接时,btn 组内的第一个输入元素将被赋予 A 的值以及“0Z”的数据值
  • 当用户点击诸如 D 之类的链接时,该 btn 组内的第一个输入元素将被赋予 D 值以及数据值“33”

谁能告诉我怎么做。我只需要上面函数的更通用版本。 .

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    我建议,虽然目前未经测试:

    $('.dropdown-menu a').click(
        function(e){
            e.preventDefault();
            var that = $(this),
                dValue = that.attr('data-value');
            that.closest('.btn-group').find('input:first').attr('data-value',dValue).val(dValue);
        });
    

    基本上它的工作方式是:

    1. 点击链接会阻止默认操作,
    2. 找到最近的.btn-group(祖先)元素,
    3. 在其中找到第一个后代input 元素,
    4. data-value(分配给dValue变量)分配给inputdata-value属性,最后
    5. dValue 的值指定为valueinput

    已编辑以回应 OP 留下的评论:

    ...我将有更多带有 Ajax 加载的按钮组的 HTML。对不起,我应该这么说。因此,我是否也应该使用“on”...

    由于btn-group 元素是动态添加的,我建议进行以下更改:

    $('#idOfBtnGroupParentElement').on('click','.dropdown-menu a',
        function(e){
            e.preventDefault();
            var that = $(this),
                dValue = that.attr('data-value');
            that.closest('.btn-group').find('input:first').attr('data-value',dValue).val(dValue);
        });
    

    参考资料:

    【讨论】:

    • 您好,David,Richard 建议使用“on”。我将有更多带有 Ajax 加载的按钮组的 HTML。对不起,我应该这么说。因此,我也应该使用“on”。这是否会使您的函数即使对于稍后添加的代码也能工作,或者我是否需要在 ajax 重新加载后准备好在另一个文档中再次调用您的代码?
    • @MarieJ,查看编辑。您可以在 Ajax 中重新绑定单击处理程序以添加新的 btn-group 元素,但使用绑定到 btn-group 元素的父元素的 on() 更容易。或者到 DOMReady 上存在于 DOM 中的那些元素的任何祖先元素。是的,如果我们从一开始就知道这一点会更容易... =) 哦,理查德是谁..?
    • Richard Neil - 另一位回答者。感谢您的快速回复。
    • 啊!不客气,我很高兴能帮上忙(而且,希望我是……)=)
    【解决方案2】:

    您可以使用.closest 查找与给定选择器匹配的被点击元素的最近父级。

    要设置输入的值,请使用.val,要设置数据属性,请使用.data

    $('.btn-group a').click(function(e) {
       e.preventDefault();
       var input = $(this).closest('.btn-group').find('input');
    
       input.val($(this).html());
       input.data('value', $(this).data('value'));
    });
    

    【讨论】:

      【解决方案3】:

      这应该可以解决问题...

      $(".dropdown-menu a").click(function(e){
         e.preventDefault();
      
         var value = $(this).data("value");
         var text = $(this).html();
      
         var input = $(this).parents(".btn-group").find("input");
      
         input.data("value", value);
         input.val(text);
      });
      

      【讨论】:

        【解决方案4】:

        我猜这和他们一样通用。我使用委托是因为我不知道你有多少 a 元素。

        $('.btn-group').on('click', '.dropdown-menu a', function (e) {
        
            var $this = $(this),
                $input = $this.closest('.btn-group').find('input:first')
                ;
            e.preventDefault();
        
            $input.val($this.html())
                  .attr('data-value', $this.attr('data-value'))
                  ;        
        });
        

        请注意我使用的是.on,因此您应该使用 jQuery 1.7 或更高版本来使用它。如果没有,请使用delegate 看看如何做到这一点。

        【讨论】:

        • 非常感谢。你能告诉我这样做的原因是什么: var $this = $(this) ?
        • 还有一个问题。我将在我的页面底部准备好一个文档。但是,带有 btn 组的代码可以使用 ajax 重新加载。由于您使用了“on”,那么这仍然适用于加载到页面上的新 HTML 吗?
        • 您将$(this) 的结果缓存到一个变量中,这样您就不必多次执行评估。每个$(this) 调用一个函数,我们希望尽可能多地消除函数开销。 jQuery 很快,但最好在编码时进行这样的优化。 :)
        • 至于第二个问题,如果.btn-group 元素本身是动态加载的,那么您必须将委托选择器提升到更高级别。例如,如果您的 .btn-group 元素被加载到 #menus 元素中并且是静态的,则您需要修改我的答案以改为阅读 $('#menus').on('click','.btn-group .dropdown-menu a', function () {})
        【解决方案5】:
        $('ul.dropdown-menu a').on('click', function(e) {
          e.preventDefault();
          $(this).parent().parent().parent().find('input:first').val($(this).text()).attr('data-value', $(this).attr('data-value'));
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多