【问题标题】:How to trigger Bootstrap 3 data-toggle with JQuery?如何使用 JQuery 触发 Bootstrap 3 数据切换?
【发布时间】:2018-04-26 17:58:37
【问题描述】:

我的表单有两个复选框元素。这两个将显示/隐藏其他表单元素,这取决于它们是否被选中。然后我尝试实现用户单击添加新记录的功能。在这种情况下,应清除所有表单数据,包括这两个复选框元素。但是,我让这两个元素都未选中,但 data-toggle 并没有隐藏这些元素。这是我的代码示例:

$('.account-type').on('change', checkFormFld);

function checkFormFld() {
  var checked = false,
    containerID = $(this).data('target'),
    checkboxes = $('.account-type');

  $('.account-type').each(function() {
    checked = checked || $(this).is(':checked');
  });

  $(containerID + ' :input').prop('disabled', !$(this).is(':checked'));
  checkboxes.prop('required', !checked); // Set required attribute to false.
}

$('#account_goback').on('click', clearForm);

function clearForm(e) {
  e.preventDefault();
  $('.frm-Submit')[0].reset();
  $('.frm-Submit .collapse').collapse('hide');
  $('.account-type').trigger('change', checkFormFld);
}
<script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script language="javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<div id="searchaccount_container" class="collapse in">
  <div class="row">
    <div class="form-group col-xs-12 col-sm-12 col-md-12 col-lg-12">
      <button type="button" class="btn btn-primary" data-toggle="collapse" data-target="#saveaccount_container,#searchaccount_container">
          <span class="glyphicon glyphicon-plus-sign"></span> New Account
      </button>
    </div>
  </div>
</div>
<div id="saveaccount_container" class="collapse">
  <div class="row">
    <div class="form-group col-xs-12 col-sm-12 col-md-12 col-lg-12">
      <button type="button" class="btn btn-primary" name="account_goback" id="account_goback" data-toggle="collapse" data-target="#saveaccount_container,#searchaccount_container">
        <span class="glyphicon glyphicon-circle-arrow-left"></span> Go Back
      </button>
    </div>
  </div>
  <form name="frmSave" id="frmSave" class="frm-Submit" autocomplete="off">
    <div class="form-group required">
      <label class="control-label" for="fname"><span class="label label-primary">First Name:</span></label>
      <input type="text" class="form-control" name="frm_firstname" id="frm_firstname" placeholder="Enter First Name" maxlength="50" required>
    </div>
    <div class="form-group required">
      <label class="control-label" for="lname"><span class="label label-primary">Last Name:</span></label>
      <input type="text" class="form-control" name="frm_lastname" id="frm_lastname" placeholder="Enter Last Name" maxlength="50" required>
    </div>
    <div class="form-group required">
      <label class="control-label" for="email"><span class="label label-primary">Email address:</span></label>
      <input type="email" class="form-control check-existence" name="frm_email" id="frm_email" placeholder="Enter email" maxlength="80" required>
    </div>
    <div class="form-group required">
      <label class="control-label" for="type"><span class="label label-primary">Account Type:</span></label>
      <div class="checkbox">
        <label for="user">
            <input type="checkbox" name="frm_isuser" id="frm_isuser" class="account-type" data-toggle="collapse" data-target="#user-account" required> 
            <span class="label label-default">User</span>
        </label>
        <label for="staff">
            <input type="checkbox" name="frm_isstaff" id="frm_isstaff" class="account-type" data-toggle="collapse" data-target="#staff-account" required> 
            <span class="label label-info">Staff</span>
         </label>
      </div>
    </div>
    <div id="user-account" class="collapse">
      <div class="form-group required">
        <label class="control-label" for="active"><span class="label label-default">Active User:<span></label>
        <select class="form-control" name="frm_activeuser" id="frm_activeuser" required disabled>
          <option value="">-- Select the option --</option>
          <option value="0">No</option>
          <option value="1">Yes</option>
        </select>
      </div>
      <div class="form-group required">
        <label class="control-label" for="admin"><span class="label label-default">System Admin:</span></label>
        <select class="form-control" name="frm_systemadmin" id="frm_systemadmin" required disabled>
          <option value="">-- Select the option --</option>
          <option value="0">No</option>
          <option value="1">Yes</option>
        </select>
      </div>
    </div>
    <div id="staff-account" class="collapse">
      <div class="form-group required">
        <label class="control-label" for="activestaff"><span class="label label-info">Active Staff:<span></label>
        <select class="form-control" name="frm_activestaff" id="frm_activestaff" required disabled>
          <option value="">-- Select the option --</option>
          <option value="0">No</option>
          <option value="1">Yes</option>
        </select>
      </div>
    </div>
    <div class="row">
      <div class="form-group col-xs-12 col-sm-12 col-md-1 col-lg-1">
        <button type="submit" name="frmSaveaccount_submit" id="frmSaveaccount_submit" class="btn btn-primary">Submit</button>
      </div>
    </div>
  </form>
</div>

如果您在clearForm 函数中运行示例并取消注释代码行,您会看到隐藏的容器会向上滑动,但如果我再次单击则不会显示。有没有办法使用 JQuery 来实现这一点?

【问题讨论】:

  • 我认为上面的示例按预期工作。我必须更改checkFormFld 函数并在用户单击“返回”按钮后触发。如果有人有更好的解决方案,请告诉我。
  • Guess 将不得不重新调整分配给它的 required 的方式。

标签: javascript jquery css twitter-bootstrap twitter-bootstrap-3


【解决方案1】:

使用折叠组件方法...

https://getbootstrap.com/docs/3.3/javascript/#collapse-methods

$('.frm-Submit .collapse').collapse('toggle');

【讨论】:

  • 我是否需要检查它们是否可见?我已经尝试过您的解决方案,我只能看到所有表单元素都被禁用...
【解决方案2】:

您需要做的就是删除那些我们需要在 Go Back 按钮上折叠的类。并删除所需的属性

$('#user-account').removeClass('in');
$('#staff-account').removeClass('in');
$("#frm_isstaff").removeAttr('required'); // Set required attribute to false. 
$("#frm_activeuser").removeAttr('required'); // Set required attribute to false. 
$("#frm_systemadmin").removeAttr('required'); // Set required attribute to false. 

var $checkbox = $('.account-type');
$checkbox.on('change', function() {
  var checked = false,
    containerID = $(this).data('target');

  $checkbox.each(function() {
    checked = checked || $(this).is(':checked');
  });

  $('div' + containerID + ' :input').prop('disabled', !$(this).is(':checked')); // Set disabled attribute on all input fields when check box is unchecked.
  $checkbox.prop('required', !checked); // Set required attribute to false. 
});

$('#account_new').on('click', clearForm);

function clearForm(e) {
  e.preventDefault();
  $('.frm-Submit')[0].reset();
  $('#user-account').removeClass('in');
  $('#staff-account').removeClass('in');
}
<script language="javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script language="javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<div id="searchaccount_container" class="collapse in">
  <div class="row">
    <div class="form-group col-xs-12 col-sm-12 col-md-12 col-lg-12">
      <button type="button" class="btn btn-primary" data-toggle="collapse" name="account_new" id="account_new" data-target="#saveaccount_container,#searchaccount_container">
          <span class="glyphicon glyphicon-plus-sign"></span> New Account
      </button>
    </div>
  </div>
</div>
<div id="saveaccount_container" class="collapse">
  <div class="row">
    <div class="form-group col-xs-12 col-sm-12 col-md-12 col-lg-12">
      <button type="button" class="btn btn-primary" data-toggle="collapse" data-target="#saveaccount_container,#searchaccount_container">
        <span class="glyphicon glyphicon-circle-arrow-left"></span> Go Back
      </button>
    </div>
  </div>
  <form name="frmSave" id="frmSave" class="frm-Submit" autocomplete="off">
    <div class="form-group required">
      <label class="control-label" for="fname"><span class="label label-primary">First Name:</span></label>
      <input type="text" class="form-control" name="frm_firstname" id="frm_firstname" placeholder="Enter First Name" maxlength="50" required>
    </div>
    <div class="form-group required">
      <label class="control-label" for="lname"><span class="label label-primary">Last Name:</span></label>
      <input type="text" class="form-control" name="frm_lastname" id="frm_lastname" placeholder="Enter Last Name" maxlength="50" required>
    </div>
    <div class="form-group required">
      <label class="control-label" for="email"><span class="label label-primary">Email address:</span></label>
      <input type="email" class="form-control check-existence" name="frm_email" id="frm_email" placeholder="Enter email" maxlength="80" required>
    </div>
    <div class="form-group required">
      <label class="control-label" for="type"><span class="label label-primary">Account Type:</span></label>
      <div class="checkbox">
        <label for="user">
            <input type="checkbox" name="frm_isuser" id="frm_isuser" class="account-type" data-toggle="collapse" data-target="#user-account" required> 
            <span class="label label-default">User</span>
        </label>
        <label for="staff">
            <input type="checkbox" name="frm_isstaff" id="frm_isstaff" class="account-type" data-toggle="collapse" data-target="#staff-account" required> 
            <span class="label label-info">Staff</span>
         </label>
      </div>
    </div>
    <div id="user-account" class="collapse">
      <div class="form-group required">
        <label class="control-label" for="active"><span class="label label-default">Active User:<span></label>
        <select class="form-control" name="frm_activeuser" id="frm_activeuser" required disabled>
          <option value="">-- Select the option --</option>
          <option value="0">No</option>
          <option value="1">Yes</option>
        </select>
      </div>
      <div class="form-group required">
        <label class="control-label" for="admin"><span class="label label-default">System Admin:</span></label>
        <select class="form-control" name="frm_systemadmin" id="frm_systemadmin" required disabled>
          <option value="">-- Select the option --</option>
          <option value="0">No</option>
          <option value="1">Yes</option>
        </select>
      </div>
    </div>
    <div id="staff-account" class="collapse">
      <div class="form-group required">
        <label class="control-label" for="activestaff"><span class="label label-info">Active Staff:<span></label>
        <select class="form-control" name="frm_activestaff" id="frm_activestaff" required disabled>
          <option value="">-- Select the option --</option>
          <option value="0">No</option>
          <option value="1">Yes</option>
        </select>
      </div>
    </div>
    <div class="row">
      <div class="form-group col-xs-12 col-sm-12 col-md-1 col-lg-1">
        <button type="submit" name="frmSaveaccount_submit" id="frmSaveaccount_submit" class="btn btn-primary">Submit</button>
      </div>
    </div>
  </form>
</div>

【讨论】:

  • 谢谢,这行得通。另外,这是我得到的另一个解决方案$('.frm-Submit .collapse').collapse('hide');
  • 小注,在我尝试提交表单之前,这将正常工作。如果部分已展开并且我单击返回然后返回并尝试提交其他部分,它将需要其他部分的字段。这就是我的 onchange 函数应该处理的地方。
  • 我明白你在说什么。给我几分钟:)
  • 我的复选框功能应该更加动态/能够在这种情况下进行调整。我也在研究一些解决方案。谢谢!
  • @espresso_coffee,我很久以前就知道了,但一直在努力解决一个错字。使用frm_isuser 而不是from_activeuser
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 2014-02-11
  • 2014-12-27
  • 1970-01-01
  • 2019-10-06
  • 2023-04-03
相关资源
最近更新 更多