代码之家  ›  专栏  ›  技术社区  ›  ReynierPM

为什么我一点击输入框就会触发事件?

  •  1
  • ReynierPM  · 技术社区  · 8 年前

    具有以下HTML/jQuery代码:

    $(function() {
      "use strict";
    
      var manage_form_listing_grid = $("#manage_form_listing"),
        forms_search = $("#forms_search"),
        btn_search_forms = $("#btn_search_forms"),
        chk_show_archived = $("#show_archived"),
        inp_search_form_by_name = $("#search_form_by_name");
    
      forms_search.keypress(function(ev) {
        var key = ev.which;
        if (key === 13) {
          btn_search_forms.trigger("click");
          return false;
        }
      });
    
      forms_search.on("click", btn_search_forms, function(ev) {
        ev.preventDefault();
    
        var archive = !!chk_show_archived.is(":checked");
    
        alert("You click me");
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="row">
      <div class="col-md-12">
        <div class="panel panel-default">
          <div class="panel-heading">
            <h3 class="panel-title">Search form</h3>
          </div>
          <div class="panel-body">
            <form class="form-inline" id="forms_search">
              <div class="form-group col-md-5">
                <input type="text" name="search_form_by_name" id="search_form_by_name" class="form-control input-full-width">
              </div>
              <div class="checkbox">
                <label>
                      <input type="checkbox" id="show_archived" name="show_archived" value="1"> Show archived?
                    </label>
              </div>
              <button type="button" class="btn btn-default" id="btn_search_forms">
                    <i class="fa fa-search" aria-hidden="true"></i> Search
                  </button>
              <button type="button" class="btn btn-default" id="btn_new_form">
                    <i class="fa fa-plus-circle" aria-hidden="true"></i> New Form
                  </button>
            </form>
          </div>
        </div>
      </div>
    </div>

    为什么单击 input#search_form_by_name ? 我错过了什么?我希望单击按钮会触发事件,但不会触发输入上的click事件。这是 jsFiddle

    3 回复  |  直到 8 年前
        1
  •  6
  •   charlietfl    8 年前

    的委托目标 on() 需要是选择器字符串,而不是jQuery对象

    改变

    forms_search.on("click", btn_search_forms, function(ev) {
    

    forms_search.on("click", '#btn_search_forms', function(ev) {
    
        2
  •  1
  •   Aniko Litvanyi    8 年前

    由于您已经为元素创建了单独的变量,因此可以通过以下方式调用()

    btn_search_forms.on('click', function(ev){...})
    

    或者如上所述,将第二个参数更改为字符串

    forms_search.on('click', '#btn_search_forms', function(ev) {...})
    
        3
  •  0
  •   cauchy    8 年前

    $(function() {
      "use strict";
    
      var manage_form_listing_grid = $("#manage_form_listing"),
        forms_search = $("#forms_search"),
        btn_search_forms = $("#btn_search_forms"),
        chk_show_archived = $("#show_archived"),
        inp_search_form_by_name = $("#search_form_by_name");
        var new_form = $("#btn_new_form");
      forms_search.keypress(function(ev) {
      debugger
        var key = ev.which;
        if (key === 13) {
          btn_search_forms.trigger("click");
          return false;
        }
      });
    
      forms_search.on("click", btn_search_forms, function(ev) {
      console.log(btn_search_forms);
    console.log("#btn_search_forms");
        ev.preventDefault();
    
        var archive = !!chk_show_archived.is(":checked");
    
        alert("You click me");
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="row">
      <div class="col-md-12">
        <div class="panel panel-default">
          <div class="panel-heading">
            <h3 class="panel-title">Search form</h3>
          </div>
          <div class="panel-body">
            <form class="form-inline" id="forms_search">
              <div class="form-group col-md-5">
                <input type="text" name="search_form_by_name" id="search_form_by_name" class="form-control input-full-width">
              </div>
              <div class="checkbox">
                <label>
                      <input type="checkbox" id="show_archived" name="show_archived" value="1"> Show archived?
                    </label>
              </div>
              <button type="button" class="btn btn-default" id="btn_search_forms">
                    <i class="fa fa-search" aria-hidden="true"></i> Search
                  </button>
              <button type="button" class="btn btn-default" id="btn_new_form">
                    <i class="fa fa-plus-circle" aria-hidden="true"></i> New Form
                  </button>
            </form>
          </div>
        </div>
      </div>
    </div>

    问题是 .on( events [, selector ] [, data ], handler ) 问题是选择器这里是一个字符串,用于筛选触发事件的选定元素的后代。如果选择器为null或省略,则事件始终在到达选定元素时触发。

    因此,在您的情况下,所选元素是完整的forms\u search。所以,单击“附加”以完成匹配选择器,但它没有完成任何操作。

    我添加了控制台来检查单击事件触发器时btn\u search\u表单的值。看看有什么不同。您正在传递对象,但它需要字符串。