https://xetown.com/rxe_tip/248952

 

위 팁 제공해주셔서 잘 사용하고 있습니다.

 

그런데 신규 댓글이 무조건 맨 아래 달리는 경우가 아닌 일반적인 대댓글 형식을 제공하는 경우 댓글 새로고침 후 새로운 댓글이 위쪽에 대댓글로 달렸다면 새로운 댓글이 추가된 것을 알아채기 힘든데요.

 

새로고침 후 새로운 댓글이 없다면 없음으로

있다면 새로운 댓글이 몇개라고 표시해 주면 좋을 것 같은데 복잡하고 어렵겠죠??

 

마지막 댓글의 작성 시간을 비교해서 새로 불러온 댓글의 마지막 댓글 작성 시간이 커졌더면 신규 댓글이 있다고 인식하거나

 

혹은 댓글번호를 이용할 수도 있을 것 같기도 합니다.

  • Lv19

    댓글 수를 비교하는 것도 방법일 것 같아요.

    ajax 호출 전에 기존 댓글 수를 가져오고, 호출 뒤의 댓글 수랑 비교하는...

     

    머리로만 짜봤는데 될지는 잘 모르겠습니다.

    function commentReload(target_srl) {
      var reqUrl = current_url.setQuery('mid', current_mid, 'document_srl', target_srl);
      var cmtCount = Number(jQuery('#cmtPosition').find('.ui_font b').text());
      jQuery('.loading-spinner').show();
      jQuery('.comment-reload > span').hide();
     
      jQuery.ajax ({
        url:reqUrl,
        dataType:'html',
        success: function(data) {
          var a = jQuery(data),
          b = a.find('#cmtPosition').html();
          jQuery('#cmtPosition').html(b);
        },
        complete: function() {
          var newCount = Number(jQuery('#cmtPosition').find('.ui_font b').text());
          if ( cmtCount < newCount ) {
            alert((newCount - cmtCount) + '개의 댓글이 달렸습니다');
          } else {
            alert('새로운 댓글이 없습니다');
          }
          setTimeout(function() {
            jQuery('.loading-spinner').fadeOut(); 
            jQuery('.comment-reload > span').fadeIn();
          }, 500);
        }
      });
    }

     

    위에서 새로 첨가한 아래 부분을 complete가 아니라 success에 넣어야 할지도 모르겠네요.

          var newCount = Number(jQuery('#cmtPosition').find('.ui_font b').text());
          if ( cmtCount < newCount ) {
            alert((newCount - cmtCount) + '개의 댓글이 달렸습니다');
          } else {
            alert('새로운 댓글이 없습니다');
          }

     

     

    흠, 근데 가능성은 드물겠지만 리로딩 동안 댓글이 사라지거나 하는 문제도 있겠네요.

  • Lv19 Lv30

    댓글 수는 소통이 활발한 곳에서는 삭제된 댓글로 인해 문제가 될 것 같더라구요. 저희는 물론 삭제된 댓글로 남고 그리고 댓글이 빠르게 달리고 삭제되는 곳이 아니라 상관은 없을 지도 모르겠습니다.

     

    그리고 더쿠넷을 봤더니 댓글이 없을때 알리는 것을 div로 했더라구요. 댓글수를 알려줄때는 사라지면 안되겠지만...

    신규댓글이 없다고 출력되고 사라지게 했더라구요. 이런 동작도 좋은 것 같습니다.

  • Lv19 Lv30
    작성해주신 코드 적용해 보았습니다. 신규 댓글이 없을 경우 없다고 알림창이 잘 뜨네요. 신규 댓글이 달리면 아마 그것도 잘 뜰 것 같습니다.
  • Lv19 Lv30
    방법중에 하나는...

    댓글마다 댓글 번호가 붙을텐데요..
    댓글 출력해주는 곳 어딘가에.. 마지막 댓글의 댓글번호를 기록해 놓고..


    지금 주신 코드와 비슷하게..
    댓글새로고침을 누른 순간 마지막 댓글의 댓글번호

    ajax 로 새로 가지온 데이터에서 마지막 댓글의 댓글번호 두개를 비교해서 댓글번호 값이 커졌다면 새로운 댓글이 있다고 판단 할 수도 있을 것 같습니다.

    xe에서 마지막 달린 댓글을 뽑아낼 수 있는지 잘 모르겠네요.
  • Lv30 Lv19
    앗, 그러면 스크립트단에서는
    1) 존재하는 댓글 번호를 다 수집해서 최대값 하나만 추출하고,
    2) 리로드된 댓글 번호를 다 수집해서 마찬가지로 최대값을 추출한 뒤,
    3) 양자를 비교하는 방식이어야겠네요.
    소스가 복잡해지겠습니다;;
  • Lv19 Lv30
    코어에서 마지막 작성된 댓글이라는 정보를 가지게 해주면 좋을 것 같다는 생각을 해봤습니다.
    같은 게시물에서 댓글이 계속 작성될때 마지막 작성되는 값이 이 값을 가지고 기존에 가졌던 댓글은 다시 그 값을 없애주고 하는..

    이게 꼭 필요한지는 모르겠지만 일단 이 기능이 있다면 마지막에 작성된 댓글이 어 떤 것인지 전체 댓글에서 댓글번호가 가장 큰 댓글 또는 전체댓글에서 작성된 시간이 가장 늦은 댓글 이런 것을 찾아내지 않아도 되니 말입니다.

    새로운 댓글 작성이 되었는지 확인하기 위해 이런 기능이 내장되는 것은 비효율적이겠죠....ㅡㅡ;
  • Lv19 Lv30
    이건 어떨까요??

    해당문서번호로 댓글을 조회하는 것인데요.
    작성시간순/목록 1개

    이값을 가져와 댓글보여주는 템플릿 어디에 값을 저장하구요.
    - 댓글번호를 저장하는거죠.

    이 값만 비교해서 나중에 불러온게 값이 커졌다면
    "새 댓글이 달렸습니다."

    값이 커지지 않았다면
    "새 로운 댓글이 업습니다."

    딱 갯수를 1개를 지정해서 불러오는 것이라 속도에 큰 영향을 주지 않을 것 같아서요...
  • Lv30 Lv19
    그렇게 하는 거랑 js에서 댓글 목록 취합후 최대값 추출하는 거랑, 어느 것이 더 효율적인지는 저도 판단이 잘 안 서네요;;
  • Lv19 Lv30
    JS에서 새로고침 하고 싶은 사람에게만 적용하려면 아마 JS에서 최종댓글을 판별해 내는게 좋을수도 있을 것 같습니다.

    새로운 댓글을 확인하지 않는 많은 방문자들에게는 작업이 추가되지 않을 수도 있으니 말입니다.

    장.단점이 조금씩 있긴 하지만..

    댓글 새로고침 시간이 조금 오려걸려도 추가적인 서비스라 쿤 문제는 아닐 것 같구요.
  • Lv30 Lv19

    약간 무식하긴 하지만 대강 이런 식이 될 것 같네요.

     

    function commentReload(target_srl) {
      var reqUrl = current_url.setQuery('mid', current_mid, 'document_srl', target_srl);
      var cmtSrl = getRecentCommentSrl();
      jQuery('.loading-spinner').show();
      jQuery('.comment-reload > span').hide();
      
      jQuery.ajax ({
        url:reqUrl,
        dataType:'html',
        success: function(data) {
          var a = jQuery(data),
          b = a.find('#cmtPosition').html();
          jQuery('#cmtPosition').html(b);
        },
        complete: function() {
          var newSrl = getRecentCommentSrl();
          if ( cmtSrl < newSrl ) {
            alert('새로운 댓글이 달렸습니다');
          } else {
            alert('새로운 댓글이 없습니다');
          }
          setTimeout(function() {
            jQuery('.loading-spinner').fadeOut(); 
            jQuery('.comment-reload > span').fadeIn();
          }, 500);
        }
      });
    }
    
    function getRecentCommentSrl() {
      var max = 0;
      jQuery('#cmtPosition').find('.fdb_itm').each(function() {
        max = Math.max(Number(jQuery(this).attr('id').replace('comment_', '')), max);
      });
      return max;
    }

     

    이것도 돌려보진 않고 그냥 코딩한 거여서 될지는 모르겠어요;;;

  • Lv19 Lv30
    max = Math.max(Number(jQuery(this).attr('id').replace('comment_', '')), max);
    이부분에서 에러가 난다고 콘솔에 뜨는데요.

    그리고 이전 페이지에 댓글이 새로 달려도 감지해 내는건가요?
  • Lv30 Lv19
    스크립트단이다보니 이전 페이지의 댓글을 감지하지는 못해요.
    거기까지 감안하려면 코어에서 최근 댓글 추출을 하는 함수를 제공하고, 또 이걸 exec_json으로 가져올 액션도 제공해줘야 하는데, 별도로 모듈을 개발하지 않는 한 그렇게까지는 실질적으로 어려워 보입니다;;;
    (가끔 개발자님들이 트리거, 액션 등등만 몰아서 사용하는 별도 모듈을 만들어 활용한다고 하던데 이래서 그런 건가봐요)

    에러 내용은 어떻게 되나요?
  • Lv19 Lv30
    board.js?20180903151710:679 Uncaught TypeError: Cannot read property 'replace' of undefined


    그런데 사실 저희 xe 댓글 구조가 페이지와 대댓글 구조라 새로 달린 댓글이 있는지 확인이 어려워 댓글이 추가된 것을 알려주는게 좋을 것 같아 시도해 보려고 한건데요.

    더쿠넷 처럼 무조건 아래로 새 댓글이 달리지 않는 구조 이기 때문에
    위쪽의 대댓글,이전페이지에 새댓글 등을 알려주어야 할 것 같아서요.
  • Lv30 Lv19

    댓글 리스트에 광고가 있어서 undefined 값이 들어왔군요ㅜ
    이걸로 바꿔보시죠.

     

    function getRecentCommentSrl() {
      var max = 0, cmtID;
      jQuery('#cmtPosition').find('.fdb_itm').each(function() {
        cmtID = jQuery(this).attr('id');
        if ( cmtID != '' && typeof cmtID != 'undefined' ) {
            max = Math.max(Number(cmtID.replace('comment_', '')), max);
        }
      });
      return max;
    }

     

  • Lv19 Lv30
    아.. 그런 것이 문제가 되는군요. 잘 되는 것 같습니다. 추가로 댓글이 달릴때 테스트는 저희 사이트 활동이 활발하지 않아 안될 것 같지만요 ㅋ

    추후에 댓글 출력 템플릿에
    마지막 댓글 하나만 쿼리해서 댓글번호만 변수에 담아 출력해서 그 값의 변동을 이용해서 지금 도움주신 코드에 응용을 해봐야 할 것 같습니다.

    도움 감사합니다.
  • Lv19 Lv30
    일단 템플릿에 가장 최신 댓글의 댓글번호를 변수에 담도록해서 시도해보았습니다.
    https://xetown.com/qna/1056205

    위 질문 내용대로 쿼리한 값을 변수에 담는 것이 문제 없다면 이렇게 해도 될 것 같습니다.
  • ?
    그게 잘되는군요 저는 설치후 그냥 원형이 돌기만 하면 새로운 댓글이 나타나지 않아서 포기 했는데
  • ? Lv30

    js코드에 클래스,id와 html의 클래스id가 일치한다면 안될 이유가 없습니다.

  • ?
    우아~