После AJAX-вызова мой JS-код не загружается, пока я не обновлю страницу

#javascript #jquery #ajax #laravel

#javascript #jquery #ajax #laravel

Вопрос:

Итак, у меня есть проект в Laravel, я добавил фильтры, и он отлично фильтрует продукты. Однако, когда товары фильтруются, мои кнопки добавления в корзину перестают отвечать. После проверки отображаемого кода в браузере я понял, что JS не был загружен. Однако, если я вручную обновлю страницу (или обновлю в коде с location.reload() помощью), тогда это сработает. Однако я хочу избежать ручного обновления, потому что тогда я потеряю класс цвета, добавленный к кнопке, чтобы показать, что ее активный фильтр.

Ниже приведен код для моего файла продукта, который загружает продукты в цикл for из контроллера:

products.blade.php

 <div class="container">

    <!--Grid row-->
    <div class="row">
    @foreach ($products as $p)
            <div class="col-lg-3">
                <div class="container">
                    <form action="{{ route('cart.add', $p->id) }}" data-id="{{ $p->id }}" id="addtocart">
                        <div class="row">
                            <h5>{{ $p -> name }}</h5>
                            <button type="button" id="submit" class="button has-shadow is-danger submit is-small">
                                    Add to Cart
                            </button>
                        </div>
                    </form>
                </div>
            </div>
        @endforeach
    </div>

    <div class="container">
        {{ $products ->appends($request->query()) -> links() }}
    </div>

</div>
                  
  

products_show.blade.php — Где находится JS и куда загружается указанный выше файл. Проблема возникает после $('body').on('click', '.btn-filter' вызова.

 @extends ('layouts.app')

@section ('content')

    <div class="box text-right">
        <div class="row">
            <button type="button" name="filter[]" value="Jackets" id="filterJackets" class="button is-info btn-filter">Jackets</button>
            <button type="button" name="filter[]" value="Hoodies" id="filterHoodies" class="button is-info btn-filter">Hoodies</button>
        </div>
    </div>

    <section class="products">
        @include('product.products')
    </section>

@endsection


    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script type="text/javascript">

        $(document).ready(function () {

            $(document)
                .ajaxStart(function () {
                    $("#modal").show();
                })
                .ajaxStop(function () {
                    $("#modal").hide();
                });
            $.ajaxSetup({
                headers: {
                    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                }
            });


            // Pagination
            $('body').on('click', '.pagination a', function(e) {

                var url = $(this).attr('href');

                $.ajax({
                    url : url
                }).done(function (data) {
                    $('.products').html(data);
                }).fail(function () {
                    alert('Products could not be loaded.');
                });

                window.history.pushState("", "", url);
            });



            // Add to cart
            $(".submit").click(function (e) {
                e.preventDefault();
                var p_id = $(this).closest("form").data('id');
                var product_id = $("#product_id").val();
                
                var url = $(this).closest('form').attr('action');

                $.ajax({
                    url:url,
                    method:'POST',
                    data:{
                        product_id:product_id
                    },
                    success:function(response){
                        console.log("added to cart success");
                    },
                });
            });



            $('body').off('click', '.btn-filter', function(e) {
                $(this).removeClass("is-success");
            });

            $(".btn-filter").hover(function(){
                $(this).addClass("is-danger");
            }, function(){
                    $(this).removeClass("is-danger");
            });



            var filters = [];

            $('body').on('click', '.btn-filter', function(e) {
                e.preventDefault();
                $(this).toggleClass('is-success');

                filters = []; // reset
                
                $('button[name="filter[]"]').each(function()
                {
                    if ($(this).hasClass("is-success")) {
                        filters.push($(this).val());
                    }
                });

                var url = '{{ route('products.type') }}' '?filter[storage]=' filters

                $.ajax({
                    url : url
                }).done(function (data) {
                    $('.products').html(data);
                }).fail(function () {
                    alert('Products could not be loaded.');
                });

                window.history.pushState("", "", url);

            });

        });
    </script>
  

Я не уверен, имеет ли значение php-код, потому что проблема здесь в том, что кнопка добавления в корзину JS не вызывается, но здесь это так или иначе:

 public function filterByType(Request $request){
        $products = QueryBuilder::for(Auth::user()->products())
            ->allowedFilters(['type'])->paginate()
            ->appends(request()->query());

        // Check if request is from ajax
        if ($request->ajax()) {
            return view('product.products', ['products' => $products])->render();
        }

        return view('product.products_show', compact('products'));

    }
  

Спасибо.

Комментарии:

1. куда вы поместили свой скрипт? я думаю, вам нужно push включить js layouts.app ..

Ответ №1:

Итак, я нашел способ сделать это, однако есть ли лучшее решение или способ исправить мою проблему? И то, что я здесь сделал, плохо?:

Я добавил location.reload() в конец btn-filter щелчка, который перезагрузит страницу, поскольку перезагрузка страницы устраняет проблему для меня.

Затем я добавил приведенный ниже код в начало скрипта:

 var window_url = window.location.href;
var url_filter_params = window_url.substr(window_url.indexOf("=")   1)
var filter_params_array = url_filter_params.split(',');

$('button[name="filter[]"]').each(function()
{
    if ($.inArray($(this).val(), filter_params_array) >= 0){
        $(this).addClass('is-success');
    }
});
  

Это в основном возвращает URL-адрес, анализирует его, чтобы получить параметры, а затем показывает, добавляет класс is-warning обратно к кнопке, чтобы она отображалась как выбранная. Фильтры также работают.