2012-06-09 2 views
5

나는 GM의 개념을 좋아하지만, 실제로 사용하지 않는 한 절대적인 JS 신은 사용할 수 없다 (어쩌면 그냥 빨아 먹을 까?).Greasemonkey의 단순한 대체품

몇 줄의 JS를 가져 와서 특정 사이트에 대한 페이지로드 이후에 실행하는 작은 확장자를 갖는 것이 유용 할 것입니다. 그러나 그것은 GM이하는 것이 아닙니다. GM을 사용하면 성가신 보안 문제와 범위의 레이어에 여러 프레임과 레이어를 처리해야합니다. 적절한 절차를 무시하고 unsafewindow 또는 다른 해킹 중 하나를 사용하는 경우에도 종종 작동하지 않습니다.

당신이 원하는 것을 할 수있는 브라우저 콘솔에서 실행할 수있는 JS를 작성하는 것은 쉽지만, 이것은 사용자 스크립트로 전송할 때 절대로 작동하지 않습니다. greasemonkey에서 내가 변경할 수있는 설정이 있습니까, 아니면 사용 용이성을 고려한 다른 확장이 있습니까?

참고 : Chrome을 사용하므로 특정 브라우저에서 작동하는 솔루션에 보너스 포인트가 적용됩니다.

요약 : 특정 페이지의 콘솔과 동일한 범위/권한으로 스크립트를 자동으로 실행하는 방법이 필요합니다.

+3

[북마크] (http://en.wikipedia.org/wiki/Bookmarklet). 또한 http://www.bookmarklets.com/과 [Stackapps 사이트] (http://stackapps.com/)를 비롯한 많은 다른 사이트를 참조하십시오. –

+0

아, 그렇습니다. 이것들은 많은 경우에 유용 할 것이지만, userscripts는 사용자가 원하는 페이지에서 자동으로 실행한다는 점에서 매우 좋습니다. – Jonathon

+0

그래, jsFiddle [ "깔끔한"북마크릿] (http://blog.jsfiddle.net/post/413517861/a-tidy-up-bookmarklet)은 특히 유용합니다. –

답변

7

Firefox의 Greasemonkey 나 사용자 JS를 자동으로 실행하는 Chrome의 사용자 스크립트에 대한 간단한 대안이 없습니다. 당신은 write your own extension/add-on 일 수 있지만, 그다지 요점은 없을 것입니다.

GM과 userscripts가 제공하는 놀라운 추가 기능에 신경 쓰지 않고 특정 사이트의 페이지로드 이후에 JS의 몇 줄을 "(가져 와서) 실행 (실행)하고 싶을 때" @run-at document-start이 (크롬 위해) 필요하다고

// ==UserScript== 
// @name _Base template for simple, cross-browser, JS injection. 
// @match *://YOUR_SERVER.COM/YOUR_PATH/* 
// @run-at document-start 
// ==/UserScript== 

if (window.top != window.self) //-- Don't run on frames or iframes. 
    return; 


function scriptMain() { 
    // PUT ALL OF YOUR CODE HERE, INCLUDING ANY FUNCTIONS YOU CREATE. 
    console.log ("Hello World!"); 
} 

window.addEventListener ("load", scriptMainLoader, false); 

function scriptMainLoader() { 
    addJS_Node (null, null, scriptMain); 
} 

function addJS_Node (text, s_URL, funcToRun) { 
    var D         = document; 
    var scriptNode       = D.createElement ('script'); 
    scriptNode.type       = "text/javascript"; 
    if (text)  scriptNode.textContent = text; 
    if (s_URL)  scriptNode.src   = s_URL; 
    if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()'; 

    var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement; 
    targ.appendChild (scriptNode); 
} 

참고하지만 코드는 여전히 문서 부하에서 발생합니다 : iframe을, 그럼 당신의 모든 스크립트에 대한 기본 템플릿으로 다음 코드를 사용합니다.

+0

그래, 내가 해결 방법 (안전하지 않은 ..., 주입 및 주소 표시 줄 사용) 실제 상황에서는 아무 것도 작동하지 않습니다. 내 상황에 따라 다르지 않습니다. "$ Acb.close ('Ad160x600_0', InboxPage.onSkyscraperClose);" hotmail.com에서 (더 많은 화면 공간을 제공하기 위해 자동 광고 링크를 클릭하십시오.) 매번 콘솔에서 완벽하게 작동합니다. – Jonathon

+1

당신의 "더 간단한"대안은 같은 방식으로 실패 할 것입니다. 이 페이지에는 원하는 기능을 사용하기 전에 AJAX 지연이 있습니다."콘솔에서 작동"하면 페이지가로드 된 후 몇 초 후에 실행되기 때문입니다. 솔루션은 타이머를 사용하여 추가로 2 초 (또는 오랜 시간이 소요됨)를 기다리거나 [이 답변] (http://stackoverflow.com/a)의 두 번째 부분에서와 같이 대상 코드를 폴링하는 것입니다./6935777/331508). AJAX 지연은 항상 페이지 별 세부 정보에 크게 의존합니다. 더 간단한 접근법은 없습니다. –

+0

간단한 스크립트 작업을하기 위해 한 시간을 보냈습니다. 너는 신의 선물이다. – muhammedabuali