
在现代web应用开发中,我们经常会遇到这样的需求:页面上存在多个功能相似但内容不同的区域或按钮,它们都指向同一个模态框(modal)。当用户点击其中一个按钮打开模态框时,我们需要知道是哪个具体的按钮触发了这次打开操作,以便在模态框内部进行相应的个性化展示或数据提交。例如,在一个支付网关列表中,每个支付方式都有一个“充值”按钮,点击后打开同一个充值金额输入模态框,此时就需要识别用户选择了哪种支付方式。
传统的做法可能是在每个按钮上绑定不同的JavaScript事件,但这会增加代码的冗余和维护成本。更优雅的解决方案是利用Bootstrap模态框提供的事件机制。
Bootstrap模态框提供了一系列事件,允许开发者在模态框生命周期的不同阶段执行自定义逻辑。其中,show.bs.modal事件在模态框即将显示之前触发,并且它提供了一个非常有用的属性:relatedTarget。
relatedTarget属性指向了触发模态框打开的DOM元素。通过这个属性,我们可以轻松地访问到触发元素的任何属性,包括自定义的data-*属性。
让我们结合实际的HTML结构和JavaScript代码来演示这一过程。
假设我们有多个支付方式的卡片,每个卡片都有一个“Deposit”(充值)按钮,它们都指向同一个ID为exampleModal的模态框。每个按钮通过data-id属性携带了其对应的支付方式标识。
<!-- 多个触发模态框的 div 示例 -->
<div class="col-lg-6 col-md-6 col-sm-12 mb-4">
<div class="card">
<div class="card-body b-primary">
<div class="row justify-content-center">
<div class="col-md-5 col-sm-12">
<img src="assets/images/gateway/61eedfd72289f1643044823.jpg" class="card-img-top w-100" alt="Stripe">
</div>
<div class="col-md-7 col-sm-12">
<ul class="list-group text-center">
<li class="list-group-item">Stripe</li>
<li class="list-group-item">Limit : 50- 50000 USD</li>
<li class="list-group-item"> Charge - 0 USD+ 0% </li>
<li class="list-group-item">
<!-- 注意这里的 data-id="str" -->
<button type="button" data-id="str" data-base_symbol="" class="btn deposit cmn-btn w-100" data-toggle="modal" data-target="#exampleModal">
Deposit
</button>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- 另一个支付方式的卡片 -->
<div class="col-lg-6 col-md-6 col-sm-12 mb-4">
<div class="card">
<div class="card-body b-primary">
<div class="row justify-content-center">
<!-- ... 其他内容 ... -->
<li class="list-group-item">
<!-- 注意这里的 data-id="paypal" -->
<button type="button" data-id="paypal" data-base_symbol="" class="btn deposit cmn-btn w-100" data-toggle="modal" data-target="#exampleModal">
Deposit
</button>
</li>
<!-- ... 其他内容 ... -->
</div>
</div>
</div>
</div>
<!-- 模态框结构 -->
<div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content modal-content-bg">
<div class="modal-header">
<strong class="modal-title method-name text-white" id="exampleModalLabel">Input Deposit Amount</strong>
<a href="javascript:void(0)" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</a>
</div>
<form action="{{ route('deposit_request') }}" method="post" class="register">
@csrf
<div class="modal-body">
<div class="form-group">
<!-- 隐藏输入字段,用于接收 data-id -->
<input type="hidden" name="method_code" class="edit-method-code" value="">
<!-- ... 其他表单内容 ... -->
</div>
<div class="form-group">
<label>Enter Amount:</label>
<div class="input-group">
<input id="amount" type="text" class="form-control form-control-lg" name="usdamt" placeholder="0.00" required="" autocomplete="off">
<div class="input-group-prepend">
<span class="input-group-text currency-addon addon-bg">USD</span>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-md btn-danger" data-dismiss="modal">Close</button>
<button type="submit" class="btn-md cmn-btn">Next</button>
</div>
</form>
</div>
</div>
</div>使用jQuery监听exampleModal的show.bs.modal事件,并获取data-id。
$(document).ready(function() {
// 监听模态框的 show.bs.modal 事件
$('#exampleModal').on('show.bs.modal', function (event) {
// event.relatedTarget 是触发模态框打开的 DOM 元素
var button = $(event.relatedTarget);
// 从触发按钮获取 data-id 属性值
var dataId = button.data('id');
// 将获取到的 data-id 填充到模态框内的隐藏输入字段
// 这里的 .edit-method-code 是隐藏输入字段的 class
var modal = $(this);
modal.find('.edit-method-code').val(dataId);
console.log("Modal opened by:", dataId); // 可以在控制台查看效果
});
});代码解释:
通过利用Bootstrap模态框的show.bs.modal事件和event.relatedTarget属性,我们可以优雅地解决从触发元素向模态框内部传递数据的问题。这种方法不仅代码简洁,易于维护,而且能够确保模态框内部逻辑的准确性,从而提升用户体验和应用的健壮性。data-*属性作为HTML5提供的强大机制,是存储自定义数据并与JavaScript交互的推荐方式。
以上就是Bootstrap模态框:从触发元素获取数据标识并填充隐藏字段的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号