【问题标题】:Laravel 5 js is blocking by app.jsLaravel 5 js 被 app.js 阻塞
【发布时间】:2018-10-16 07:52:25
【问题描述】:

我在home.blade.php 中使用了一个javascript,它扩展了layout/app.blade.php

@extend(layout.app)

当我在 home.blade.php 中扩展 javascript 时停止工作,所以我注释掉了

app.blade.php 中的<script src="{{ asset('js/app.js') }}" defer></script> 然后 javascript 开始工作。我不确定是什么问题,谁能帮我解决这个问题。

home.blade.php

@extends('layouts.app')
@section('content')
<div class="container">
   <div class="row justify-content-center">
      <div class="col-md-8">
         <div class="card">
            @if (Auth::user()->email=='admin@admin.com')
            <div class="card-header">Reports</div>
            <div class="card-body">
               <a href="view-reports">View Report</a><br>
               <a href="create-user">Create User</a>
            </div>
         </div>
         @else
         <div class="card-header">Report Form</div>
         <div class="card-body">
            @if (session('status'))
            <div class="alert alert-success">
               {{ session('status') }}
            </div>
            @endif
            <!-- You are logged in! -->
            @if(session()->has('message'))
            <div class="alert alert-success">
               {{ session()->get('message') }}
            </div>
            @endif
            <form action="store" method="post">
               <input type="hidden" name="name" value="{{Auth::user()->name}}">
               <label for="check_log">Checked Logs </label><br>
               <input type="radio" name="check_log" value="yes"> Yes
               <input type="radio" name="check_log" value="no"> No<br><br>
               <label for="verified_ticket"> Checked and Verified for pending tickets </label><br/>
               <input type="radio" name="verified_ticket" value="yes"> Yes
               <input type="radio" name="verified_ticket" value="no"> No<br><br>
               <label for="ticket_found"> Found any ticket that can be done by you </label><br/>
               <input type="radio" name="ticket_found" value="yes"> Yes
               <input type="radio" name="ticket_found" value="no"> No<br><br>
               <div id="box">
                  <label for="ticket_id"> Tickets done by you (INTERNAL Ticket ID'S) </label><br/>
                  <input type="text" name="ticket_id[]" id="name" class="name"><br/><br>
                  <label for="ticket_details"> what did you do</label><br/>
                  <input style="width: 65%; height: 100px;" type="text" name="ticket_details[]" width="200px" height="100px" value=""><br><br>
                  <label for="time"> Time Taken</label><br/>
                  <input type="text" name="time[]" id="name" class="name"><br/><br>
                  <div id="addmore">
                     <a href="#" id="add">Add More Input Field</a>
                  </div>
                  <br><br>
               </div>
               <label for="other_task"> Other Tasks (Should be specify what did you do and time taken for each task) </label><br/>
               <input style="width: 65%; height: 100px;" type="" name="other_task" value=""><br><br>
               <label for="shift_handoff"> Task/Alert that's needs attention from next shift/Dennis </label><br/>
               <input style="width: 65%; height: 100px;" type="" name="shift_handoff" value=""><br><br>
               <input type="checkbox" name="agree" value="agree"> I Agree<br><br>
               <input type="hidden" name="_token" value="{{csrf_token()}}">
               <input type="submit" name="submit" value="submit">
            </form>
            @endif
         </div>
      </div>
   </div>
</div>
@endsection
@section('javascript')
<script type="text/javascript">
   $(document).ready(function(){

       $('#add').click(function(){
           var inp = $('#box');

           var i = $('input').size() + 1;

           $('<div id="box' + i +'"><label for="ticket_id"> Ticket ID </label><br/><input type="text" name="ticket_id[]" id="name" class="name"><br/><br><label for="ticket_details[]"> what did you do</label><br/><input style="width: 65%; height: 100px;" type="text" name="ticket_details[]" width="200px" height="100px" value=""><br><br><label for="time"> Time Taken</label><br/><input type="text" name="time[]" id="name" class="name"><br><br><img src="Minus.png" width="32" height="32" border="0" align="top" class="add" id="remove" /><br><br> <div id="addmore"><a href="#" id="add">Add More Input Field</a></div><br><br></div>').appendTo(inp);

           i++;

       });



       $('body').on('click','#remove',function(){

           $(this).parent('div').remove();

       });

   });
</script> 
@endsection

app.balde.php

<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
   <head>
      <meta charset="utf-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <!-- CSRF Token -->
      <meta name="csrf-token" content="{{ csrf_token() }}">
      <title>{{ config('app.name', 'Daily report') }}</title>
      <!-- Scripts -->
      <script src="{{ asset('js/app.js') }}" defer></script>
      <!-- Fonts -->
      <link rel="dns-prefetch" href="https://fonts.gstatic.com">
      <link href="https://fonts.googleapis.com/css?family=Raleway:300,400,600" rel="stylesheet" type="text/css">
      <!-- Styles -->
      <link href="{{ asset('css/app.css') }}" rel="stylesheet">
   </head>
   <body>
      <div id="app">
         <nav class="navbar navbar-expand-md navbar-light navbar-laravel">
            <div class="container">
               <a class="navbar-brand" href="{{ url('/') }}">
               {{ config('app.name', 'Laravel') }}
               </a>
               <button class="navbar-toggler" 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><a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a></li>
                     <li><a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a></li>
                     @else
                     <li class="nav-item dropdown">
                        <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                        {{ Auth::user()->name }} <span class="caret"></span>
                        </a>
                        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
                           <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" style="display: none;">
                              @csrf
                           </form>
                        </div>
                     </li>
                     @endguest
                  </ul>
               </div>
            </div>
         </nav>
         <main class="py-4">
            @yield('content')
            <script src="{{ asset('js/app.js') }}"></script>
            @yield('javascript')
         </main>
      </div>
   </body>
</html>

【问题讨论】:

  • 共享刀片文件?
  • 你的控制台有错误吗?
  • @Pavel home:124 Uncaught TypeError: $(...).size is not a function at HTMLAnchorElement. (home:124) at HTMLAnchorElement.dispatch (app.js:1)在 HTMLAnchorElement.g.handle (app.js:1) (匿名) @ home:124 dispatch @ app.js:1 g.handle @ app.js:1
  • 你导入jquery了吗?另外,我认为您应该显示您的 app.js 文件。另外,为什么要使用size 函数?它已被弃用,所以也许你应该尝试length 函数。

标签: javascript php html laravel


【解决方案1】:

您的 app.blade.php 应如下所示:

<!DOCTYPE html>
<html lang="{{ app()->getLocale() }}">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">

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

        <title>{{ config('app.name', 'Test') }}</title>

        <!-- Styles -->
        <link href="{{ asset('css/app.css') }}" rel="stylesheet">
    </head>
    <body>
        <div id="app">
            @yield('content')
        </div>

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

以上是您的主要布局文件。如果您想在其他刀片文件中扩展它,您想使用该布局文件并添加内容或其他 javascript 功能。

为了更好地实现这一点,我们使用 @yield('javascript') 关键字来添加一个 javascript 文件或函数。

因此,扩展此刀片文件的其他刀片文件应如下所示:

@extends('layouts.app')

@section('content')
   // some content 
@endsection

@section('javascript')
   // your javascript
@endsection

首先您正在加载布局刀片文件,然后您可以将您的特定内容和 javascript 插入到您使用关键字 yield('xxx') 的每个部分中

查看您的源代码后:

您在 home.blade.php 中加载 jquery,这并不理想,如果您想加载它,您应该将它加载到您的主要刀片 php 文件中。但是如果你使用 laravel 默认的 app.js 文件,你实际上不需要加载它。默认的app.js 文件已经需要require('./bootstrap');。如果您没有更改,该文件已经包含 jquery。

try {
    window.$ = window.jQuery = require('jquery');

} catch (e) {}

所以检查您的app.js 是否需要引导文件并检查您的引导文件是否包含 jquery,如果是,则不需要在刀片文件中加载 jquery。

因此,您应该在主刀片中加载app.js 文件。在底部这样加载:

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

【讨论】:

  • app.js 脚本标签使
    中的所有内容运行两次(至少对我而言)。我设置了一个 repo github.com/jfbeltran97/laraveldoublerun 来展示这一点。知道为什么吗?
  • @JohnnyBeltran 我使用 Laravel 已经有几个月了,你身边到底发生了什么,你到底想要发生什么。
  • 我想使用 google maps api,但我一直在控制台中看到我已经包含了很多次(但在我的代码中我只包含了一次)。因此,我对此进行了评论,几个小时后,我发现一切都运行了两次。具体来说,app.blade.php 中的
    。我在这里问了一个问题,但还没有人回答:stackoverflow.com/questions/63145350/…
【解决方案2】:

https://laravel.com/docs/5.6/blade#stacks

要将脚本添加到您的子视图,您需要使用堆栈

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签