【问题标题】:Jquery on change event is not firing when selecting the same drop down option选择相同的下拉选项时,Jquery on change 事件未触发
【发布时间】:2018-12-05 05:47:37
【问题描述】:

嗨,我有一个这样的下拉菜单,我有一个 textarea 字段。我希望在使用下拉列表中的选项时,下拉选择的值将附加在文本区域字段中,并且我已经为下拉列表使用了更改事件,但问题是当我再次选择相同的值时,更改事件是不开火。我已经搜索过,很多人建议使用下拉菜单的点击事件,但是当我使用点击事件时,我选择的测试会出现两次,但我只希望出现下拉菜单的选定文本。我的 JS 代码就像这个。

<select class="form-control" id="drpLinkType">
    <option value="2" selected="selected">Post</option>
    <option value="2">Pre</option>
    <option value="2">Test</option>
</select>

$('#drpLinkType').click(function () {
    debugger;

    var $txt = $("#txt");
    var caretPos = $txt[0].selectionStart;
    var textAreaTxt = $txt.val();
    var txtToAdd = $('#drpLinkType :selected').text();
    $txt.val(textAreaTxt.substring(0, caretPos) + txtToAdd + textAreaTxt.substring(caretPos));

})

jsfiddle.net/w0c9o7ox 创建 js 小提琴。在这里您可以看到,如果我单击相同的选项,则它不起作用

【问题讨论】:

标签: javascript jquery


【解决方案1】:

change 事件的最后一行使用this.value = ""$(this).val("")&lt;select&gt;.value 设置为空字符串"",否则如果连续选择相同的&lt;option&gt;,则.value 没有改变了。

您还可以包含&lt;label&gt; 元素,并将for 属性设置为&lt;select&gt; .id 值以设置选定.textContent 的当前.textContent

$('#drpLinkType').on('change', function () {
        //debugger;
        var $txt = $("#txt");
        var caretPos = $txt[0].selectionStart;
        var textAreaTxt = $txt.val();
        var txtToAdd = $('#drpLinkType :selected').text();
        $txt.val(textAreaTxt.substring(0, caretPos) + txtToAdd + textAreaTxt.substring(caretPos));
        this.labels[0].innerHTML = this.selectedOptions[0].textContent;
        $('#drpLinkType').val("");
    })
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select class="form-control" id="drpLinkType">
        <option value="0">Please select a option</option>
        <option value="2">Post</option>
        <option value="2">Pre</option>
        <option value="2">Test</option>
    </select><label for="drpLinkType"></label>
    <textarea id="txt" rows="15" cols="70" placeholder="Enter text ..." ></textarea>

【讨论】:

  • 但如果我这样做了,那么用户将无法看到他们选择了哪个下拉选项
  • 我只是想知道你能做些什么才能进入罚球区。
【解决方案2】:

使用点击甚至代替。像这样(为了清楚起见,我将文本的附加部分移到了一个单独的函数中):

$('#drpLinkType').on('click', function (event) {
  var text = $('#drpLinkType :selected').text();
  appendText(text);
});

function appendText(text) {
  var $txt = $('#txt');
  var caretPos = $txt[0].selectionStart;
  var textAreaTxt = $txt.val();
  $txt.val(textAreaTxt.substring(0, caretPos) + text + textAreaTxt.substring(caretPos));
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
 <select class="form-control" id="drpLinkType">
        <option value="0">Please select a option</option>
        <option value="2" >Post</option>
        <option value="2">Pre</option>
        <option value="2">Test</option>
    </select>
    <textarea id="txt" rows="15" cols="70" placeholder="Enter text ..." ></textarea>

但是,如果您可以控制 HTML,这将是最佳选择:

$('#drpLinkType').on('click', function (event) {
  appendText(event.target.value);
});

function appendText(text) {
  var $txt = $('#txt');
  var caretPos = $txt[0].selectionStart;
  var textAreaTxt = $txt.val();
  $txt.val(textAreaTxt.substring(0, caretPos) + text + textAreaTxt.substring(caretPos));
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select class="form-control" id="drpLinkType">
        <option value="">Please select a option</option>
        <option value="Post" >Post</option>
        <option value="Pre">Pre</option>
        <option value="Test">Test</option>
    </select>
  <textarea id="txt" rows="15" cols="70" placeholder="Enter text ..." ></textarea>

【讨论】:

  • 是的,单击一个问题就可以解决,但是如果您运行代码并进行测试,您会看到所选文本添加了两次。
  • @Utpal 我想我不明白。所以目标是选择两次相同的选项,而不是再次附加相同的文本,而是触发更改事件?
  • 是的,你可以这么说
  • 还有什么建议
  • @Utpal 当然可以,我先问你,你能控制 HTML 吗?
猜你喜欢
  • 2017-05-28
  • 1970-01-01
  • 2018-03-05
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
相关资源
最近更新 更多