【问题标题】:Trigger change on dynamic and dependent select option触发动态和相关选择选项的更改
【发布时间】:2020-05-02 16:06:39
【问题描述】:

我有两个选择选项独立cats 和依赖subcats。通过显示表格的详细信息行,我想从表格的当前行中获取选定的值。 它选择了cat 选项,但没有选择依赖于catsubcat。 我在我的真实代码中使用 ajax 来显示表格行详细信息并获取选择选项数据。

更新

现在它在演示中工作,将option value='" +value.category+ 中的category 替换为@msg 建议的value.subcategory。但是问题仍然存在,并且它仍然无法在我的真实代码中工作,因为我正在使用 ajax 并获取选择选项数据并触发 ajax 成功函数中的更改。 jsfiddle 中的 ajax 示例。

这是演示

var data = [
{"id":1,"category":"Mechanism","subcategory":"Allergic reaction"},
{"id":2,"category":"Mechanism","subcategory":"Bloodborne"},
{"id":3,"category":"Mechanism","subcategory":"Bugbite"},
{"id":4,"category":"Mechanism","subcategory":"Chemical"},
{"id":5,"category":"Mechanism","subcategory":"Electrical"},
{"id":6,"category":"Object","subcategory":"Sara lift"},
{"id":7,"category":"Object","subcategory":"Shower"},
{"id":8,"category":"Object","subcategory":"Table"},
{"id":9,"category":"Object","subcategory":"Wheelchair"}
];

$("#incimechtype").change(function(){
    var dropdown = $(this).val();
 		$("#incimech").find("option").remove();
     $.each(data, function(key, value){
      if(value.category == dropdown)
      	$('#incimech').append("<option value='" +value.subcategory+ "'  data-subcat='" +value.id+ "'>" +value.subcategory+ "</option>");
});
        changeOptions();
});

function changeOptions() {
  var selectedOption = $('#incimech').find('option:selected');
  $('#ids').val(selectedOption[0].dataset.subcat);
}

$(".show").click(function(){
	$(hide).show();
  var cat = $(this).closest('tr').find('.cats').text();
  var subcat = $(this).closest('tr').find('.subcats').text();
  $("#incimechtype").val(cat).trigger('change');
  $("#incimech").val(subcat);
});
#hide {
  display: none;
  padding: 50px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table border="1">
  <tr>
    <td class="cats">Mechanism</td>
    <td class="subcats">Chemical</td>
    <td><button class="show"> show detail </button></td>
  </tr>
  <tr>
    <td class="cats">Object</td>
    <td class="subcats">Table</td>
    <td><button class="show"> show detail </button></td>
  </tr>
</table>


<div id="hide">
<label for="incimechtype">Mechanism Type</label>
<select name="incimechtype" id="incimechtype">
   <option value="Mechanism">Mechanism</option>
   <option value="Object">Object</option>
</select> 
<br>
<br>
<label for="incimech">Mechanism</label>
<select id="incimech" onChange="changeOptions()">
</select> 
<br>
<br>
<input type="number" id="ids">
</div>

【问题讨论】:

  • 你的子类别选项都一样value:option value='" +value.category+我猜你想要value.subcategory
  • @msg 感谢它现在在 jsfiddle 中工作,但实际上在我的真实代码中,我使用 ajax 来获取 subcategory 的值,这就是为什么它仍然无法在我的最后工作。跨度>
  • 也许您正在尝试在完全加载之前选择元素?抱歉,我不知道发生了什么或看到代码无法提供帮助。
  • @msg 你可以看到我在这个jsfiddle 中使用的ajax 函数。我在成功函数中获得了选定的选项。
  • 很难理解你的问题,什么代码来自你的“真实”代码,什么是伪造的?在您的 JSFiddle 中,mid 是什么,它来自哪里?我尝试将 mid 模拟为您的 data 数组中的 ID 之一,但随后我收到有关 changeOptions() 中引用的 dataset 的错误,但该错误不存在。您的代码也显示data-subcat,但它没有在任何地方使用......请尝试创建一个minimal, complete, and verifiable example,如果我们甚至无法理解这个问题,没有人可以提供帮助。

标签: javascript jquery


【解决方案1】:

最后,有了更接近你真实代码的东西,就有可能理解你的问题。

出现问题是因为机制选择是通过第二个 AJAX 调用填充的,该调用是从第一个 AJAX 调用的成功回调中触发的。但因为 AJAX 是异步,它不会立即完成,但不会阻止执行。在 AJAX 调用之后出现的任何代码都将在 AJAX 完成之前运行。

用伪代码解释,.show AJAX 成功回调如下所示:

success: function(response) {
    // 1. Set selected mechanism type
    // 2. AJAX call to populate mechanism dropdown
    // 3. Set selected mechanism option - Whoops!  2 has not
    // finished yet!  3 runs before 2 has finished!  Whatever 
    // changes you do to the mechanism options here will be
    // overwritten and lost when 2 updates them!
}

为避免这种情况,您必须移动必须在机制选项已重新填充到那个 AJAX 调用的成功回调中的任何必须运行的东西。

// .show AJAX
success: function(response) {
    // 1. Set selected mechanism type
    // 2. AJAX call to populate mechanism dropdown
}

// mechanism populate AJAX
success: function(response) {
    // 1. populate mechanism dropdown
    // 2. set selected mechanism
    // 3. copy selected id to input field.
}

Updated, working JSFiddle.

请注意,由于您提供了多次代码迭代,而我已依次更新了每一次,因此您的原始代码有很多更改。它们都在 JSFiddle 中进行了描述。

【讨论】:

  • 我仍然面临这个问题。它将正确的数据提取到subcategory 选项列表,但没有选择正确的数据,例如Chemical。也许我试图在触发器更改完全加载之前选择元素。我试过这个$('#incimechtype').trigger('change'); 放在ajax 函数之前。这也不起作用。
  • 如果没有看到您的 真实 代码以及 AJAX 响应的示例,我想我无法提供更多帮助。正如我之前建议的,请尝试创建一个minimal, complete, and verifiable example
  • 我的代码看起来类似于我提供的 jsfiddle。而且我的 AJAX 响应也在开发人员工具网络选项卡中提供了正确的输出。当我尝试在文本框中显示子类别而不是选择元素时,它也会给出正确的输出。我认为主要问题是触发更改的正确位置。在相同的成功功能中,当我尝试选择它时它没有完全加载。并显示从列表中选择的第一个 subcategory
  • @Eniol 您的 JSFiddle 中的 data 数组是否真的在您的代码中,或者只是为了显示您的 AJAX 响应的样子?我更新了我的 JSFiddle,它可以工作,但我仍然不确定我是否理解问题。
  • 对不起,我在 jsfiddle 中获取 subcategory 列表时忘记添加 ajax 函数。我已经向它添加了 ajax 函数,现在它的结果与我在真实服务器中所面临的结果相同。正如您现在在jsfiddle 中看到的那样。你现在可以让这个 jsfiddle 工作吗?
猜你喜欢
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2012-09-18
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多