5

웹 사이트 측에서 실행되는 foo() JavaScript 함수와 동적으로 생성 된 인수 arg1,...,arg5이 포함 된 다음 앵커 태그가 있습니다. id 값과 argN 값 독특한와, 해당 페이지에 걸쳐 이러한 앵커 태그의 몇 가지가 있습니다 : 나는 프로그래밍 인수를 찾고,이 요소에 대한 모든 안타 통해 반복하여 foo() 기능을 발사하려는 Greasemonkey, Chrome 및 unsafeWindow.foo()

<a href="#" id="foo1234567890" onclick="javascript:foo(arg1,arg2,arg3,arg4,arg5);return false;" target="_self" title="foobarbaz"> blah </a> 

그 인수를 Greasemonkey의 unsafeWindow.function(args) 호출에 전달합니다. 나는이 스크립트를 설치하고 실행하면

function removeAllProperties() { 
    var xpath = "//A[@title='foobarbaz']"; 
    var actionNodes = document.evaluate(
            xpath, 
            document, 
            null, 
            XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 
            null 
            ); 
    var total = actionNodes.snapshotLength; 

    for (var i=0; i < total; i++) { 
     var candidate = actionNodes.snapshotItem(i); 
     //alert(candidate.nodeName);                                                              
     if (candidate.nodeName === "A") { 
      var onclick_value = candidate.getAttribute('onclick'); 
      var needle = /javascript:foo\((.*)\);return false\;/; 
      onclick_value.match(needle); 
      //alert(onclick_value);                                                              
      //alert(RegExp.$1);                                                               
      var script_args = RegExp.$1; 
      if (confirm(script_args)) { 
       unsafeWindow.foo(script_args); 
      } 
     } 
    } 
} 

removeAllProperties(); 

, 내가 인수 arg1,...,arg5와 경고를 얻을 :

여기에 내가 지금까지 쓴 그리스 몽키 스크립트입니다. 내가 확인을 클릭하면, 나는 OS의 X에 대한 구글 크롬 5.0.375.125에서 다음과 같은 오류가 발생합니다 : 문제

Uncaught TypeError: Object [object DOMWindow] has no method 'foo' 

웹 페이지는 확실히 foo()있다 - 나는 blah를 클릭하면 다음 onclick 이벤트는 foo()를 트리거합니다. 이 Greasemonkey 스크립트를 통해 작업 할 수 없습니다.

unsafeWindow.function(args)을 잘못 사용하고 있습니까? 아니면 Google 크롬이 원격 JavaScript 기능을 트리거하는이 방법을 지원하지 않습니까?

이 함수를 사용해야하는 다른 방법이 있습니까? 아니면 다른 방법을 사용해야합니까?

귀하의 조언에 감사드립니다.

답변

11

Chrome에서는 사용자 스크립트 컨텍스트 (페이지 here 참조)에서 콘텐츠 페이지에 정의 된 변수/기능에 액세스 할 수 없습니다.

unsafeWindow.foo을 호출하는 대신 루프에서 candidate.onclick()을 호출 할 수 있습니다.

즉 당신이 location에 JS-URI를

var s = document.createElement("script"); 
s.innerHTML = "foo("+ script_args + ")"; 
document.body.appendChild(s); 

같은 것을 사용하여 DOM에 함수 호출을 주입하거나 할당해야 하나, 원하는없는 경우 :

location.assign("javascript:foo(" + script_args +");void 0"); 
+0

건배 , 매우 감사! –