如何在Laravel的Blade与JS环境中区分触发模态框的按钮
实现方案
步骤1:修改触发按钮的HTML代码
分别给发布新推文、回复推文按钮加上自定义data-*属性存储标识和业务参数:
发布新推文按钮
<a class="modal-open cursor-pointer" title="{{ __('lang.createTweet') }}" data-action="create"> <img src="{{ asset('/images/post.png') }}" width="16" height="16"> </a>
回复推文按钮
<a class="modal-open cursor-pointer" title="{{ __('lang.replyTweet') }}" data-action="reply" data-username="{{ $tweet->user->username }}" data-tweet-id="{{ $tweet->id }}"> <img src="{{ asset('/images/speech-bubble.png') }}" width="16" height="16"> </a>
步骤2:修改模态框代码
给需要动态修改的元素加上ID方便JS操作:
<!-- 模态框标题加ID --> <p class="text-2xl font-bold" id="modalTitle">{{ __('lang.createTweet') }}</p> <!-- 表单加ID --> <form method="POST" action="{{ route('createTweet') }}" enctype="multipart/form-data" id="tweetForm">
步骤3:修改JS逻辑
替换原有打开模态框和toggleModal相关的JS代码:
var openmodal = document.querySelectorAll('.modal-open') const tweetForm = document.querySelector('#tweetForm') const tweetTextarea = document.querySelector('#Tweet_body') const modalTitle = document.querySelector('#modalTitle') // 缓存默认的发推路由,重置时用 const defaultCreateRoute = tweetForm.action for (var i = 0; i < openmodal.length; i++) { openmodal[i].addEventListener('click', function (event) { event.preventDefault() const trigger = event.currentTarget const action = trigger.dataset.action // 先重置表单状态 resetModalState() if (action === 'reply') { // 回复场景差异化处理 const username = trigger.dataset.username const tweetId = trigger.dataset.tweetId // 预置@用户名前缀 tweetTextarea.value = `@${username} ` // 替换为回复路由,可根据自己的路由规则调整格式 tweetForm.action = `{{ route('replyTweet', ['id' => ':id']) }}`.replace(':id', tweetId) // 可选:修改模态框标题 modalTitle.innerText = '{{ __('lang.replyTweet') }}' } toggleModal() }) } // 模态框关闭时重置所有状态,避免内容残留 function resetModalState() { tweetTextarea.value = '' tweetForm.action = defaultCreateRoute modalTitle.innerText = '{{ __('lang.createTweet') }}' } // 原有toggleModal函数增加重置逻辑 function toggleModal() { const body = document.querySelector('body') const modal = document.querySelector('.modal') modal.classList.toggle('opacity-0') modal.classList.toggle('pointer-events-none') // 关闭模态框时触发重置 if (modal.classList.contains('opacity-0')) { resetModalState() } body.classList.toggle('modal-active') } // 其余原有关闭模态框、ESC监听的代码保持不变即可
补充说明
- 所有标识和参数都存储在触发元素的自定义属性中,完全前端处理无需后端参与
- 关闭模态框自动重置状态,不会出现回复内容残留到发新推文场景的问题
- 可根据需求扩展更多差异化逻辑,比如修改提交按钮文字、显示隐藏额外表单字段等,都可以通过
action标识位判断实现
内容的提问来源于stack exchange,提问作者Emil Beli
相关产品推荐
相关产品推荐

