2013-08-31 6 views
0

DOMContentLoaded 문서가로드되고 스크립트가 실행 된 후 실행되고 스크립트가 실행되기 전에 코드를 실행하고 싶지만 이후에 document.body.outerHTML (document.childNodes[document.childNodes.length-1].outerHTML) 가득 javascript 이벤트 : 문서가 텍스트로 완전히로드되었지만 스크립트가 아직 실행되지 않은 경우 가져 오기

나는 이것을 시도하지만, 여러 번 후 나는 200ms의 작업 mycode을 실행하기 전에 타이머를 할 이제도 발견 실행처럼 보이지만 내가 타이머없이 그것을 할 싶습니다

var observer = new MutationObserver(function(mutations) 
{ 
    if(document.body && document.childNodes[document.childNodes.length-1].outerHTML.lastIndexOf("</html>")!=-1) 
    { 
     observer.disconnect(); 
     mycode(); 
    } 
}); 
observer.observe(document, {subtree: true, childList: true}); 

Chrome에서 작업해야 함 (여기서 beforescriptexecuted 이벤트는 작동하지 않음)

답변

0

당신은 그렇게 할 수 없습니다. 스크립트는 즉시 실행되므로 문서가 완전히로드되기 전에 실행됩니다.

+0

그래서 위에 게시 된 내 메소드 (코드)를 고수해야합니까? (쓰레기와 코드 위의 코드가 거의 즉시 열리는 페이지 이후 10 초 이내에 DOMContentLoaded가 실행될 수 있습니다.) – Owyn

+0

@Owyn : 사용중인 스크립트가 요청한 것을 수행하지 않기 때문에 아니오. 'html' 요소는 전체 문서가로드되기 전에 끝 태그를 가지며, 시작 태그에서 끝 태그를 가져옵니다. 요소는 시작과 끝 태그에 대한 별도의 객체가 아닌 단일 객체이므로 요소에 대해 OuterHTML을 얻으면 항상 끝 태그가 생깁니다. DOMContentLoaded 이벤트가 나중에 발생하는 이유는 현재 코드가 너무 이른. 또한 문서가 생성 될 때부터 문서가 업데이트 될 때마다 여러 번 실행되는 이유이기도합니다. – Guffa

+0

정상적인 상황에서 나는 단지 몇 ms의 settimeout을 사용해야하고 firefox + noscript 사용자 (settimeout은 작동하지 않는다)에 모든 mutation을 실행시킨 채로두고 (문서에 충분한 내용이 있는지 확인) 제거하지만 제거해야한다. – Owyn

1

"텍스트"가로드 된 후에 다른 j보다 먼저 실행하려면 페이지 맨 아래에서 모든 j를 실행해야합니다 (즉, btw, 제안 된 모범 사례) 그리고 당신이 필요로하는 무엇이든을 실행하십시오. 맨 위에 가장 먼저 달려야합니다.

js는 매우 동시 적입니다. 즉, 많은 일들이 동시에 일어나고 있다는 것을 의미합니다. 따라서 첫 번째 코드를 하나의 익명 함수 및 다른 모든 것을 다른 함수에서 처리하므로 먼저 실행됩니다.

귀하의 document.ready도 anon f가 될 수 있습니다.

+0

그게 좋은 생각 같아요,하지만 필자는 userscript 공간에서 코드를 실행하고 있습니다 - javascript로 이벤트를 발생 시켜서 내 userscript가 그것을 선택하고 (자체적으로 후크로) 자신의 공간에서 코드를 실행하도록 할 수 있습니까? ? – Owyn

+0

jsfiddle에서 mi 샘플 코드를 제공한다면 몇 가지 추가 아이디어를 줄 수 있습니다 ... 일반적으로 첫 번째 anon에서 원하는 메소드에 대한 특정 사용자 스크립트 공간을 확장하고 와드 직후에 만든 특정 메소드를 실행해야합니다. 그 일을하고 anon f가 끝나면 즉시 전역 범위에서 제거됩니다 ... – Rastko

+0

샘플 코드 : http://jsfiddle.net/muPaS – Owyn