2013-06-29 6 views
3

이 스크립트는 온라인 상점에서 결제 프로세스를 지원합니다. 프로그램을 처음 실행하기 위해 페이지를 새로 고칠 필요가 있다는 것을 제외하면 모두 올바르게 작동합니다.스크립트 스크립트를 실행하려면 페이지를 새로 고쳐야합니까?

이전에 본 다른 제품에서 작동하기 때문에 캐시 문제인지 궁금합니다. 나는 또한 아무 소용이 @run-at와 땜질을 시도했다. 나는 Scriptish 확장자를 사용하고 있으며 독립형 .js 파일입니다.

// ==UserScript== 
// @id    proper-id 
// @name   proper-name 
// @version  1.0 
// @namespace  
// @description  
// @include  proper-url-here 
// @include about:blank 
// @run-at window-load 
// ==/UserScript== 

for (var i=0; i<document.getElementsByName("skuAndSize")[0].length; i++){ 
    if(document.getElementsByName("skuAndSize")[0].options[i].text == 11) { 
     document.getElementsByName("skuAndSize")[0].selectedIndex = i; 
    } 
} 
document.getElementsByClassName("button-container add-to-cart")[0].click(); 

왜이 사용자 스크립트는 새로 고침에서만 실행됩니까?

답변

1

이것은 AJAX를 통해 콘텐츠를 변경하는 페이지의 고전적인 문제입니다.
@run-at은 대상 콘텐트가 창 load 이벤트 이후에 오래로드되기 때문에 아무런 효과가 없습니다. 그리고 "새로운"페이지는 AJAX를 통해 완전히 다시 작성됩니다. 적어도 페이지를 새로 고칠 때까지.

변경 @run-at document-end에 스크립트 (또는 생략 선)과는, 대상 페이지와 어떻게 당신이 그것을 사용에 따라서는 "I have to refresh the page for my Greasemonkey script to run?"에 표시 또는 this other answer과 같이 hashchange의 해고 충분히있을 수 있습니다.

이동 도구는 waitForKeyElementsMore info입니다.

// ==UserScript== 
// @name  _YOUR_SCRIPT_NAME 
// @include http://YOUR_SERVER.COM/YOUR_PATH/* 
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js 
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js 
// ==/UserScript== 

waitForKeyElements ("[name='skuAndSize']", setSizeIndex); 
waitForKeyElements (".button-container.add-to-cart", clickAddToCart); 

function setSizeIndex (jNode) { 
    var node = jNode[0]; 
    for (var J = node.options.length - 1; J >= 0; --J) { 
     if (node.options[J].text == "11") { 
      node.selectedIndex = J; 
      break; 
     } 
    } 
} 

function clickAddToCart (jNode) { 
    var clickEvent = document.createEvent ('MouseEvents'); 
    clickEvent.initEvent ('click', true, true); 
    jNode[0].dispatchEvent (clickEvent); 
} 


참조, 또한, "Choosing and activating the right controls on an AJAX-driven site" : 스크립트는 다음과 같이 간단 할 수 있습니다.

+0

고마워요! 이것은 매력 같이 작동했다; 좋은 설명과 모두 부팅합니다. =) 나는 방금 jQuery와 함께 가야만했다. 나는 또한 addEventListener()의 라인을 따라 무언가가 par를 구현할 수 있다고 생각했다. 다시 한 번 감사드립니다! – zweed4u

+0

여러분을 환영합니다! 기꺼이 도와주세요. –