크롬익스텐션으로 다모앙 사이트 추가기능 직접 구현하기
이프로부족

Lv.1 이프로부족 (172.♡.33.56)

2024년 3월 29일 PM 09:34 · 수정됨(03. 30. 22:35)

조회 1,285 공감 0

안녕하세요.  클리앙에서 클리앙봇을 만들었던 이프로부족입니다.

주인장님이 바쁘신 관계로 필요한 기능은 직접 구현했는데, 필요하신 분이 계실 것 같아 공유합니다.

 

  1. User JavaScript and CSS 확장프로그램설치
    1. https://chromewebstore.google.com/detail/user-javascript-and-css/nbhcbdghjpllgmfilhnhkllmkecfmpld
  2. 다모앙사이트에서새로고침후에
  3. 주소표시줄옆의익스텐션폴더아이콘을클릭해서설치한익스텐션을클릭합니다. (자주사용하실경우고정)
  1. Rule Name, URL Pattern (https://damoang.net)  댓글 추가한소스코드를 JS 부분에붙여넣기합니다.
  1. Save 버튼이나 'Ctrl + S' 저장합니다.
  2. 다모앙사이트를새로고침합니다.

#### 현재소스코드에구현된기능 ####

  1. 목록에서글자만클릭되던영역이클릭되도록수정
  2. 게시판단축키
  3. 사이트외부링크일경우새탭에서열기
  4. 메모 기능
  5. 북마크 기능 ( initBookmark 함수내의 bookmark 내용을 원하시는 대로 변경하시면 됩니다. )

그림 첨부가 잘 안돼서 우선 텍스트로 대치합니다.

 

댓글 (10)

  • 이프로부족

    이프로부족 Lv.1 작성자

    24.03.29 · 162.♡.91.81

    // ---- 메모 기능 구현 ----

    var memos = {};

    function initMemo() {

    function addNoteToMember() {
    // .member 클래스를 가진 모든 요소를 찾습니다.
    var memberElements = document.querySelectorAll('.member');

    // 새로 추가할 HTML 내용을 문자열로 준비합니다.
    var newHtmlContent = `






    `;

    // NodeList의 각 요소에 대해 반복하여 새 HTML 내용을 추가합니다.
    memberElements.forEach(function(e) {
    var nick = e.innerText;
    e.insertAdjacentHTML('afterend', newHtmlContent);
    var memoContent = memos[nick] ?? "";
    var memoElement = e.parentElement.querySelector('.content_memo');
    memoElement.dataset.nick = nick;
    memoElement.innerText = memoContent;
    });
    }

    function updateMemoAndSave(nick, memoContent) {
    if (memoContent != null && memoContent.length > 0) {
    memos[nick] = memoContent;
    } else {
    delete memos[nick];
    }
    localStorage.setItem('memos', JSON.stringify(memos));

    // data-name 속성이 'nick'인 .content_memo 요소를 모두 찾습니다.
    var elements = document.querySelectorAll('.content_memo[data-nick="' + nick + '"]');

    // 찾은 요소들의 innerText를 'test'로 설정합니다.
    elements.forEach(function(element) {
    element.innerText = memoContent;
    });
    }

    document.addEventListener('click', function(e) {
    // 클릭된 요소가 .button_note 클래스를 가진 버튼인지 확인합니다.
    if (e.target.closest('.button_note')) {
    var nick = e.target.closest('.me-2').querySelector('.member').innerText;
    var memoContent = memos[nick] ?? "";
    var input = prompt(`[${nick}] 메모를 입력하세요.\n메모를 지우려면 빈칸으로 두세요.`, memoContent);
    updateMemoAndSave(nick, input);
    e.target.closest('.contact_note').querySelector('.content_memo').innerText = input;
    }
    });

    var storedMemos = localStorage.getItem('memos');
    if (storedMemos) {
    memos = JSON.parse(storedMemos);
    }

    addNoteToMember();
    }


    function click_title_div() {
    document.addEventListener('click', function(event) {
    // 클릭된 요소가 li.list-group-item 내의 div 요소인지 확인합니다.
    var clickedDiv = event.target.closest('li.list-group-item div');
    if (clickedDiv) {
    // 클릭된 div 내의 첫 번째 a 태그를 찾습니다.
    var link = clickedDiv.querySelector('a');
    // 해당 a 태그의 href가 존재하면 페이지를 이동시킵니다.
    if (link && link.href) {
    window.location.href = link.href;
    }
    }
    });
    }

    function open_link_new_tab() {
    document.addEventListener('click', function(event) {
    // 이벤트의 타겟이 되는 요소가 a 태그인지 확인합니다.
    var target = event.target.closest('a');

    // a 태그를 클릭했는지 확인합니다.
    if (target) {
    // 링크의 도메인을 추출합니다.
    var linkDomain = new URL(target.href).hostname;
    // 현재 페이지의 도메인을 얻습니다.
    var currentDomain = window.location.hostname;

    // 링크의 도메인이 현재 페이지의 도메인과 다른 경우
    if (linkDomain !== currentDomain) {
    // 새 탭에서 링크를 열도록 설정합니다.
    target.target = '_blank';
    // 보안을 위해 rel 속성에 noopener noreferrer 값을 추가합니다.
    target.rel = 'noopener noreferrer';

    // 기본 동작을 방지합니다. (옵셔널: 필요에 따라 제거)
    event.preventDefault();
    // 새 탭에서 링크를 강제로 엽니다.
    window.open(target.href, '_blank');
    }
    }
    });
    }

    function initBookmark() {
    const bookmark = [
    ['/free', '모두의 자게'],
    ['/development', '개발한당'],
    ['/ai', 'AI당'],
    ];

    var html = `



    `;

    for (var i=0; i < bookmark.length; i++) {
    var e = bookmark[i];

    var itemHtml = `

    `;
    html += itemHtml;
    }
    html += `

    `;

    // .na-menu .nav의 첫 번째 자식 요소를 선택합니다.
    var firstChild = document.querySelector('.na-menu .nav > :first-child');
    firstChild.insertAdjacentHTML('beforebegin', html);

    // 단축키 설정
    // 기본 도메인 설정
    const baseDomain = window.location.origin;

    document.addEventListener('keydown', function(event) {
    // 눌린 키에 해당하는 URL 경로를 Map에서 가져옵니다.
    var key = parseInt(event.key);

    if (0 < key && key < bookmark.length) {
    var path = bookmark[key-1][0];
    window.location.href = `${baseDomain}${path}`;
    }
    });
    }


    $(document).ready(function(){

    initMemo(); // 메모 기능 초기화
    initBookmark(); // 즐겨찾기 메뉴 추가

    click_title_div(); // 글 제목에서 글씨 아닌 곳 클릭해도 클릭되게 하기
    open_link_new_tab(); // 외부 사이트 링크는 새탭에서 열기

    });
  • 긍정파워

    긍정파워 Lv.1

    24.03.30 · 172.♡.223.75

    유용한 팁이네요. 감사 합니다
  • 꼬망딸레부

    꼬망딸레부 Lv.1

    24.03.30 · 162.♡.118.202

    와 필수기능 추가 너무 감사드립니다~~
    근데 알려주신대로 했는데 저는 왜 안될까요? ㅠㅠ
  • 이프로부족

    이프로부족 Lv.1 → 꼬망딸레부 작성자

    24.03.30 · 162.♡.187.7

    붙여 넣기 하는 과정에서 문제가 생겼나 보네요. 소스코드 다시 올렸습니다. 다시 한번 해보시겠어요?
  • C

    clear Lv.1

    24.03.30 · 162.♡.118.199

    임시 회원메모 기능은 너무나 아쉽게도
    브라우저 익스텐션 형식으로
    먼저 공개하신 분이 있으셔요.
    https://damoang.net/free/32855
  • 이프로부족

    이프로부족 Lv.1 → clear 작성자

    24.03.30 · 172.♡.207.162

    아 그렇군요.
    제가 쓴 방식은 소스코드를 직접 수정할 수 있어서
    다른 필요한 기능들도 직접 작성하거나, 수정 가능한 버전입니다.
  • C

    clear Lv.1 → 이프로부족

    24.03.30 · 162.♡.119.154

    노고에 항상 감사드려요.
  • 통통한새우

    통통한새우 Lv.1

    24.03.30 · 172.♡.214.200

    단축키는 이미 구현된걸로 보입니다.
    tempermonkey 스크립트로 쓰다가 아까 어떤 글 보구서 스크립트 삭제했는데도 잘 되더군요.
  • 이프로부족

    이프로부족 Lv.1 → 통통한새우 작성자

    24.03.30 · 162.♡.186.206

    그렇네요. 글 수정해 놓겠습니다.
  • 컨텍스트 Lv.1

    24.04.04 · 172.♡.119.22

    익스텐션, 감솨,

댓글을 작성하려면 이 필요합니다.