2012-10-31 1 views
1

다른 사람 없다 '정의되지 않은' http://store.steampowered.com/agecheck/app/16730/. store.steampowered.com "birthtime"쿠키가있는 경우이 페이지는 자동으로 게임으로 건너 뜁니다. 먼저 쿠키를 삭제해야 할 수 있습니다.양식 숙박 시설은 어떤 상황에서 오류하지만 자동으로 스팀 연령 확인 페이지를지나 저를 이동하려면 다음 그리스 몽키 스크립트를 만들었습니다

이 greasemonkey 스크립트가 Windows XP에서 실행되는 Firefox 17.0 (베타)에 설치되면 제대로 작동합니다.

그런 다음 최신 FF (16)를 실행중인 Windows 7 컴퓨터에 스크립트를 설치했습니다. 이 시스템에서는 form.ageDay에 액세스 할 때 스크립트가 중단됩니다. 오류 콘솔을 보여줍니다

Error: form.ageDay is undefined 

심지어 낯선 불구하고, 나는 단순히 그것을 파이어 폭스 스크래치 패드 (Shift + F4)에 내 스크립트를 붙여 실행하면, 그것을 찾아 작품과 양식을 제출하는 것입니다.

어떻게 XP에서 GM 스크립트가 작동하고 Win7에서 스크립트가 스크래치 패드에서 작동하지만 Win7에서 스크립트가 GM에서 작동하지 않을 수 있습니까?

또 다른 이상한 점은 Win7 컴퓨터에서 Firebug를 활성화하면 var form에 'ageDay'속성이 명확하게 있지만 시계식이 정의되지 않은 것을 반환합니까?

enter image description here

+0

폼 요소를 액세스 이렇게 아주 오래된 것입니다 ("DOM 레벨 0"). 어쩌면 GM (부분적으로?)이 지원을 중단 했나요? 나는 모르겠다. 단지 추측이다. – bfavaretto

+0

나는 GM 스크립트에 익숙하지 않지만 DOM이 준비되기 전에 실행될 수 있습니까? 즉, 양식이 실제로 아직로드를 완료하지 않았습니까? – Matt

+0

@Matt GreaseMonkey 스크립트 자체는'DOMContentLoaded'에서 실행됩니다 : http://wiki.greasespot.net/DOMContentLoaded – Alain

답변

1

그 코드는 Windows XP 또는 Windows 7 않으며해야 하나에 나를 위해 작동하지 않습니다. GM 스크립트는 (일반적으로) 그런 이름의 서식 객체를 사용할 수 없습니다. Greasemonkey Pitfall: Named Forms and Form Elements을 참조하십시오.

해당 양식 요소를 가져 오는 데 샌드 박스 안전 (그리고보다 강력한) 방법을 사용하십시오. 예 : querySelector(). 이 스크립트는 링크 된 페이지에서 나를 위해 작동 :

// ==UserScript== 
// @name  _delme 677 
// @include  http://store.steampowered.com/agecheck/* 
// @grant  GM_xmlhttpRequest 
// ==/UserScript== 

//Mini script for doing steam age checks automatically 
if (/agecheck/i.test (location.pathname)) { 
    var ageForm = document.querySelector ("#agegate_box form"); 
    ageForm.querySelector ("[name='ageDay']").value  = 18; 
    ageForm.querySelector ("[name='ageMonth']").value = 'August'; 
    ageForm.querySelector ("[name='ageYear']").value = 1987; 
    ageForm.submit(); 
} 

참고 : 그것이 GM 샌드 박스에 의해 분리되지 않기 때문에

  1. 파이어 폭스 스크래치가했다.
  2. Windows XP에서 작동하는 것처럼 보이는 이유는 아마 우연일지도 모릅니다. XP에서는 나에게 적합하지 않으므로 안됩니다.

    특정 @grant none 시나리오의 경우 해당 종류의 코드가 작동 할 수도 있습니다. 많은 경우에 @grant none이 적용됩니다 (문서를 참조하십시오).

    작동중인 스크립트 버전이 두 개 이상이거나 FF가 손상되어 다시 시작해야 할 수도 있습니다.

    결론은 그런 식으로 코딩하지 마십시오.

  3. but the watch expression returns undefined? ... 그건 직장에서 샌드 박스 격리 일 뿐이며, XP에서는 나에게도 똑같이 보입니다.

  4. 코드, 그것은 확실히이 질문에의 매개 변수 내에서 작동하는 거의 모든 사용자가 발생할 수있는 페이지 및 에서 작동합니다 querySelector()를 사용하여 위있다. 하지만 현재 일부 에서 작동하지 않습니다. HTML5 양식 및 일부 일부 사이트에서 사용하던 것으로 추정되는 일부 HTML.

    두 경우 모두 위에서 잘못된 링크에 언급 된 코드가 유효하지 않은 HTML 또는 최첨단 HTML5에도 불구하고 제안 된 기능에도 불구하고 작동합니다. 구체적

    이 코드 종류 querySelector 같은하면서 유연하지 (그들이 잘못 HTML을하더라도) 시나리오 넓은 세트 일 것이다

    if (/agecheck/i.test (location.pathname)) { 
        var ageForm = document.querySelector ("#agegate_box form"); 
        ageForm.elements.namedItem ('ageDay').value  = 18; 
        ageForm.elements.namedItem ('ageMonth').value = 'August'; 
        ageForm.elements.namedItem ('ageYear').value = 1987; 
        ageForm.submit(); 
    } 
    
+1

완료했습니다. 솔루션, 설명 및 아름다운 코드를 찾아 주셔서 대단히 감사합니다. 나는 자바 스크립트를 쓰는 날 4 일 뿐이므로 저를 위해 3 가지 새로운 것들이 있습니다 : p – Alain

+0

당신은 환영합니다; 기꺼이 도와주세요. –

+0

어 ... 올바른 방법은'ageForm.elements.namedItem ('ageDay')'입니다. 'querySelector'를 사용하면 모든 경우에 실패합니다 ... –

관련 문제