#javascript #php #jquery #ajax #laravel
#javascript #php #jquery #ajax #laravel
Вопрос:
У меня есть панель уведомлений, и когда пользователь нажимает крестик, чтобы удалить уведомление, я хочу, чтобы обновился только DIV, чтобы он выбросил старое уведомление и обновился текущими, вот что у меня есть сейчас, оно обновляется, но все данные исчезают и не показывают ничего, кроме поля.
Скриншоты
Перед:
После:
HTML
<div id="messageboxcon">
@php
$usersid2 = Auth::id();
$usersalert2 = DB::table('notifications')->where('userid', $usersid2)->orderBy('created_at', 'desc')->get();
@endphp
<h3 style="color: gray;
font-weight: 100;
float: left;
margin-left: 15px;
margin-top -50px;">
Notifications : {{count($usersalert2)}}
</h3>
<div class="notificationcontainer">
@php
$usersid = Auth::id();
$usersalert = DB::table('notifications')->where('userid', $usersid)->orderBy('created_at', 'desc')->get();
@endphp
@if(count($usersalert) > 0)
@foreach ($usersalert as $item)
<div class="notification">
<h2 class="notiftitle">{{$item->type}}</h2>
<h3>{{$item->message}}</h3>
<a class="removenotif" data-id="{{$item->id}}" data-token="{{ csrf_token() }}"><i class="crossnotif fas fa-times fa-sm"></i></a>
</div>
@endforeach
@endif
</div>
</div>
JavaScript
$(".removenotif").click(function(ev){
var id = $(this).data("id");
var token = $(this).data("token");
$.ajax({
url: 'deletenotif/' id,
type: 'DELETE',
dataType: 'JSON',
data: {
"id":id,
"_method": 'DELETE',
"_token": token,
},
success: function (data) {
console.log("it worked");
$('#messageboxcon').load(document.URL ' #messageboxcon');
},
error: function (data) {
alert(data);
}
});
Комментарии:
1. Перезагрузите новые данные в
success
Ответ №1:
При успешном обратном вызове я бы использовал функцию jQuery .parents()
.
В контексте функции обработчика события click $(this)
представляет «элемент уведомления о закрытии».
Вам нужно удалить <div>
с notification
классом.
Поэтому я бы сделал что-то вроде $(this).parents('.notification').remove()
.
Я не уверен, чего вы пытаетесь достичь с помощью этого:
$('#messageboxcon').load(document.URL ' #messageboxcon');
Это загрузит всю веб-страницу в messageboxcon <div>
, чего вы не хотите достичь.
Если вы хотите обновить содержимое, выполните вызов AJAX, получая только HTML для уведомлений.
Просто создайте страницу (notifications.php ) на стороне сервера это делает именно то, что вы делаете изначально:
@php
$usersid = Auth::id();
$usersalert = DB::table('notifications')->where('userid', $usersid)->orderBy('created_at', 'desc')->get();
@endphp
@if(count($usersalert) > 0)
@foreach ($usersalert as $item)
<div class="notification">
<h2 class="notiftitle">{{$item->type}}</h2>
<h3>{{$item->message}}</h3>
<a class="removenotif" data-id="{{$item->id}}" data-token="{{ csrf_token() }}"><i class="crossnotif fas fa-times fa-sm"></i></a>
</div>
@endforeach
@endif
Затем при успешном обратном вызове вы удаляете уведомление, которое пользователь хочет удалить для немедленной обратной связи. А затем выполнить вызов AJAX для обновления уведомлений чем-то подобным:
$('#notificationcontainer').load('notifications.php')
Комментарии:
1. Привет, я создал notifications.blade.php в папке layouts. Я включил его, но при выполнении $(‘#notificationcontainer’).load(‘notifications.php ‘) Как мне его найти? Не очень разбираетесь в Javascript? так что все, что угодно, очень поможет! 🙂
2. The notifications.php это просто пример. Я не знаю, какой PHP-фреймворк вы используете, но на самом деле это не имеет значения. И вам не нужно иметь опыт работы с Javascript. Вы используете систему шаблонов (blade), но вам нужно понять, как ссылаться на это представление из вашего браузера. Знаете ли вы, какой URL приведет к отображению этого фрагмента HTML в вашем браузере?
3. Я создал функцию для обновления содержимого, цикл будет выполняться только один раз, если у меня есть 3 уведомления, я могу удалить любое из 3, но при попытке удалить второе ничего не произойдет. Даже в консоли ничего не отображается? знаете ли вы, почему?
4. Я думаю, да, но это действительно зависит от того, что вы сделали, и я этого не вижу. Если вы имеете в виду, что когда содержимое обновляется с помощью вызова AJAX, вы больше не можете удалить уведомление, это нормально. Вам нужно применить обработчик кликов к новым элементам. Когда вы загружаете страницу в первый раз и выполняете
$(".removenotif").click(<function>)
, это будет применяться только к элементам на странице. При динамическом обновлении содержимого к новым.removenotif
элементам не будет прикреплен обработчик кликов.5. Исправлено, пришлось изменить событие click на $(document).on(‘click’, ‘.removenotif’, функция (ev){
Ответ №2:
в случае успеха сделайте что-то вроде $("#item-" id).remove();
Комментарии:
1. Насколько я могу видеть, нет элементов с такими идентификаторами, поэтому в текущей форме это не сработало бы.
2. он может легко добавить это.
3. Ответ должен содержать надлежащий пример кода с надлежащим описанием. Простая публикация небольшого фрагмента кода, который даже не будет работать без дополнительных изменений (о которых даже не упоминается), не является подходящим примером. Помните, что мы понятия не имеем, насколько опытен OP или будущие посетители. Не думайте, что они поймут, что еще нужно изменить.
Ответ №3:
измените эту строку
$('#messageboxcon').load(document.URL ' #messageboxcon');
для этого :
$('#messageboxcon').load(document.URL '#messageboxcon');
в вашем успешном коде.у вас появилось дополнительное пространство
Ответ №4:
Вам нужно создать новую функцию javascript, в которой вы будете получать данные из таблицы уведомлений. Функция должна выглядеть следующим образом:
function updateContent(){
$.ajax({
url: 'n.php',
type: 'GET',
success: function (data) {
console.log("get recent data in HTML");
$('.notificationcontainer').html(data);
},
error: function (data) {
console.log(data);
}
});
}
И, код, который находится в n.php файл
@php
$usersid = Auth::id();
$usersalert = DB::table('notifications')->where('userid', $usersid)->orderBy('created_at', 'desc')->get();
@endphp
@if(count($usersalert) > 0)
@foreach ($usersalert as $item)
<div class="notification">
<h2 class="notiftitle">{{$item->type}}</h2>
<h3>{{$item->message}}</h3>
<a class="removenotif" data-id="{{$item->id}}" data-token="{{ csrf_token() }}"><i class="crossnotif fas fa-times fa-sm"></i></a>
</div>
@endforeach
@endif
Теперь просто вызовите эту функцию javascript в методе успеха removenotif click следующим образом —
updateContent();
Комментарии:
1. Это отлично сработало!, но это работает только для первого элемента цикла. Если у меня есть 3 уведомления, я могу удалить любое из 3, которые я хочу, но вызов ajax не будет выполняться во второй раз?
Ответ №5:
Создайте дубликат контейнера уведомлений в другом файле, допустим, нет.php Затем создайте новый Ajax с URL в виде not.php Затем используйте идентификатор контейнера уведомлений, чтобы получить данные jquery. Таким образом, это будет похоже на обновление.
Затем создайте кнопку, которая будет выполнять новый jQuery, созданный вами при событии click.
Итак, что вы сделаете, так это то, что после того, как ваш предыдущий jQuery удалил уведомление, вы сделаете так, чтобы оно вызывало щелчок даже по новой кнопке, чтобы вам не приходилось нажимать ее вручную. Это заменит старый контейнер уведомлений на новый.
Не забудьте связать файл jQuery add, если кто-то может захотеть добавить код jQuery в новый файл, то есть not.php в противном случае это сработает только один раз, поскольку он не получит никакого ajax для использования, если вы также не разместите его там
Комментарии:
1. Привет, я попробовал это, и это сработало, но вызов ajax выполняется один раз, скажем, у меня есть 4 уведомления, я могу удалить одно из четырех и обновить его, но при попытке удалить второе ничего не происходит, я могу обновить страницу и удалить другую, но я не могу просмотреть их и удалить их все без обновления страницы. Спасибо за ваш ответ знаете ли вы что-нибудь об этом? 🙁 приветствия
2. Вам также нужно будет поместить код обновления jQuery в not.php также. Проверьте мой отредактированный ответ
3. Свяжите файл jQuery is с новым файлом not.php также