【问题标题】:Fire event each time a DropDownList item is selected with jQuery每次使用 jQuery 选择 DropDownList 项目时触发事件
【发布时间】:2010-10-28 06:16:09
【问题描述】:

我有一个下拉菜单:<asp:DropDownList id="dropdownid" runat="server" class=blah"/>

在我的 jQuery 中,我像这样分配更改事件:

$('#dropdownid').change(function() {......});

现在,当我从下拉列表中选择不同的值时,这可以工作,但是假设我想再次选择相同的值。 (因为我想用相同的值打另一个电话) 因此,当我再次选择它(不更改值)时,只需单击下拉列表中的选定值并再次“选择”它,就不会触发任何事件。 我必须分配给它的 jquery 中是否还有另一个事件?有什么解决办法?

【问题讨论】:

    标签: jquery html-select


    【解决方案1】:

    根据API

    当控件发生变化时触发 失去输入焦点及其值 获得焦点后已被修改。

    您可能想尝试 mousedown 或 click 事件作为替代。

    【讨论】:

    • 但请记住,下拉菜单也可以通过键盘控制
    • 当使用键盘更改值时触发“change”事件。
    【解决方案2】:

    您遇到的这个问题是由于客户端对基本选择 HTML 的处理。由于大多数客户不会标记未更改,因此您将不得不尝试不同的东西。

    我可能会添加一个“刷新”按钮或类似的东西,但我是开发人员而不是设计师,所以我可能错了。 :)

    【讨论】:

      【解决方案3】:

      试试这个:

      $(document).ready(function(){
       var clicknum = 0;
       $("#dropdownid").click(function(){
          clicknum++;
          if(clicknum == 2){
              alert($(this).val());
              clicknum = 0;
          }
       });
      });
      

      首先,您要创建一个变量 clicknum 来跟踪点击次数,因为您不希望每次用户点击下拉框时都会触发该事件。第二次点击是用户做出的选择。

      如果 click num 恰好为 2,则这是第二次点击,因此触发事件并将 clicknum 重置为 0 以供下次使用。否则什么都不做。

      【讨论】:

      • 那是相当的汗水。由于没有原生方式来处理这个问题,我认为这是一个不错的选择。
      • 我在回答中对您的示例进行了一些扩展,本质上是创建一个新的 jQuery 函数来处理新的“选定”事件...
      • 没有找到比这更好的解决方案。你救了我的一天!谢谢!
      【解决方案4】:

      要扩展 Vincent Ramdhanie's 建议,看看做这样的事情。本质上,您最终得到了您自己的 jQuery 函数,您可以在其他地方重复使用。

      第 1 步:创建 jQuery 函数

      (function($) {
          $.fn.selected = function(fn) {
              return this.each(function() {
                  var clicknum = 0;
                  $(this).click(function() {
                      clicknum++;
                      if (clicknum == 2) {
                          clicknum = 0;
                          fn(this);
                      }
                  });
              });
          }
      })(jQuery);
      

      第二步:确保新创建的jQuery函数的文件被引用使用:

      <script src="Scripts/jqDropDown.js" type="text/javascript"></script>
      

      第 3 步:利用新功能:

      $('#MyDropDown').selected(function() {
          //Do Whatever...
      });
      

      原始信息
      使用您当前的代码库,从 asp:DropDownList 中选择相同的值不会触发更改事件。

      您可以尝试为 .blur 事件添加另一个 jQuery 函数。这会在控件失去焦点时触发:

      $('#dropdownid').blur(function() {......});
      

      如果它们的模糊功能对您不起作用,我会添加一个刷新按钮或其他可以触发您尝试使用的功能的效果。

      【讨论】:

      • 我实际上一直在尝试解决类似的问题一段时间,而您的代码示例点燃了灯泡......
      • 我有一个非常相似的想法,但是当你有多个下拉列表时我遇到了问题。假设您单击一个下拉列表,如果您随后从展开的下拉列表中单击另一个下拉列表,则计数设置为 2,但现在未选择一个选项,导致定位错误。一种解决方法可能是通过仅允许此函数在当前范围内工作来隔离下拉列表。
      • 如果您使用键盘进行选择,则会中断。
      • 除了 Kyle 指出的问题之外,这不适用于 Android 上的 Chrome 上的 Chrome 或 Linux 上的 Epiphany;点击下拉选项不会触发click 事件..
      • 这个问题在将近 6 年前就已经得到了回答……当时有效的方法很可能在今天不再有效,所以编辑吧!
      【解决方案5】:

      下拉列表中的选定项目反映了已经做出的选择。

      我的建议是每次完成所需的操作时,将下拉菜单重置为默认值,例如“选择...”。因此,如果用户需要执行两次操作 A,则下拉菜单会在每次操作后重置。

      1. 用户从下拉列表中选择操作 A。
      2. 执行操作 A 并重置下拉菜单。
      3. 用户从下拉列表中选择操作 A。
      4. 执行操作 A 并重置下拉菜单。

      希望这会有所帮助,

      丰富

      【讨论】:

        【解决方案6】:

        只需将单击事件处理程序连接到封闭的选项控件而不是选择:

        $('#dropdownid option').click(function() {......});
        

        这只会在您从下拉列表中选择一个选项时触发,无论它是否更改。

        【讨论】:

        • 每次单击控件时不会触发 .click 函数。那么显示项目是 1,选择是 2?
        • 它仅在您单击列表中的选项时触发,这是 OP 想要的。展开列表不会触发处理程序,即使您单击框而不是箭头来执行此操作。
        • 有趣...错过了带有选项的选择器。太酷了。
        • @AdamLassek:有趣!这不适用于 Linux 上的 Chrome。但是,适用于 Chrome/Windows。但确实适用于 Firefox/Linux。我使用相同版本的 JQuery 进行了测试。有什么线索吗?
        • 大多数浏览器不会触发events on the option element
        【解决方案7】:

        查看此解决方案:
        http://ledomoon.blogspot.com/2009/12/dropdown-selected-change-event-by.html

        $(document).ready(function () {
            // select all the divs and make it invisible
            $("div.Content").css("display", "none");
            // Find all the combos inside the table or gridview
            $("#tblItems").find("select.Status").each(function () {
                // Attached function to the change event of each combo
                $(this).change(function () {
                    if ($(this).val() == "test1") {
                        // Change the visibility of the next div after the selected combo if the selected value = test1
                        $(this).parent().find("div.Content").fadeIn("slow"); //css("display","block");
                    } else {
                        $(this).parent().find("div.Content").fadeOut("slow"); //.css("display","none");
                    }
                });
            });
        });
        

        希望对你有帮助

        【讨论】:

          【解决方案8】:

          对我来说,以下解决方案效果很好:

          $("#dropdownid select").click(function() {
            alert($("#dropdownid select option:selected").html());
          });
          

          【讨论】:

          【解决方案9】:

          还有:

          $('#dropdownid select option').click(function() {
             ....
          }
          

          【讨论】:

          【解决方案10】:

          很多当前的解决方案会在很多情况下失效。任何依赖于两次检查点击计数的解决方案都将是非常善变的。

          需要考虑的一些场景:

          • 如果您点击,然后关闭,然后再打开,它将同时计算点击次数和触发次数。
          • 在 Firefox 中,您只需单击鼠标即可打开菜单并拖动到所选选项,而无需抬起鼠标。
          • 如果您使用键盘敲击的任意组合,您可能会导致点击计数器不同步或完全错过更改事件。
            • 您可以使用 Alt+(或 Chrome 和 Opera 中的 空格键)打开下拉菜单。
            • 当下拉菜单有焦点时,任何箭头键都会改变选择
            • 当下拉菜单打开时,单击 TabEnter 将进行选择

          这是一个更全面的扩展:

          查看某个选项是否被选中的最可靠的方法是使用change 事件,您可以使用jQuery 的.change() 处理程序来处理该事件。

          唯一剩下要做的就是确定是否再次选择了原始元素。
          在任何情况下都没有很好的答案。

          最简单的做法是检查option:selected 元素上是否有clickkeyup 事件Chrome, IE, and safari don't seem to support events on option elements,即使它们在w3c recommendation

          Select 元素内部似乎是一个黑盒子。如果您在其上收听事件,您甚至无法判断事件发生在哪个元素上或列表是否打开。

          接下来最好的事情似乎是处理blur 事件。这将表明用户已将注意力集中在下拉列表上(也许看到了列表,也许没有)并做出了他们想要坚持原始值的决定。要立即继续处理更改,我们仍将订阅 change 事件。并且为了确保我们不会重复计算,如果更改事件被引发,我们将设置一个标志,这样我们就不会回击两次:

          代码:

          (function ($) {
              $.fn.selected = function (fn) {
                  return this.each(function () {
                      $(this).focus(function () {
                          this.dataChanged = false;
                      }).change(function () {
                          this.dataChanged = true;
                          fn(this);
                      }).blur(function (e) {
                          if (!this.dataChanged) {
                              fn(this);
                          }
                      });
                  });
              };
          })(jQuery);
          

          然后这样调用:

          $("#dropdownid").selected(function (e) {
              alert('You selected ' + $(e).val());
          });
          

          Updated example in jsFiddle

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-02
            • 1970-01-01
            • 2021-06-27
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多