Ошибка типа: $ (...). DataTable не является функцией: DataTable не работает без $ .noConflict (true) - PullRequest
0 голосов
/ 07 сентября 2018

Я только что обнаружил DataTables , и я играю с этим. Задача страницы состоит в том, чтобы искать сообщения на основе параметров клиента, возвращая JSON, который заполняет таблицу в любое время без перезагрузки страницы. Проблема, с которой я сталкиваюсь:

  • TypeError: $(...).dataTable is not a function. jQuery (идеально) загружен до Плагин DataTables (идеально) загружен. jQuery не загружается дважды (если DataTables не загружает jQuery самостоятельно, но я так не думаю). enter image description here Порядок загрузки правильный. Я использую Laravel, и jQuery загружается как первый скрипт на каждой странице, в layouts/app.blade.php. Все представления расширяют этот макет, и конкретные сценарии каждого представления загружаются после в @section('scripts').

  • Я нашел этот ответ и позвонил $.noConflict(true) перед тем, как позвонить $('#results').DataTable(). Теперь плагин работает нормально, но все остальное, связанное с jQuery, возвращает $ is not a function (особенно новые вызовы $ .ajax).

Я хочу понять, почему выбрасывается TypeError: $(...).dataTable is not a function, и решить эту проблему, не используя $.noConflict(true).

У кого-нибудь есть идеи?

Порядок загрузки скриптов:

layouts/app.blade.php

<!-- Scripts -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>
<script src="{{ asset('js/admin/main.js') }}"></script>

@yield('scripts')

index.blade.php

@extends('layouts.app')
@section('scripts')
    <script src="//cdn.jsdelivr.net/npm/flatpickr"></script>
    <script src="//cdn.datatables.net/1.10.18/js/jquery.dataTables.min.js"></script>
    <script src="{{ secure_asset('js/helpers.js') }}"></script>
    <script src="{{ secure_asset('js/admin/Values.js') }}"></script>
    <script src="{{ secure_asset('js/SVGTools.js') }}"></script>
    <script src="{{ secure_asset('js/admin/Search.js') }}"></script>
    <script src="{{ secure_asset('js/admin/Delete.js') }}"></script>
    <script src="{{ secure_asset('js/admin/blog/post/PostSearch.js') }}"></script>
    <script src="{{ secure_asset('js/admin/blog/post/index.behaviour.js') }}"></script>
@endsection

Вот часть кода, которая отображает данные в таблицу (в PostSearch.js):

this.search = function () {
    var getData = function () {
        var v = new Values();
        v.collect('getValue');
        console.log(v.getCollection.raw);

        return v.getCollection.raw;
    };

    /**
     * Display the data into the table.
     *
     * @param {Object} data
     * @param {Function} callback
     */
    var displayData = function (data, callback) {
        if ( ! data.length ) {
            //  No result
            document.getElementById('no-result').innerText = 'Nessun risultato per "'+document.getElementById('search').value+'"';
        } else {
            //  Yes results
            document.getElementById('no-result').innerText = "";

            // $.noConflict(true);
            $('#results').DataTable( {
                "ordering": true,
                "data": data,
                "searching": true,
                "columns": [
                    {'data':'id'},
                    {'data':'title'},
                    {'data':'category'},
                    {'data':'article'},
                    {'data':'likes'},
                    {'data':'status'},
                    {'data':'publication_datetime'},
                    {'data':'id'}
                ]
            });
        }

        callback();
    };

    /**
     * Empty the table.
     */
    var emptyData = function () {
        document.getElementsByTagName('tbody')[0].innerHTML = '';
    };

    new Search({
        events: {
            "click": document.getElementById('search')
        },
        url: function () {
            return route_resource_admin_blog('posts', 'show', 'search')
        },
        data: function () {
            return getData();
        },
        clear: function () {
            emptyData();
        },
        previousStuff: function (target, searchTerm) {

        },
        successCallback: function (data, textStatus, jqXHR) {
            console.log('SUCCESS');
            displayData(data, function () {

            });
        },
        errorCallback: function (jqXHR, textStatus, errorThrown) {

        },
        beforeSend: function (jqXHR, settings) {

        },
        complete: function (jqXHR, textStatus) {

        }
    });
};

1 Ответ

0 голосов
/ 08 сентября 2018

Хотя, к сожалению, я не нашел причину проблемы, использование jQuery.noConflict() вместо $.noConflict() делает скрипт работающим правильно, без следующего $ псевдонима сбоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...