【问题标题】:jquery select option click handlerjquery 选择选项单击处理程序
【发布时间】:2011-08-10 14:42:33
【问题描述】:

给定:

<select id="mySelect">
  <option>..</option>
  ...
</select>

使用选择 ID,我如何触发其中一个选项的点击事件?我尝试将事件直接附加到选择,但是只要单击选择(即使没有选项),这都会触发一个事件。哦,它是一个多选(虽然我不认为这很重要)。

【问题讨论】:

标签: javascript jquery html


【解决方案1】:
    <select name="data" id = 'cohort' class="form-control" style = "width:215px; margin-left:20px; margin-bottom:8px ; height:30px" >
    <option value = 0>All</option>
    <option value = 1>Diseases</option>
    <option value = 2>Drugs</option>
    <option value = 3>Procedures</option>
    </select>
const element = document.getElementById("cohort");
const event = new MouseEvent("mousedown");
element.dispatchEvent(event);

【讨论】:

    【解决方案2】:

    你也可以试试这个来获取之前的选择值和点击的值。

    HTML

    <select name="status">
        <option value="confirmed">confirmed</option>
        <option value="packed">packed</option>
        <option value="shiped">shiped</option>
        <option value="delivered">delivered</option>
    </select>
    

    脚本

    
        var previous;
    
        $("select[name=status]").focus(function () {
            previous = this.value;
        }).change(function() {
            var next = $(this).val()
            
            alert("previous: "+previous+ " and Next: "+ next)
            
            previous = this.value;
        });
    
    
    

    【讨论】:

      【解决方案3】:

      它对我有用

      <select name="" id="select">
          <option value="1"></option>
          <option value="2"></option>
          <option value="3"></option>
      </select>
      
      <script>
          $("#select > option").on("click", function () {
             alert(1)
          })
      </script>
      

      【讨论】:

      • 请考虑在答案中添加解释,以便其他人理解逻辑
      【解决方案4】:

      change 处理程序的问题在于,它在我向上和向下滚动 &lt;select&gt; 的每次按键时触发。

      我想在单击选项或在所需选项上按下enter 时获取事件。这就是我最终这样做的方式:

      let blockChange = false;
      
      $element.keydown(function (e) {
      
          const keycode = (e.keyCode ? e.keyCode : e.which);
      
          // prevents select opening when enter is pressed
          if (keycode === 13) {
              e.preventDefault();
          }
      
          // lets the change event know that these keypresses are to be ignored
          if([38, 40].indexOf(keycode) > -1){
              blockChange = true;
          }
      
      });
      
      $element.keyup(function(e) {
      
          const keycode = (e.keyCode ? e.keyCode : e.which);
          // handle enter press
          if(keycode === 13) {
              doSomething();
          }
      
      });
      
      $element.change(function(e) {
      
          // this effective handles the click only as preventDefault was used on enter
          if(!blockChange) {
              doSomething();
          }
          blockChange = false;
      
      });
      

      【讨论】:

        【解决方案5】:

        在这种情况下我所做的是我将选项元素的 OnClick 事件放入如下:

        <option onClick="something();">Option Name</option>
        

        然后像这样创建一个脚本函数:

        function something(){
            alert("Hello"); 
            }
        

        更新: 不幸的是,我无法发表评论,所以我在这里更新
        TrueBlueAussie 显然 jsfiddle 有一些问题,请在此处检查它是否有效或不是:http://js.do/code/klm

        【讨论】:

        • 当前不适用于 Chrome,因此应避免使用:jsfiddle.net/TrueBlueAussie/jd3bamtr/1
        • ps 您的代码缺少 javascript 代码,所以....下次至少确保您已针对某人的建议实施了所有操作,并通过“Chromes”调试器检查它是否无法正常工作以及为什么!!在警告之前其他用户!!它不工作和downvoting ;)
        • 该测试所需的唯一 Javascript 是内联。如果您真的费心将&lt;option&gt; 放入&lt;select&gt; 中,以使其成为有效的HTML,您将在Chrome 上看到您的代码不起作用jsfiddle.net/TrueBlueAussie/j6fkLjc8 否决票是正确的。 在 Chrome 修复该问题之前不应使用此代码:P
        【解决方案6】:

        $('#mySelect').on('change', function() {
          var value = $(this).val();
          alert(value);
        });
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.0/jquery.min.js"></script>
        <select id="mySelect">
          <option value='1'>1</option>
          <option value='2'>2</option>
          <option value='3'>3</option>
          <option value='4'>4</option>
          <option value='5'>5</option>
          <option value='6'>6</option>
          <option value='7'>7</option>
          <option value='8'>8</option>
        </select>

        EXAMPLE

        【讨论】:

        • var value = this.value 也适用于此。无需包装在 jquery 选择器中
        【解决方案7】:

        一种可能的解决方案是为每个选项添加一个类

        <select name="export_type" id="export_type">
            <option class="export_option" value="pdf">PDF</option>
            <option class="export_option" value="xlsx">Excel</option>
            <option class="export_option" value="docx">DocX</option>
        </select>
        

        然后使用这个类的点击处理程序

        $(document).ready(function () {
        
            $(".export_option").click(function (e) {
                //alert('click');
            });
        
        });
        

        更新:看起来代码在 FF、IE 和 Opera 中有效,但在 Chrome 中无效。 查看规格 http://www.w3.org/TR/html401/interact/forms.html#h-17.6 我会说这是 Chrome 中的错误。

        【讨论】:

        • @TrueBlueAussie 刚刚在 FF 和 IE 中测试了你的小提琴,它按预期工作
        • @TrueBlueAussie 甚至在旧的优秀 Opera 12 中也能正常工作!
        • @TrueBlueAussie 我明白了,你只在 chrome 中测试过它,我在除 chrome 之外的其他地方测试过它。否则你应该写“它在 crome 中不起作用”而不是“点击事件被下拉菜单吃掉”,这显然是不正确的。查看我的更新
        • 这是不切实际的。如果它在最流行的浏览器之一中不起作用,那么它不是一个实用的解决方案。在所有浏览器中测试您的答案不是我的责任。那将是你的:)
        • 删除了先前的模棱两可的评论。只是为了澄清一下迂腐:此解决方案不适用于 Chrome截至撰写本文时jsfiddle.net/TrueBlueAussie/jd3bamtr
        【解决方案8】:

        你可以附加一个焦点事件来选择

        $('#select_id').focus(function() {
            console.log('Handler for .focus() called.');
        });
        

        【讨论】:

          【解决方案9】:

          您想要“更改”事件处理程序,而不是“点击”。

          $('#mySelect').change(function(){ 
              var value = $(this).val();
          });
          

          【讨论】:

          • 如果他们选择相同的选项怎么办?未触发更改事件
          • @haz0rd 你将只能通过点击事件检测到,当你第一次点击选择时你会得到 2. 1,当你选择已经选择的选项时会得到 1
          • 请注意,click 事件当前在 Chrome 中根本不会为 &lt;option&gt; 元素生成。
          • @GoneCoding 有什么办法可以解决 click 在 Chrome 中不触发的问题吗?
          • 这不是他要求的或他“想要的”。他要求点击其中一个选项触发事件。您的答案是当点击默认或相同选项时不会触发的解决方法
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-05
          • 1970-01-01
          • 1970-01-01
          • 2011-11-01
          • 1970-01-01
          • 1970-01-01
          • 2015-05-26
          相关资源
          最近更新 更多