【问题标题】:Javascript event when prefilled option is selected选择预填充选项时的 Javascript 事件
【发布时间】:2016-12-09 03:33:53
【问题描述】:

我有一个充满选择元素的表格,其中一些预先填充了我正在处理的数据迁移项目的建议。我知道如何监听更改事件(jQuery),但我也想监听用户何时选择建议的选项。那可能吗?

我尝试监听点击,但只有在打开选择框时才会调用它,而不是在关闭时调用。

更新

问题的简单再现 -

HTML -

<select>
  <option value="">One</option>
  <option value="" selected>Two</option>
  <option value="">Three</option>
</select>

<p></p>

JS

$('select').change(function() {
    $('p').append('x');
});

https://jsfiddle.net/sh9n2cvg/

更新 2

目前为止我发现的最好的是这个,但它仍然有点问题 -

$('select').click(function() {
    $(this).val("");
    $(this).trigger('change');
});

更新 3 我不认为我正在尝试做的事情是可能的。这是我的解决方法 - https://stackoverflow.com/a/5859221/772309

【问题讨论】:

  • 我不确定检测是否有用。用户没有选择显示的值,它已经被选中。打开和关闭选择元素而不选择其他内容不会改变任何内容。
  • 如果您提供一些示例代码,我们可能有足够的上下文来提供更多帮助。
  • @gyre 我用一种简单的方法更新了问题来重现问题
  • 由于第二个optionselected 属性设置为html 而加载document 时,您是否期望change 事件被调度到select 元素?

标签: javascript jquery


【解决方案1】:

你可以做这样的事情。

如果您需要始终在默认选择的选项上执行某些操作,则需要识别默认选项,因此,无论何时选择该选项,您都可以触发附加 x。

// I want it to output "x" when "Two" is reselected
$(function() {
  $('select').change(function(e) {
    if ($("option:selected", $(e.currentTarget)).attr("data-default")) {
      $('p').append('x');
    }
  });

  $('select').each(function(idx, ele) {
    $("option:selected", $(ele)).attr("data-default", "true")
  });

  $('select').change();



});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
  <option value="">One</option>
  <option value="" selected>Two</option>
  <option value="">Three</option>
</select>

<p></p>

如果您希望将 x 附加到 p 以用于所有更改事件和初始默认选择,您可以这样做。

// I want it to output "x" when "Two" is reselected
$(function() {
  $('select').change(function(e) {
    $('p').append('x');
  });

  $('select').change();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select>
  <option value="">One</option>
  <option value="" selected>Two</option>
  <option value="">Three</option>
</select>

<p></p>

【讨论】:

  • 当你选择一个已经被选中的选项时,OP 想要得到的主要是触发。
【解决方案2】:

您可以将&lt;ul&gt;&lt;li&gt; 元素替换为&lt;select&gt;&lt;option&gt; 元素;样式ulli元素显示为selectoption菜单,使用click事件选择li元素

$(function() {

  var p = $("#select + p");
  
  var options = ["One", "Two", "Three"];
  
  $.each(options, function(index, option) {
    $("<li>", {    
      html: "\n" + option,
      appendTo:"#select",
      css: {
        listStyle: "none",
        width: "142px",
        padding: "8px",
        margin: "1px",
        outline: "1px solid #000",
        fontFamily: "arial",
        height:"16px",
        backgroundColor:"#eee"
      },
      on: {
        "mouseenter": function() {
          if (!$(this).is("li:first")) {
            $(this).css("backgroundColor", "orange")
          }
        },
        "mouseleave": function() {
          $(this).css("backgroundColor", "#eee")
        }
      }
    })
  });

  $("#select li:not(:first)")
    .hide()
    .siblings(":first")
    .clone(true)
    .hide()
    .insertAfter("#select li:first")
    .parent()
    .click(function(e) {
      if ($(e.target).is("li:first")) {
        $(e.target).closest("li").siblings().toggle()
      } else {
        $(e.target).closest("ul")
        .find(":first")
        .html($(e.target).closest("li").html())
        .trigger("mouseleave")
        .siblings().toggle();
        p.append("x" + $("li:first").text() + "<br>")
      }
    })
});
ul {
  appearance: button;
  -moz-appearance: button;
  -webkit-appearance: button;
  -webkit-padding-start: 0px;
  width: 160px;
  height: 32px;
  left: 24px;
  position: relative;
}
ul li:nth-child(1) {
  background-color:buttonface !important;
}
ul li:nth-child(1):after {
  position: absolute;
  content: "▼";
  right: 10px;
  top: 10px;
  font-size: 12px;
  opacity: .75;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<ul id="select" class="select"></ul>
<p></p>

【讨论】:

  • 在 Firefox 中表现不佳。
  • @Ouroborus 你指的是ul父元素和li元素的样式吗?
  • 注意,要选择 li,在 .ready() 上显示文本 "Two",请致电 $("#select li:contains(Two)").trigger("click");$("#select li:not(:first)").toggle()。正如@Ouroborus 所指出的,ulli 元素的样式仍需要针对 Firefox 进行进一步调整。
  • @guest271314 希望保留默认浏览器元素,但感谢这确实有效!
  • @guest271314 选择视图(第一个li)周围有一个边界(ul)。它在左侧包括一个更大的“边框”。单击ul(沿该边界或间隙的任何位置)会导致添加一条消息(打开和关闭)。
【解决方案3】:

我不确定默认选择元素是否可行。如果您不介意使用模拟选择元素,您可以执行this 之类的操作:

var was = $('select').val();
$('select')
  .selectmenu()
  .on('selectmenuclose',function(event){
    var is = $('select').val();
    if(was == is) {
      $('p').append("<br>reselected "+is);
    }
    else {
      $('p').append("<br>changed to "+is);
    }
    was = is;
  });
<link href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet"/>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>

<select>
  <option value="one">One</option>
  <option value="two" selected>Two</option>
  <option value="three">Three</option>
</select>

<p></p>

如果您只是想让触发器仅在选择选项时发生(而不是在模糊等情况下),这将起到作用:

var was = $('select').val();
$('select')
  .selectmenu()
  .on('selectmenuselect',function(event, ui){
    var is = ui.item.value;
    if(was == is) {
      $('p').append("<br>reselected "+is);
    }
    else {
      $('p').append("<br>changed to "+is);
    }
    was = is;
  });
<link href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" rel="stylesheet"/>
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>

<select>
  <option value="one">One</option>
  <option value="two" selected>Two</option>
  <option value="three">Three</option>
</select>

<p></p>

【讨论】:

  • 在选项时自动附加元素,即使焦点从下拉列表中移除并且body 获得焦点。
  • @guest271314 好的。有问题吗?
  • 作为这里的解释要求,只有在选择选项时才应附加元素。
  • @guest271314 很好。这是一个微不足道的调整。已更新。
  • 当点击选择的选项,然后点击body,然后点击并从下拉列表中选择选择的选项,文本被附加到p两次。
【解决方案4】:

使用 jQuery 更改事件,您可以通过使用 $('yourselect').val() 来查看用户的选择选项是否与系统想到的建议选项相匹配,以查看选择选项选择的值是什么.

$('yourselect').on('change', function() {
    var selected = $(this).val();
    if(selected === 'Expected') {
        // do this
    }
});

【讨论】:

  • 只有在我选择预选选项以外的选项时才会触发更改事件。
  • 那么在页面加载时写一个 if 语句来检查预选的选项是否等于建议的选项。
  • 根据用户的操作,它必须在页面加载之后。
【解决方案5】:

您可以使用原生 DOM API 作为 jQuery 的替代方案,非常轻松地测试 select 的值。这种方法确实需要您将每个optionvalue 设置为某个唯一的字符串;下面我只是使用了你所拥有的任何内容作为显示文本。

document.getElementById('example-select').addEventListener('change', function () {
    console.log(this.value)
    
    if (this.value === 'Two') {
        // do stuff
        document.getElementById('example-output').textContent += 'x'
    }
});
<select id="example-select">
  <option value="One">One</option>
  <option value="Two" selected>Two</option>
  <option value="Three">Three</option>
</select>

<p id="example-output"></p>

【讨论】:

  • 还是打不开select,选择“二”关闭select并触发事件。
  • 我想我有个主意;让我调整一下答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
相关资源
最近更新 更多