Laravel:使用局部视图/模态框时避免重复脚本标签
解决Laravel局部视图重复加载mask.js的几种方案
方案1:用Blade的@once指令(最简单高效)
Blade自带的@once指令能保证包裹的内容在整个视图渲染周期内只执行一次,刚好适配你的场景。直接在局部视图的脚本区块里这么写:
@section('scripts') @parent @once <script src="/path/to/jquery.mask.min.js"></script> <!-- 这里可添加当前表单的mask初始化逻辑 --> <script> $(function() { $('.your-mask-input').mask('0000-0000'); }); </script> @endonce @endsection
不管你在同一个视图里引入多少次这个局部视图,@once内部的脚本只会输出一次,且在第一次引入时加载,完美满足「按需加载+不重复」的要求。
方案2:前端层面判断脚本是否已加载
如果不想依赖Blade指令,也可以用JS自身判断插件是否存在,避免重复请求:
@section('scripts') @parent <script> // 检查mask插件是否已挂载到jQuery if (typeof $.fn.mask === 'undefined') { var script = document.createElement('script'); script.src = '/path/to/jquery.mask.min.js'; script.onload = function() { // 脚本加载完成后初始化当前表单的mask $('.your-mask-input').mask('0000-0000'); }; document.head.appendChild(script); } else { // 插件已加载,直接初始化当前表单 $('.your-mask-input').mask('0000-0000'); } </script> @endsection
这种方式从前端层面做校验,不管后端渲染多少次局部视图,JS都会自动跳过重复加载的逻辑。
方案3:用视图共享变量做后端标记
你也可以通过Laravel的视图共享功能,在全局维护一个「是否已加载mask.js」的状态标记:
- 先在
AppServiceProvider的boot方法里共享初始变量:
public function boot() { view()->share('loadedMaskJs', false); }
- 然后在局部视图里做判断输出:
@section('scripts') @parent @unless($loadedMaskJs) <script src="/path/to/jquery.mask.min.js"></script> <?php $__env->share('loadedMaskJs', true); ?> @endunless <script> $(function() { $('.your-mask-input').mask('0000-0000'); }); </script> @endsection
第一次加载局部视图时,会输出脚本并把标记设为true,后续再引入该视图时就不会重复输出脚本了。
内容的提问来源于stack exchange,提问作者carbonisle
相关产品推荐
相关产品推荐

