22

如果这个问题已经被问过,我很抱歉,但我没有找到解决方案。

我有 3 个单选元素,我想在选择更改和页面加载时检查值。

我会通过仅使用 on() 函数来做到这一点。

我的问题是只触发了更改事件。

这是我当前的代码:

$('.user').on('load change', function(){
  if($(this).val() == 'client'){ 
$('#user_parent').removeAttr('disabled').closest('tr').show(200);
}else{
  $('#user_parent').attr('disabled', 'disabled').closest('tr').hide(200);
}
});"

我也尝试用 ready 替换 load,但它也失败了。什么问题?load 事件不是可用于单个元素吗?

代码放在$(document).ready(...)中,页面发送时元素全部显示。

谢谢

4

3 回答 3

21

load加载监听元素的所有子元素时,将调用该事件。在您的情况下,这可能是在调用 ready 事件之前,从而使您的处理程序加载(在 document.ready 之后附加)无用。

作为参考,请参阅JQuery api,您将在其中找到以下内容:

当元素和所有子元素都已完全加载时,加载事件将发送到该元素。此事件可以发送到与 URL 关联的任何元素:图像、脚本、框架、iframe 和窗口对象。

这也意味着您需要一个 URL,以便您可以监听 load 事件。由于您没有提供更多代码,我假设您确实有一个可以收听的 URL。

不过,这可能是最可能的原因。如果您没有与(至少一个)子元素关联的任何 URL ,则您将无法收听任何加载事件。

试试这个:

$(document).ready(function(){
   checkUserVal();
   $('.user').on('change', checkUserVal);
});

var checkUserVal = function(){
  //do the check
  if($('.user').val() == 'client'){ 
     $('#user_parent').removeAttr('disabled').closest('tr').show(200);
  }else{
     $('#user_parent').attr('disabled', 'disabled').closest('tr').hide(200);
  }
};

我使代码成为提高可读性的方法;)

于 2013-07-01T08:37:38.587 回答
9

正如Vogel612 解释的那样,load大多数元素都不会触发。

ready只为document

您可以使用each最初运行您的事件处理程序。

$(document).ready(function(){
  $('.user')
    .each(user_handler)
    .on('change', user_handler);
});

var user_handler = function(){
  // this
};
于 2014-10-08T23:12:10.410 回答
0
<script>
jQuery( 'document' ).on("load ready", function() {
    $('.user').on('change', function(){
        if($(this).val() == 'client'){ 
            $('#user_parent').removeAttr('disabled').closest('tr').show(200);
        }else{
            $('#user_parent').attr('disabled', 'disabled').closest('tr').hide(200);
        }
    });
    // just do this:
    $('.user').change();
    });
</script>
于 2020-11-12T15:47:24.000 回答