You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel9项目中替换Bootstrap面板为Leaflet地图后地图无法显示的问题解决问询

Fix: Leaflet Map Not Loading in Laravel 9 Blade Template

Let's break down why your map isn't showing up and fix it step by step:

The Root Problem

You tried inserting a full standalone HTML document (with <html>, <head>, <body> tags) directly into your Blade template's content area. But Laravel's Blade uses a layout system (usually layouts/app.blade.php or similar) that already includes these top-level tags. Having duplicate <head>/<body> elements breaks the DOM structure, so the browser can't properly load the Leaflet CSS/JS or initialize the map.

Step-by-Step Solution

1. Clean Up the Map Code

Remove all the top-level HTML boilerplate—we only need the map container and the initialization script. We'll handle CSS/JS loading properly via Laravel's asset management.

2. Load Leaflet Resources Correctly

Use Laravel's @push directives to inject Leaflet's CSS and JS into the appropriate sections of your master layout (this keeps your template clean and avoids duplicate resources).

3. Update Your Dashboard Blade File

Replace the original "Welcome to Webshooter" panel with this cleaned-up map code:

<div class="col-sm-6 col-sm-offset-3">
    <div class="panel panel-primary">
        <div class="panel-heading">
            {{ __('Map View') }}
        </div>
        <div class="panel-body">
            <!-- Map Container - use responsive styling instead of fixed width -->
            <div id="map" style="width: 100%; height: 400px;"></div>

            @push('styles')
                <!-- Leaflet CSS - pushed to layout's <head> -->
                <link rel="stylesheet" href="https://d19vzq90twjlae.cloudfront.net/leaflet-0.7/leaflet.css" />
            @endpush

            @push('scripts')
                <!-- Leaflet JS - pushed to layout's bottom (before </body>) -->
                <script src="https://d19vzq90twjlae.cloudfront.net/leaflet-0.7/leaflet.js"></script>
                <script>
                    // Initialize map once the DOM is ready
                    document.addEventListener('DOMContentLoaded', function() {
                        var map = L.map('map').setView([-41.2858, 174.78682], 14);
                        var mapLink = '<a href="http://openstreetmap.org">OpenStreetMap</a>';
                        L.tileLayer(
                            'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
                            { attribution: '&copy; ' + mapLink + ' Contributors', maxZoom: 18 }
                        ).addTo(map);
                    });
                </script>
            @endpush
        </div>
    </div>
</div>

4. Ensure Your Master Layout Accepts Pushed Resources

Make sure your master layout file (e.g., resources/views/layouts/app.blade.php) has these @stack directives in the right places:

In the <head> section:

@stack('styles')

Right before the closing </body> tag:

@stack('scripts')

Key Improvements Explained

  • Removed duplicate HTML boilerplate: No more conflicting <html>/<head>/<body> tags.
  • Responsive map container: Using width: 100% ensures the map fits the panel's width instead of a fixed 600px.
  • DOMContentLoaded listener: Ensures the map initializes only after the page's DOM is fully ready, avoiding errors where the #map element doesn't exist yet when the script runs.
  • Proper resource injection: Using @push/@stack keeps your assets organized and ensures they load in the correct order.

If you still run into issues, open your browser's dev tools (F12) and check the Console tab for any JavaScript errors—this will help pinpoint if there's a resource loading problem or syntax error.

内容的提问来源于stack exchange,提问作者raffodog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 00:24:08