代码之家  ›  专栏  ›  技术社区  ›  Chris

$(...).使用Laravel Mix时,DataTable不是函数

  •  10
  • Chris  · 技术社区  · 6 年前

    错误是:

    jQuery.Deferred exception: $(...).DataTable is not a function TypeError: $(...).DataTable is not a function
    Uncaught TypeError: $(...).DataTable is not a function
    

    据我所知, $(...).DataTable 不是全局变量,但我如何确保它在我的应用程序中“在全局范围内”可访问?

    应用程序。js公司

    import jquery from 'jquery/dist/jquery.slim'
    import 'bootstrap-sass'
    import 'datatables.net';
    import dt from 'datatables.net-bs';
    
    window.$ = window.jQuery = jquery;
    

    网页包。混合js公司

    mix
        .js('resources/assets/admin/js/app.js', 'js/')
        .extract([
            'jquery', 'bootstrap-sass', 'datatables.net', 'datatables.net-bs'
        ])
        .autoload({
            jquery: ['$', 'window.jQuery', 'jQuery', 'jquery'],
            DataTable : 'datatables.net-bs'
        })
    

    任何想法都将不胜感激。

    5 回复  |  直到 6 年前
        1
  •  10
  •   ljubadr    5 年前

    编辑: 虽然这个答案在发布和接受时起到了作用,但看起来情况已经不是这样了。

    Yevgeniy Afanasyev

    Alexander Gallego L.

    Artistan

    因为这是公认的答案,我将添加新的解决方案,但这应该归功于提供更新答案的人

    window.$ = window.jQuery = require( 'jquery' );
    
    require( 'datatables.net' );
    require( 'datatables.net-bs' );
    

    原始答案

    查看npmjs页面 datatables.net datatables.net-bs

    它们应该这样初始化

    var $ = require( 'jquery' );
    require( 'datatables.net' )( window, $ );
    require( 'datatables.net-bs' )( window, $ );
    

    我们可以把它变成这个

    var $     = require( 'jquery' );
    var dt    = require( 'datatables.net' )
    var dt_bs = require( 'datatables.net-bs' )
    
    // in this call we're attaching Datatables as a jQuery plugin
    // without this step $().DataTable is undefined
    dt( window, $ )
    // we need to do the same step for the datatables bootstrap plugin
    dt_bs( window, $ )
    

    但是如果你真的想用 import .. from .. ,查看 MDN import documentation

    import $ from 'jquery/dist/jquery.slim';
    import * as dt from 'datatables.net';
    import * as dt_bs from 'datatables.net-bs';
    
    dt( window, $ )
    dt_bs( window, $ )
    
        2
  •  8
  •   Artistan    6 年前

    对于最新的Laravel混音。。。

    leave off the (...)

    这将加载bootstrap、jquery、datatables和许多datatables插件,而不会出现任何问题。。。

    window._ = require( 'lodash' );;
    window.$ = window.jQuery = require( 'jquery' );;
    window.Popper = require('popper.js').default;
    
    // bootstrap
    require('bootstrap');
    
    // bootstrap datatables...
    require( 'jszip' );
    require( 'datatables.net-bs4' );
    require( 'datatables.net-buttons-bs4' );
    require( 'datatables.net-buttons/js/buttons.colVis.js' );
    require( 'datatables.net-buttons/js/buttons.flash.js' );
    require( 'datatables.net-buttons/js/buttons.html5.js' );
    require( 'datatables.net-buttons/js/buttons.print.js' );
    require( 'datatables.net-autofill-bs4' );
    require( 'datatables.net-colreorder-bs4' );
    require( 'datatables.net-fixedcolumns-bs4' );
    require( 'datatables.net-fixedheader-bs4' );
    require( 'datatables.net-responsive-bs4' );
    require( 'datatables.net-rowreorder-bs4' );
    require( 'datatables.net-scroller-bs4' );
    require( 'datatables.net-select-bs4' );
    // bs4 no js - require direct component
    // styling only packages for bs4
    require( 'datatables.net-keytable' );
    require( 'datatables.net-rowgroup' );
    // pdfMake
    var pdfMake = require('pdfmake/build/pdfmake.js');
    var pdfFonts = require('pdfmake/build/vfs_fonts.js');
    pdfMake.vfs = pdfFonts.pdfMake.vfs;
    

    网页中不需要其他代码。混合js公司

    .extract([
        'jquery', 'bootstrap-sass', 'datatables.net', 'datatables.net-bs'
    ])
    .autoload({
        jquery: ['$', 'window.jQuery', 'jQuery', 'jquery'],
        DataTable : 'datatables.net-bs'
    })
    
        3
  •  3
  •   Yevgeniy Afanasyev    6 年前

    解决方案(1)

    这就是它对我的作用:

    require('datatables.net');
    require('datatables.net-bs4');
    

    解决方案(2)

    下面是它之前的情况以及导致错误的原因:“$()。DataTable不是函数”:

    var a = require('../../../node_modules/datatables.net/js/jquery.dataTables.js');
    var b = require('../../../node_modules/datatables.net-bs4/js/dataTables.bootstrap4.js');
    

    这就是我修复它的方式,但显然建议使用顶级解决方案

    window.$.fn.DataTable = a;
    window.$.fn.DataTable = b;
    

        4
  •  2
  •   Alexander Gallego L.    5 年前

    对于我在引导中加载的所有函数:

    try {
    window.Popper = require('popper.js').default;
    window.$ = window.jQuery = require('jquery');
    
    require('bootstrap');
    
    window.JSZip = require("jszip");
    //require( "pdfmake" );
    require( 'datatables.net-bs4' );
    require( 'datatables.net-buttons-bs4' );
    require( 'datatables.net-buttons/js/buttons.colVis.js' );
    require( 'datatables.net-buttons/js/buttons.flash.js' );
    require( 'datatables.net-buttons/js/buttons.html5.js' );
    require( 'datatables.net-buttons/js/buttons.print.js' );
    require( 'datatables.net-colreorder-bs4' );
    require( 'datatables.net-fixedcolumns-bs4' );
    require( 'datatables.net-responsive-bs4' );
    require( 'datatables.net-rowreorder-bs4' );
    require( 'datatables.net-scroller-bs4' );
    require( 'datatables.net-keytable' );
    require( 'datatables.net-rowgroup' );
    
    } catch (e) {}
    

    我使用Laravel 5.7和npm 6.4.1

        5
  •  1
  •   Garrett    3 年前

    require( 'jszip' );
    

    到这个

    window.JSZip = require('jszip');
    

    之后,出现了通用的“excel”和“excelHtml5”按钮。