2009-08-14 7 views
1

읽은 블로그에는 성가신 의견 작성자가 있습니다. 나는 Greasemonkey에서 손을 떼어 내고 그들을 껐을 것이라고 생각했습니다.Greasemonkey를 사용하여 목록 요소 제거

되는 HTML의 기본 구조는 간단합니다 - 코멘트는 다음과 같은 :이 탈락 할 때까지, 나는 잠시 동안 키보드에 대한 내 머리를 강타 염두에와

<li> 
    <cite>user name ...</cite> 
    comment text 
</li> 

그래서

:

var killlist = /user1|user2/; 

var comments = document.getElementsByTagName('li'); 

if (comments.length) { 
    for (var i = 0; i < comments.length; i ++) { 
    var comment = comments[i]; 
    var cites = comment.getElementsByTagName('cite'); 
    if (cites.length) { 
     var cite = cites[0]; 
     var title = cite.textContent; 
     if (killlist.test(title)) { 
     comment.parentNode.removeChild(comment); 
     } 
    } 
    } 
} 

window.alert('Done!') 

합니다 (window.alert 그래서 나는 스크립트가 실행을 완료 알고 그냥)

대부분 작품. 예 : 한 테스트 페이지에서 사용자 중 한 명이 16 개의 게시물 중 13 개를 제거했습니다. 나는이과에서 removeChild 라인을 교체 시도 :

모든 것을 얻을 것으로 나타나지만 의견이 있었을 것이다 큰 빈 공간을 남겨의 비용
comment.style.visibility = 'hidden'; 

.

저는 완전한 자바 스크립트 초보자입니다. 그렇다면 누구나 명백하게 볼 수있는 것은 틀린 것입니까?

답변

1

당신은 루프에 대한 당신의 순서를 반대로 먼저 코멘트를 배열의 끝에서 요소를 삭제하여 문제를 해결할 수있을 것입니다 :

for (var i = comments.length - 1; i >= 0; i--) 
+0

그게 문제가 될지 궁금해했는데, 그래서 내가 코멘트를 삭제하고 frrom 그것을 삭제하지만, 아무 소용이 배열을 만들려고했는데. 그러나 이것은 지금까지 유망한 것으로 보인다! 나는 조금 더 시험 할 것이고, 그 다음 되돌아 올 것이다. –

3

당신이보고있는 동작은 인해 comments가되는 것입니다 live NodeList. DOM에서 comments이 참조하는 요소를 제거하면 comments이 변경되고 해당 length이 업데이트되고 루프가 창 밖으로 나옵니다.

할 수 있습니다 @Pat 제안, 또는 먼저 복사 작업으로 DOM에서 NodeList "을 풉니 다"로 역순으로 루프 :

var comments = Array.slice(document.getElementsByTagName('li')); 

그런 다음 이전 진행합니다.

관련 문제