2011-12-16 4 views
0

다음 Greasemonkey 스크립트를 만들어 모든 웹 사이트에서 Firefox에서 실행했습니다. 여기 스크립트가 있습니다. 이 스크립트는 기본적으로 페이지의 모든 링크를 가져 와서 링크 수를 알려줍니다. 이것은 내가 작업하고있는 프로젝트의 작은 부분입니다.Greasemonkey 스크립트가 Reddit에서 예상대로 작동하지 않습니다.

window.addEventListener("load", function(e) { 
      var links = window.document.getElementsByTagName("a"); 
      //window.setTimeout(function(){alert(links.length);},3000); 
      alert(links.length); 
     }, false); 

스크립트는 일부 웹 사이트에 대한 좋은 실행,하지만 난 reddit을 액세스 할 때 스크립트 대신 페이지에있는 모든 링크의 만 2 링크를 반환합니다. 페이지에 divs을 검색하려고 시도했을 때도 2 만 반환되었습니다.

내가 페이지 소스를 조사했을 때 인라인 자바 스크립트와 관련된 것이있었습니다. 그러나 나는 그것을 완벽하게 이해할 수 없었다. 아무도 왜이 작동하지 않습니다 도와 줄래?

감사합니다, 시드

+1

는 레딧 가장 가능성이 아약스를 통해 컨텐츠를로드하는 것입니다. 따라서 페이지가로드되면 실제 내용이 나중에로드됩니다. 따라서 타이밍 문제로 인해 스크립트가 누락됩니다. – mrtsherman

+0

@mrtsherman 나는 페이지 소스가 그렇게 보이지 않는다고 생각한다. 나는 모든 것이 페이지로드에로드된다는 것을 확신합니다. 나는 주석 처리 된 코드가 제안한 것처럼 타임 아웃을 사용해 보았다. 그것은 잘 작동하지 않았다. – Sid

+1

표시된 코드는 Reddit에서 완벽하게 작동합니다. 당신이 우리에게 보여주지 않는 ** ** 문제입니다. 문제가있는 * exact * 페이지에 대한 전체 스크립트와 링크를 제공하십시오. –

답변

1

그것은 AJAX 콘텐츠 하중이어야한다. 디버거에서 코드를 실행하면 잘 동작합니다. 따라서 유일한 설명은 load 이벤트 이후에 콘텐츠가 존재하지 않는다는 것입니다. 타임 아웃 (추한,하지만 이건 내 포인트를 증명해야한다)에 그것을 포장 해보십시오.

setTimeout(testLinks, 3000); 

function testLinks() { 
    window.addEventListener("load", function(e) { 
     var links = window.document.getElementsByTagName("a"); 
     //window.setTimeout(function(){alert(links.length);},3000); 
     alert(links.length); 
    }, false); 

} 

이제 문제가 무엇인지 알았으므로이 SO 질문의 지침에 따라 AJAX 이벤트 수신기를 만들 수 있습니다. 그런 다음 새 콘텐츠가로드 될 때마다 링크 수를 다시 계산할 수 있습니다.

JavaScript detect an AJAX event

+0

자세한 설명을 주셔서 감사합니다. 그러나 스크립트 실행을 방해하는 클라이언트 측에서 응용 프로그램이 사용했을 수있는 보안 조치에 대해 생각할 수 있습니까? 나는 단지 궁금하다. – Sid

+1

이것은 보안 조치가 아니며 페이지가 작동하는 방식입니다. 스크립트가 완벽하게 실행됩니다. 문제는 콘텐츠가 아직 존재하지 않는다는 것입니다. 페이지가로드 된 후 서버에 비동기 요청이 수행됩니다. 이렇게하면 더 많은 내용을 검색하고 페이지로 동적으로로드합니다. 불행히도 이번에는 자바 스크립트가 이미 실행되었습니다. 따라서 데이터로드 이벤트를 감지하고 각 이벤트에 대한 링크 수를 다시 계산해야합니다. – mrtsherman

+0

자세한 설명을 주셔서 감사합니다. – Sid

관련 문제