2017-11-24 11 views
3

Firefox 57 및 Greasemonkey 4에 대한 업데이트로 인해 많은 사용자 스크립트가 손상되었습니다. 어떤 스크립트에서 나는 다음을 사용했다 :Greasemonkey 4에서 DOM 코드를 어떻게 실행할 수 있습니까?

document.addEventListener('DOMContentLoaded', doStuff, false); 

이것은 Greasemonkey에서 더 이상 작동하지 않는다. DOMContentLoaded 이벤트를 추가하는 적절한 방법은 무엇입니까?

P. 이벤트를 등록 할 때 DOM이 아직 준비되지 않았 음을 확인했습니다. 난 아직도 모르는

답변

2

은 무엇 그리스 몽키 4 준비 DOM에서 코드를 실행하는 권장 방법이지만, 이후 변경 :

document.addEventListener('DOMContentLoaded', doStuff, false); 

에 :

window.addEventListener('load', doStuff, false); 

내 스크립트가 다시 작동합니다. 방금이 answer을 기반으로 다른 방법을 테스트하기 시작했습니다. jQuery 기반 사용자 스크립트가 여전히 작동하고있는 것으로 나타 났으므로 (적어도 DOM 준비 부분에서 그렇습니다).

이 답변은 일종의 분명한 일이지만, 질문을 작성하는 시점에 Greasemonkey (모든 비동기 항목에 대해 읽음)의 변경 사항을 따라 잡고 있는지 확실하지 않았고 DOMContentLoaded이 작동하기를 기대했습니다. .

+0

'@ run-at document-end'을 사용해 보셨습니까? – peterh

1

Greasemonkey와 버전 4로 업그레이드 한 후 나는 비슷한 문제로 실행,하지만 난 대신

addEventListener("DOMContentLoaded", function(){ 
    // … 
}); 

을 사용했다.

내 사용자 스크립트를 해결하기 위해 노력

, 나는 처음에 그 래퍼 주석과 metadata block

// @run-at document-end 

을 넣어. 이 방법을 통해 DOM이 준비되었고 원래 DOMContentLoaded 래퍼 내에 있던 코드가 올바르게 실행되도록했습니다.

그러나 실제로 페이지 스크립트가 을 실행하기 전에 JavaScript를 실행해야하는 내 사용자 스크립트 중 두 개가 DOM 준비가되었을 때 다른 코드를 실행하는 데는 효과적이었습니다. 이제 당신이 필요이 작업을하기 위해 DOMContentLoaded 래퍼 위해서는 메타 데이터 블록에

// @run-at document-start 

을 넣어 것으로 밝혀 당신의 window (또는 document).

이전 버전의 GreaseMonkey에서는 이것을 생략하고 정상적으로 실행할 수있었습니다.

그러나 GreaseSpot Wiki에 따르면 document-start은 추가 기능의 WebExtensions 다시 쓰기에서 비동기 실행 또는 누락 된 기능으로 인해 GreaseMonkey 4.0에서 작동하지 않을 수 있습니다.

또한, document.readyStatedocument-start"loading"하지만 "interactive"document-end와 비슷하게 // @run-at 전혀 될 것입니다.

+0

흥미 롭습니다!나를 위해, 트릭은 그냥 addEventListener 함수를 제거하는 것이 었습니다. 익명의 함수 내부에있는 내용을 복사하여 붙여 넣었습니다. 또한 @ run-at set도 없습니다. 이전 버전의 Greasemonkey에서는 addEventListener 함수를 사용해야했지만 이제는 생략 된 모든 항목과 함께 작동합니다. – Yani2000

+0

@ Yani2000 저도 저에게 도움이되었지만 DOM이로드되기 전과 실행되기 전에 실행되는 코드를 구별 할 필요가없는 일부 스크립트에만 해당되었습니다. – Xufox