Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [AJAX][jQuery]dodanie pętli
phpuser88
post
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 4.05.2019
Skąd: PHP5.6

Ostrzeżenie: (0%)
-----


jQuery jest trudniejsze i bardziej skomplikowane niż się wydawało, a wydawało się naprawdę trudne... (IMG:style_emoticons/default/ohno-smiley.gif)
Pomijam fakt, że w sieci brak zgrabnego gotowca (jQuery, AJAX, PHP5.6) najprostszego systemu głosowania +/- 1 dla np. komentarza. (albo nie umiem szukać)

Na podstawie kilkunastu różnych kodów z Internetu zlepiłem jeden funkcjonalny skrypt, który (po kliknięciu) ma za zadanie:
1. przyznać ocenę +1 (tj. zwiększyć zawczasu, sztucznie licznik aktualnej oceny +1)
a) wysłać ID_komentarza z rodzajem_oceny(+/-) do PHP i tam po weryfikacji zrobić Update SQL (po stronie PHP brak problemów)
2. sformatować kolorystycznie kliknięty button "plus" oraz usunąć możliwość kliknięcia w button "minus" za pomocą display:none;
3. wrzucić ocenionego komentarza (tj. ID_komentarza) do localStorage, żeby user wiedział co już ocenił.
4. sprawdzić ID_komentarza z localStorage i jeśli istnieje, to sformatować kolorystycznie na stałe. (tj. do czasu usunięcia pamięci lokalnej www)

Generalnie wszystko działa dla jednego komentarza. Siedziałem nad tym dwa dni i jestem pewny, że można to zrobić znacznie lepiej, ale składnia i jej logika mnie dobija więc będę wdzięczny za naprowadzenie w jaki sposób edytować kod, aby wrzucić w jakąś (IMG:style_emoticons/default/brzydal.gif) pętle, która automatycznie pobiera i sprawdza (tj. formatuje jeśli oceniono) wszystkie wyświetlone komentarze (tj. ID_komentarza).

  1. $(document).ready(function() {
  2. $('.punkt').click(function () {
  3.  
  4. if ($(this).hasClass("current")) {
  5. // $("#1 .suma").text("Zagłosowano.");
  6. } else {
  7. var id_koment = $(this).parent("div").attr("id");
  8. var rodzaj = $(this).attr("class");
  9. var error = false;
  10.  
  11. //formatowanie
  12. if ($(this).hasClass("plus")) {
  13. $("#1 .1").css("color", "green");
  14. $("#1 .1").css("font-weight", "bold");
  15. $("#1 .0").css("display", "none");//likwiduje minusa
  16.  
  17. //plus jeden
  18. var suma = +$("#1 .sumai").val() + 1;
  19. $("#1 .sumai").val(suma);
  20.  
  21. //zapisanie na local
  22. localStorage.setItem('id_koment', id_koment);
  23.  
  24. //update
  25. $.ajax({
  26. type: "POST",
  27. url: "db.php",
  28. data: {
  29. id_koment: id_koment,
  30. rodzaj: rodzaj,
  31. csrf: <?php echo $_SESSION['key']; ?>
  32. }
  33. }).done(function (data) {
  34. console.log(data);
  35. });
  36.  
  37. }
  38.  
  39. else if($(this).hasClass("down")) {
  40. alert("głos -1");
  41. }
  42. //removes all the votes
  43. $(this).parent("div").children().removeClass("current");
  44.  
  45. if(!error) {
  46. $(this).addClass("current");
  47. } else {
  48. alert("jakis problem....");
  49. }
  50. }
  51. return false;
  52. });
  53. });
  54.  
  55. <div id="1" class="idkom1">
  56. <a class="punkt plus" href="#">
  57. <div class="1">plus +</div>
  58. </a>
  59.  
  60. <div class="suma">
  61. <input class="sumai" type="number" value="12">
  62. </div>
  63.  
  64. <a class="vote down" href="#">
  65. <div class="0">minus -</div>
  66. </a>
  67. </div>
  68.  
  69. var pobieramid = JSON.parse(localStorage.getItem("id_koment"));
  70. $("#"+pobieramid+" .plus").removeClass("plus"); //usuwam mozliwosc dodania kolejnej wartosci +1
  71. $("#"+pobieramid+" .0").css("display", "none");//likwiduje minusa
  72. $("#"+pobieramid+" .1").css("color", "red");
  73. $("#"+pobieramid+" .1").css("font-weight", "bold");
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
aras785
post
Post #2





Grupa: Zarejestrowani
Postów: 859
Pomógł: 177
Dołączył: 29.10.2009

Ostrzeżenie: (0%)
-----


Cześć,

ja bym zrobił coś takiego: https://jsfiddle.net/nh584c7f/

  1. <div data-comment-id="1" data-element="comment" class="comment">
  2. <a class="comment_button" href="#" data-action="up">
  3. <div class="1">plus +</div>
  4. </a>
  5. <div class="suma">
  6. <input class="sumai" type="number" value="1">
  7. </div>
  8.  
  9. <a class="comment_button" href="#" data-action="down">
  10. <div class="0">minus -</div>
  11. </a>
  12. </div>
  13. <div data-comment-id="2" data-element="comment" class="comment">
  14. <a class="comment_button" href="#" data-action="up">
  15. <div class="1">plus +</div>
  16. </a>
  17. <div class="suma">
  18. <input class="sumai" type="number" value="1">
  19. </div>
  20.  
  21. <a class="comment_button" href="#" data-action="down">
  22. <div class="0">minus -</div>
  23. </a>
  24. </div>
  25. <div data-comment-id="3" data-element="comment" class="comment">
  26. <a class="comment_button" href="#" data-action="up">
  27. <div class="1">plus +</div>
  28. </a>
  29. <div class="suma">
  30. <input class="sumai" type="number" value="1">
  31. </div>
  32.  
  33. <a class="comment_button" href="#" data-action="down">
  34. <div class="0">minus -</div>
  35. </a>
  36. </div>


  1. .comment {
  2. background: #ccc;
  3. padding: 10px;
  4. margin-bottom: 20px;
  5. }
  6.  
  7. .commented [data-action] {
  8. font-weight: bold;
  9. color: green;
  10. }
  11.  
  12. .commented__down [data-action="up"] {
  13. display: none;
  14. }
  15.  
  16. .commented__up [data-action="down"] {
  17. display: none;
  18. }


Kod
$(document).ready(function() {
  //$('[data-element="comment"]:not(.commented) [data-action]') - coś mi ten not nie działa stąd IF niżej
  $('[data-element="comment"] [data-action]').off('click').on('click', function(commentEvent) {
    commentEvent.preventDefault();

    let currentComment = $(this).closest('[data-element="comment"]');

    if (!currentComment.hasClass('commented')) {
      let action = $(this).attr('data-action');

      //tutaj tymczosow zmieniamy liczbę ocen
      currentComment.find('input').val(parseInt(currentComment.find('input').val()) + (('up' === action) ? 1 : -1));
      currentComment.addClass('commented').addClass('commented__'+action);

      $.ajax({
        type: "POST",
        url: "https://httpbin.org/post",
        data: {
          id_koment: currentComment.attr('data-comment-id'),
          rodzaj: action,
          csrf: 'test'
        }
      }).done(function(data) {
        //zatwierdzamy liczbę ocen z danymi z backendu
        //currentComment.find('input').val(data);
        addCommentToLocalStorage(currentComment.attr('data-comment-id'), action);
      });
    }
  });
});

if (getCommentFromLocalStorage()) {
    $.each(getCommentFromLocalStorage(), function(index, comment) {
      $('[data-element="comment"][data-comment-id="'+comment.commentId+'"]')
        .addClass('commented')
        .addClass('commented__'+comment.action);
  });
}

function getCommentFromLocalStorage() {
  return JSON.parse(localStorage.getItem("id_koment"));
}


function addCommentToLocalStorage(commentId, action) {
  let comments = getCommentFromLocalStorage();
  if (comments === null) {
    comments = [{'action': action, 'commentId': commentId}];
  } else if (!comments.includes(commentId)) {
    comments.push({'action': action, 'commentId': commentId});
  }

  localStorage.setItem("id_koment", JSON.stringify(comments));
}





Pozdrawiam

Ten post edytował aras785 6.05.2022, 23:30:52
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 17.10.2025 - 18:54