jQuery 1.6.3이있는 페이지에서 Greasemonkey 스크립트를 사용하여 마우스 클릭에 반응하는 링크를 얻으려고합니다.
흥미로운 부분은 다음과 같습니다.
// ==UserScript==
// […]
// @grant GM_getValue
// @grant GM_setValue
// @grant GM_deleteValue
// @grant unsafeWindow
// ==/UserScript==
if (typeof $ == 'undefined') {
var $ = unsafeWindow.jQuery;
if (typeof $ == 'undefined') {
console.log('jQuery could not be loaded, script will not work.');
}
}
[…]
document.addEventListener("DOMContentLoaded", function(event) {
console.log('DOM content loaded.');
if (settings.firstRun) {
console.log('Creating welcome window.');
var hi = $('<div>This is a welcome message. Click the OK link to hide it forever. </div>');
var ok = $('<a href="javascript:void(0)" id="okay">OK</a>');
hi.append(ok);
// el is from earlier
el.append(hi);
console.log('Binding click event.');
ok.click(function(event) { // DOES NOT WORK
event.preventDefault();
alert('you clicked OK');
});
console.log('Bound.');
}
[…]
});
내 코드는 Tampermonkey / Chrome에서 제대로 작동하지만 (이벤트를 바인딩하기 전에 DOM에 요소를 삽입하지 않더라도) Greasemonkey / Firefox에서는 작동하지 않습니다.
이제 콘솔 메시지가 '바인딩 클릭 이벤트'까지 바로 가기 때문에 스크립트가 주입되고 jQuery가로드된다는 것을 알고 있습니다. 표시되고 요소가 DOM에 올바르게 삽입되고 있습니다. 그러나 스크립트는 클릭 바인딩에서 딸꾹질을하고 오류 메시지없이 실행을 중지합니다.
일반 JS를 사용할 때 작동합니다.
document.getElementById('okay').onclick = function(){ alert('you clicked OK'); };
Firebug 콘솔에서도 작동합니다.이 명령을 실행하면 올바른 결과가 생성됩니다.
$('#okay').click(function(){ alert('you clicked OK'); });
평범한 JS를 사용할 수는 있지만 일관성 수준을 유지하고 싶고 문제를 이해할 수 없다는 것도 짜증이납니다. 내가 무엇을 놓치고 있습니까?
Firefox의 브라우저 콘솔 ( ControlShiftJ)을 보면 다음과 같은 오류가 표시됩니다.
오류 : 'handler'속성 jquery.min.js : 2에 대한 액세스 권한이 거부되었습니다.
이는 더 이상 페이지의 jQuery에 그런 방식으로 액세스 할 수 없기 때문 입니다 (완전히 "시간 폭탄"오류없이).
일반적으로 사용자 스크립트에 대해 @require
jQuery 를 사용하는 것이 가장 좋으며 모든 종류의 교활한 충돌 문제를 피하는 것이 @grant
좋습니다 none
. 특히 .
참고 :
을 사용하는 것은 의미가 없습니다 document.addEventListener("DOMContentLoaded" ...
.
을 설정하지 않으면 @run-at document-start
스크립트는 기본적으로 jQuery가 준비된 시점에서 실행됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다