【问题标题】:Select changes not triggering if added by JQuery如果由 JQuery 添加,则选择不会触发的更改
【发布时间】:2023-03-29 09:00:01
【问题描述】:

我有一个多级选择链,其中通过第一个选择的值生成下一个选择列表的选项。在第二个列表中,一些值会导致 div 与另一个输入一起显示。

在静态内容上测试时,我的代码(如下)似乎工作得很好(即:第二个选择在 html 中被硬编码)。但是当我用JQuery添加时,第二级不再触发.change函数。

<script type="text/javascript">
$(document).ready(function() {
  $dts = $("select[name='tourdes']");
  $dts.change(function() { 
     var dtsValue = $(this).val();
     var dtsString = '?tourdes=' + dtsValue; 
     $('#dateSelect').show();
     $('#dateSelect').load('include/avdates.php' + dtsString).append();
  });
});
</script>

<script type="text/javascript">
$(document).ready(function() {
  $tags = $("select[name='tourcode']");
  $tags.change(function() {
     if ($(this).val() == "private") {
     $(".prvcal").css({"visibility":"visible"});
  }
  });
});
</script>

我猜有些东西需要重新初始化,但我的实验一无所获。

【问题讨论】:

  • 您的代码是重建整个&lt;select&gt; 元素还是只是重新执行其中的&lt;option&gt; 标签?如果是前者,那么问题在于您的处理程序绑定将无法在重新生成元素后继续存在。
  • 你应该只有一个 $(document).ready(function(){}}; 将两个更改函数放在 1 个就绪函数中会发生什么?
  • 它用
  • 我确实尝试将它们组合在一起但没有效果。它们目前是分开的,只是为了让代码更容易找到。

标签: php jquery forms onchange


【解决方案1】:

如果您使用的是 jQuery 1.7,您将希望使用 on,因为 livedelegate 都已弃用。

$(document).on("change", "select[name='tourcode']", function() {
    var dtsValue = $(this).val();
    var dtsString = '?tourdes=' + dtsValue; 
    $('#dateSelect').show();
    $('#dateSelect').load('include/avdates.php' + dtsString).append();
});

docs for on()

【讨论】:

  • 感谢您的建议。通过将这两个函数更改为使用 .on() 我终于能够让它全部工作。
【解决方案2】:

您可能正在使用动态生成的 HTML 元素。如果是这样的话,你需要使用.delegate()来处理它们:

$('select').delegate("[name='tourdes']", 'change', function() { 

【讨论】:

  • 或者,最好是delegate() (jQuery on() (jQuery >= 1.7)。
  • 或者最好是“.delegate()”或“.on()”,因为“.live()”真的是一种愚蠢的API。 编辑 -- 哇哦@DavidThomas 怪异
  • 我应该在 dts ,tags 用于添加的
  • 我一直按照建议尝试,但没有成功。我一直在使用 `$('select').delegate("[name='tourcode']", 'change', function() { if ($(this).val() == "private") { $ (".prvcal").css({"visibility":"visible"}); }); });` 但没有运气。如果它在 document.ready 函数中,它将禁用现有函数,如果在它自己的 document.ready 中,现有函数有效但委托函数无效
  • 当您调用document.ready() 两次时,它会覆盖现有的document.ready() 函数。您需要合并它们。
猜你喜欢
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 2015-12-29
  • 2016-11-18
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多