【问题标题】:Problems with chart.js using Laravel 7, Cannot find element: #app?使用 Laravel 7 的 chart.js 出现问题,找不到元素:#app?
【发布时间】:2021-09-10 22:10:03
【问题描述】:

我正在使用 chart.js 来显示用户评论和消息的统计信息,但我遇到了脚本问题,现在统计信息正在运行但我收到此错误 找不到元素:#app ,我不知道如何处理。

如果我在这个脚本中使用 defer(现在我删除了它以查看统计信息,但网站的所有其他部分都没有)

<script src="{{ asset('js/app.js') }}"></script>

统计信息不再起作用,我还收到另一个错误,例如 模板应该只负责将状态映射到 UI。避免在模板中放置带有副作用的标签,例如 ,因为它们不会被解析。

所以如果我使用 defer 我会出错,如果我不使用 defer 它找不到#app。

我该怎么办?请帮帮我,这很重要!

我的 app.blade.php 文件(之前的脚本所在的位置)

<!doctype html>
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- CSRF Token -->
    <meta name="csrf-token" content="{{ csrf_token() }}">

    {{-- <title>{{ config("app.name", "Bool n Roll") }}</title> --}}
    <title>Bool 'n' Roll</title>

    <script src="{{ asset('js/app.js') }}"></script>

    <link rel="icon" href="{{asset('images/favicon.ico')}}" type="image/x-icon"/>

    <!-- Fonts -->
    <link rel="dns-prefetch" href="//fonts.gstatic.com">
    <link href="https://fonts.googleapis.com/css?family=Nunito" rel="stylesheet">

    <!-- Styles -->
    <link href="{{ asset('css/app.css') }}" rel="stylesheet">
</head>
<body>
    <div id="app">
        <nav class="navbar navbar-expand-md  shadow-sm bg-nav fixed-nav">
            <div class="container">
                <a class="navbar-brand" href="{{ url('/') }}">
                    <img style="height: 50px;" src="{{ asset('images/logorock.png') }}" alt="">
                </a>
                <button class="navbar-toggler bg-dark" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <div class="collapse navbar-collapse" id="navbarSupportedContent">
                    <!-- Left Side Of Navbar -->
                    <ul class="navbar-nav mr-auto">

                    </ul>

                    <!-- Right Side Of Navbar -->
                    <ul class="navbar-nav ml-auto">
                        <!-- Authentication Links -->
                        @guest
                            <li class="nav-item login-link rounded ml-2">
                                <a class="nav-link text-white px-2" href="{{ route('login') }}">{{ __('Login') }}</a>
                            </li>
                            @if (Route::has('register'))
                                <li class="nav-item register-link rounded ml-2">
                                    <a class="nav-link title-orange px-2" href="{{ route('register') }}">{{ __('Sei un musicista? Registrati!') }}</a>
                                </li>
                            @endif
                        @else
                            <li class="nav-item dropdown">
                                <a id="navbarDropdown" class="nav-link dropdown-toggle title-orange" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                                    {{ ucfirst(Auth::user()->name) }}
                                </a>

                                <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
                                    <a class="dropdown-item" href="/admin">
                                        Dashboard
                                    </a>
                                    <a class="dropdown-item" href="{{ route('logout') }}"
                                       onclick="event.preventDefault();
                                                     document.getElementById('logout-form').submit();">
                                        {{ __('Logout') }}
                                    </a>

                                    <form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
                                        @csrf
                                    </form>
                                </div>
                            </li>
                        @endguest
                    </ul>
                </div>
            </div>
        </nav>

        <main>
            @yield('content')
        </main>

        <footer class="bg-dark text-white py-5">
            <div class="container">
                <div class="row text-center">
                    <div class="col-xs-12 col-md-4 col-lg-4">
                        <img style="height: 50px;" src="{{ asset('/images/footer-logo.png') }}" alt="">
                        <h5 class="my-3">Made with <span class="title-pink">&hearts;</span> from Team 4</h5>
                    </div>

                    <div class="col-xs-12 col-md-4 col-lg-4">
                        <h5>Dev Team</h5>
                        <ul class="list-unstyled">
                            <li><a class="footer-list title-yellow" href="https://github.com/RobertoZeppilli">Roberto Zeppilli</a></li>
                            <li><a class="footer-list title-petrol" href="https://github.com/Edomak">Edoardo Maccherini</a></li>
                            <li><a class="footer-list title-orange" href="https://github.com/fabiopiro">Fabio Piroddi</a></li>
                            <li><a class="footer-list title-pink" href="https://github.com/michelafranchini">Michela Franchini</a></li>
                        </ul>
                    </div>
                    <div class="col-xs-12 col-md-4 col-lg-4">
                        <h5 class="my-3">Sei un musicista?</h5>
                        <ul class="list-unstyled">
                            <li class="nav-item register-link rounded">
                                <a class="nav-link title-orange" href="{{ route('register') }}">{{ __('Registrati subito!') }}</a>
                            </li>
                        </ul>
                    </div>
                    
                    
                </div>

            </div>
        </footer>
    </div>

    @yield('script')
    

    
</body>
</html>

我的统计视图 在这里,我认为我遇到了重大问题,也许脚本不正确?或者有更好的方法将它们放入工作流程中?

@extends('layouts.app')

@section('content')
<div class="my_container">
  <h1 class="stat_title">Le tue statistiche</h1>
  @if (count($messages) == 0 && count($reviews) == 0)
      <h2 id="empty_page">Non hai statistiche disponibili</h2>
  @else

  <div class="chart_1">
    <h4>Numero di messaggi e recensioni ricevute ogni mese</h4>
    <canvas id="myChart"></canvas>
  </div>
  <div class="chart_1">
    <h4>Voti ricevuti ogni mese</h4>
    <canvas id="myOtherChart"></canvas>
  </div>
  @endif
  <p class="link_dashboard"><a href="{{ route('admin.welcome') }}">Torna alla Dashboard</a></p>
</div>



<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.min.js" integrity="sha512-Wt1bJGtlnMtGP0dqNFH1xlkLBNpEodaiQ8ZN5JLA5wpc1sUlk/O5uuOMNgvzddzkpvZ9GLyYNa8w2s7rqiTk5Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>

<script src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.10.6/dayjs.min.js" integrity="sha512-bwD3VD/j6ypSSnyjuaURidZksoVx3L1RPvTkleC48SbHCZsemT3VKMD39KknPnH728LLXVMTisESIBOAb5/W0Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>


<script>dayjs().format()</script>


<script>

  dayjs().format()
var ctx = document.getElementById('myChart');
var ct2 = document.getElementById('myOtherChart');
var commenti = {!! $reviews->toJson() !!};
var messaggi = {!! $messages->toJson() !!};
// console.log(commenti.length);
// console.log(messaggi.length);
var now = dayjs();
if (commenti[0]) {
  var primaDataCommento = commenti[0].created_at;
  var date1 = dayjs(primaDataCommento);
} else {
  var date1 = now;
}
const primaDataMessaggio = messaggi[0].created_at;
const date2 = dayjs(primaDataMessaggio);
var datex;
if (date2 < date1) {
  datex = date2;
} else {
  datex = date1;
}
var diff = now.diff(datex, 'month');
var diffRece = now.diff(date1, 'month');
var months = [];
var monthsRece = [];
var recensioniMese = [];
var messaggiMese = [];
var voto1 = [];
var voto2 = [];
var voto3 = [];
var voto4 = [];
var voto5 = [];
// prima tabella
var x = 1;
let i = 0;
if (datex.$M == 0) {
  diff++;
  i++;
  x--;
}
for (i; i <= diff; i++) {
  var numeroMese = datex.$M + i + x;
  months.push(numeroMese + '/2021');
  var countRec = 0;
  var countMes = 0;
  for (let j = 0; j < commenti.length; j++) {
    if (numeroMese == dayjs(commenti[j].added_on).$M + 1) {
      countRec++;
    }
  }
  for (let j = 0; j < messaggi.length; j++) {
    if (numeroMese == dayjs(messaggi[j].added_on).$M + 1) {
      countMes++;
   }
  }
  recensioniMese.push(countRec);
  messaggiMese.push(countMes);
}
// seconda tabella
x = 1;
i = 0;
if (date1.$M == 0) {
  diffRece++;
  i++;
  x--;
}
for (i; i <= diff; i++) {
  var numeroMeseRece = date1.$M + i + x;
  monthsRece.push(numeroMeseRece + '/2021');
  var countRece1 = 0;
  var countRece2 = 0;
  var countRece3 = 0;
  var countRece4 = 0;
  var countRece5 = 0;
  for (let j = 0; j < commenti.length; j++) {
    if (numeroMeseRece == dayjs(commenti[j].created_at).$M + 1) {
      switch (commenti[j].vote) {
        case 1:
          countRece1++;
          break;
        case 2:
          countRece2++;
          break;
        case 3:
          countRece3++;
          break;
        case 4:
          countRece4++;
          break;
        case 5:
          countRece5++;
          break;
        default:
          break;
      }
    }
  }
  voto1.push(countRece1);
  voto2.push(countRece2);
  voto3.push(countRece3);
  voto4.push(countRece4);
  voto5.push(countRece5);
}
var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: months,
        datasets: [
          {
            label: 'Numero di recensioni',
            data: recensioniMese,
            backgroundColor: [
                '#0000ff8c',
            ],
            borderColor: [
                '#0000ff',
            ],
            borderWidth: 1
        },
        {
            label: 'Numero di messaggi ricevuti',
            data: messaggiMese,
            backgroundColor: [
                '#ff00c88c',
            ],
            borderColor: [
                '#ff00c8',
            ],
            borderWidth: 1
        },
      ]
    },
    options: {
        scales: {
            y: {
                beginAtZero: true,
                ticks: {
                stepSize: 1
              }
            }
        }
    }
});
var myChart = new Chart(ct2, {
    type: 'bar',
    data: {
        labels: monthsRece,
        datasets: [
          {
            label: 'Recensioni con voto 1',
            data: voto1,
            backgroundColor: [
                '#ff00008c',
            ],
            borderColor: [
                'red',
            ],
            borderWidth: 1
        },
        {
            label: 'Recensioni con voto 2',
            data: voto2,
            backgroundColor: [
                '#ffa6008c',
            ],
            borderColor: [
                'orange',
            ],
            borderWidth: 1
        },
        {
            label: 'Recensioni con voto 3',
            data: voto3,
            backgroundColor: [
                '#ffff008c',
            ],
            borderColor: [
                'yellow',
            ],
            borderWidth: 1
        },
        {
            label: 'Recensioni con voto 4',
            data: voto4,
            backgroundColor: [
                '#b7dd298c',
            ],
            borderColor: [
                '#b7dd29',
            ],
            borderWidth: 1
        },
        {
            label: 'Recensioni con voto 5',
            data: voto5,
            backgroundColor: [
                '#57e32c8c',
            ],
            borderColor: [
                '#57e32c',
            ],
            borderWidth: 1
        },
      ]
    },
    options: {
        scales: {
            y: {
                beginAtZero: true,
                ticks: {
                stepSize: 1
              }
            }
        }
    }
});
</script>


@endsection

app.js 文件 也许问题就在这里?我试图将 vue 实例包装在 addEventListener('load') 或稍后加载实例的东西中,但它不起作用。

require('./bootstrap');

window.Vue = require('vue');

import router from './router';

var dayjs = require('dayjs')
// dayjs().format()

import Vue from 'vue';
import VueCarousel from 'vue-carousel';
Vue.use(VueCarousel);

// import Vue from "vue";


/**
 * The following block of code may be used to automatically register your
 * Vue components. It will recursively scan this directory for the Vue
 * components and automatically register them with their "basename".
 *
 * Eg. ./components/ExampleComponent.vue -> <example-component></example-component>
 */

// const files = require.context('./', true, /\.vue$/i)
// files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default))

Vue.component('example-component', require('./components/ExampleComponent.vue').default);

/**
 * Next, we will create a fresh Vue application instance and attach it to
 * the page. Then, you may begin adding components to this application
 * or customize the JavaScript scaffolding to fit your unique needs.
 */



const app = new Vue({
    el: '#app',
    router,
    dayjs,

});

StatController 这里一切正常,我将把它留在这里只是为了向您展示获取用户评论和消息统计信息的完整工作流程

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

use App\Musician;
use App\Message;
use App\Review;

use Illuminate\Support\Facades\Auth;

class StatController extends Controller
{
    
    public function showStats(){


        // prendo i dati del dottore registrato
        

        $musician = Musician::where('user_id', Auth::id())->first();
        // accedo alle tabelle dei messaggi e recensioni per prenderne i dati
        $messages = Message::where('musician_id', $musician->id)->get();

        $reviews = Review::where('musician_id', $musician->id)->get();


        return view('admin.musicians.stats', compact('musician', 'messages', 'reviews'));
    }
}

【问题讨论】:

    标签: javascript laravel vue.js chart.js


    【解决方案1】:

    更新您app.blade.php。从页眉中删除这个&lt;script src="{{ asset('js/app.js') }}"&gt;&lt;/script&gt; 并放在页脚之后的正文中。

    ...
    
    <script src="{{ asset('js/app.js') }}"></script>
    
    @yield('script')
        
    </body>
    </html>
    

    然后在app.js之后使用@stack('script')加载其他脚本,更新你的My Stat View

    @extends('layouts.app')
    
    @section('content')
    <div class="my_container">
      <h1 class="stat_title">Le tue statistiche</h1>
      @if (count($messages) == 0 && count($reviews) == 0)
          <h2 id="empty_page">Non hai statistiche disponibili</h2>
      @else
    
      <div class="chart_1">
        <h4>Numero di messaggi e recensioni ricevute ogni mese</h4>
        <canvas id="myChart"></canvas>
      </div>
      <div class="chart_1">
        <h4>Voti ricevuti ogni mese</h4>
        <canvas id="myOtherChart"></canvas>
      </div>
      @endif
      <p class="link_dashboard"><a href="{{ route('admin.welcome') }}">Torna alla Dashboard</a></p>
    </div>
    @endsection
    
    @push('script')
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.min.js" integrity="sha512-Wt1bJGtlnMtGP0dqNFH1xlkLBNpEodaiQ8ZN5JLA5wpc1sUlk/O5uuOMNgvzddzkpvZ9GLyYNa8w2s7rqiTk5Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.10.6/dayjs.min.js" integrity="sha512-bwD3VD/j6ypSSnyjuaURidZksoVx3L1RPvTkleC48SbHCZsemT3VKMD39KknPnH728LLXVMTisESIBOAb5/W0Q==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
    
    
    <script>dayjs().format()</script>
    
    
    <script>
    
      dayjs().format()
    var ctx = document.getElementById('myChart');
    var ct2 = document.getElementById('myOtherChart');
    var commenti = {!! $reviews->toJson() !!};
    var messaggi = {!! $messages->toJson() !!};
    // console.log(commenti.length);
    // console.log(messaggi.length);
    var now = dayjs();
    if (commenti[0]) {
      var primaDataCommento = commenti[0].created_at;
      var date1 = dayjs(primaDataCommento);
    } else {
      var date1 = now;
    }
    const primaDataMessaggio = messaggi[0].created_at;
    const date2 = dayjs(primaDataMessaggio);
    var datex;
    if (date2 < date1) {
      datex = date2;
    } else {
      datex = date1;
    }
    var diff = now.diff(datex, 'month');
    var diffRece = now.diff(date1, 'month');
    var months = [];
    var monthsRece = [];
    var recensioniMese = [];
    var messaggiMese = [];
    var voto1 = [];
    var voto2 = [];
    var voto3 = [];
    var voto4 = [];
    var voto5 = [];
    // prima tabella
    var x = 1;
    let i = 0;
    if (datex.$M == 0) {
      diff++;
      i++;
      x--;
    }
    for (i; i <= diff; i++) {
      var numeroMese = datex.$M + i + x;
      months.push(numeroMese + '/2021');
      var countRec = 0;
      var countMes = 0;
      for (let j = 0; j < commenti.length; j++) {
        if (numeroMese == dayjs(commenti[j].added_on).$M + 1) {
          countRec++;
        }
      }
      for (let j = 0; j < messaggi.length; j++) {
        if (numeroMese == dayjs(messaggi[j].added_on).$M + 1) {
          countMes++;
       }
      }
      recensioniMese.push(countRec);
      messaggiMese.push(countMes);
    }
    // seconda tabella
    x = 1;
    i = 0;
    if (date1.$M == 0) {
      diffRece++;
      i++;
      x--;
    }
    for (i; i <= diff; i++) {
      var numeroMeseRece = date1.$M + i + x;
      monthsRece.push(numeroMeseRece + '/2021');
      var countRece1 = 0;
      var countRece2 = 0;
      var countRece3 = 0;
      var countRece4 = 0;
      var countRece5 = 0;
      for (let j = 0; j < commenti.length; j++) {
        if (numeroMeseRece == dayjs(commenti[j].created_at).$M + 1) {
          switch (commenti[j].vote) {
            case 1:
              countRece1++;
              break;
            case 2:
              countRece2++;
              break;
            case 3:
              countRece3++;
              break;
            case 4:
              countRece4++;
              break;
            case 5:
              countRece5++;
              break;
            default:
              break;
          }
        }
      }
      voto1.push(countRece1);
      voto2.push(countRece2);
      voto3.push(countRece3);
      voto4.push(countRece4);
      voto5.push(countRece5);
    }
    var myChart = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: months,
            datasets: [
              {
                label: 'Numero di recensioni',
                data: recensioniMese,
                backgroundColor: [
                    '#0000ff8c',
                ],
                borderColor: [
                    '#0000ff',
                ],
                borderWidth: 1
            },
            {
                label: 'Numero di messaggi ricevuti',
                data: messaggiMese,
                backgroundColor: [
                    '#ff00c88c',
                ],
                borderColor: [
                    '#ff00c8',
                ],
                borderWidth: 1
            },
          ]
        },
        options: {
            scales: {
                y: {
                    beginAtZero: true,
                    ticks: {
                    stepSize: 1
                  }
                }
            }
        }
    });
    var myChart = new Chart(ct2, {
        type: 'bar',
        data: {
            labels: monthsRece,
            datasets: [
              {
                label: 'Recensioni con voto 1',
                data: voto1,
                backgroundColor: [
                    '#ff00008c',
                ],
                borderColor: [
                    'red',
                ],
                borderWidth: 1
            },
            {
                label: 'Recensioni con voto 2',
                data: voto2,
                backgroundColor: [
                    '#ffa6008c',
                ],
                borderColor: [
                    'orange',
                ],
                borderWidth: 1
            },
            {
                label: 'Recensioni con voto 3',
                data: voto3,
                backgroundColor: [
                    '#ffff008c',
                ],
                borderColor: [
                    'yellow',
                ],
                borderWidth: 1
            },
            {
                label: 'Recensioni con voto 4',
                data: voto4,
                backgroundColor: [
                    '#b7dd298c',
                ],
                borderColor: [
                    '#b7dd29',
                ],
                borderWidth: 1
            },
            {
                label: 'Recensioni con voto 5',
                data: voto5,
                backgroundColor: [
                    '#57e32c8c',
                ],
                borderColor: [
                    '#57e32c',
                ],
                borderWidth: 1
            },
          ]
        },
        options: {
            scales: {
                y: {
                    beginAtZero: true,
                    ticks: {
                    stepSize: 1
                  }
                }
            }
        }
    });
    </script>
    @endpush
    

    【讨论】:

    • 好人,非常感谢!我确实将 b:push 与 stats.blade 中的脚本一起使用,但从未考虑使用 b:stack 来包含该脚本。太棒了!!!
    • @Robbbb 没问题
    猜你喜欢
    • 2022-01-01
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 2017-05-15
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多