2017-12-04 11 views
0

IWebBrowser2 컨트롤에로드 된 문서의 DOM에 DIV와 일부 스크립트를 주입하고 있습니다. 나는 그런 식으로 주사했을 때 "진짜"스크립트 태그가 아니기 때문에 스크립트를 실행할 수 없었다."고정 된"스크립트 태그로도 스크립트가 실행되지 않습니다.

해결책을 찾았습니다. 여기 다른 질문에서 생각했습니다. 제공된 코드 (아래)는 작동하는 것처럼 보입니다. 삽입 된 모든 텍스트 태그를 createElement() 호출로 생성 된 실제 스크립트 요소로 대체합니다.

<script> 
    function nodeScriptReplace(node) 
    { 
     if (nodeScriptIs(node) === true) 
     { 
      alert("Fixing " + node.id); 
      node.parentNode.replaceChild(nodeScriptClone(node), node); 
     } 
     else 
     { 
      var i = 0; 
      var children = node.childNodes; 
      while (i < children.length) 
      { 
       nodeScriptReplace(children[i++]); 
      } 
     } 
     return node; 
    } 
    function nodeScriptIs(node) 
    { 
     return node.tagName === 'SCRIPT'; 
    } 
    function nodeScriptClone(node) 
    { 
     var script = document.createElement("script"); 
     script.text = node.innerHTML; 
     for (var i = node.attributes.length - 1; i >= 0; i--) 
     { 
      script.setAttribute(node.attributes[i].name, node.attributes[i].value); 
     } 
     return script; 
    } 
    function FixAllScripts() 
    { 
     nodeScriptReplace(document.getElementsByTagName("body")[0]); 
     return true; 
    } 
</script> 

나는 그것이 정확히 않는 확인했지만, 나는 IWebBrowser2 제어를 통해 그에 ExecuteScript()하려고 할 때, 그것은 작동하지 않습니다. 스크립트를 주입 된 블록이 아닌 원본 페이지로 옮기면 확인했습니다. 하지만 주사 된 블록을 실행하는 데 필요합니다.

주입 된 블록은 다음과 같습니다

 var el = mainBrowser.Document.GetElementById("InsertionPoint"); 
     el.InnerHtml = toInsert + el.InnerHtml + "<BR/>"; 

     var bar = mainBrowser.Document.InvokeScript("FixAllScripts"); 
     var foo = mainBrowser.Document.InvokeScript("SayHi"); 

그래서 내 HTML을 주입하고있는 "FixAllScripts"스크립트를 실행 나는 다음을 수행 컨트롤을 호스팅 내 코드에서

<table cellpadding="0" cellspacing="0" style="background-color: white;"> 
...etc' 
</table> 
<br /> 

<script id="SayHi"> 
    function SayHi() { 
     alert("Hi!"); 
     return 5; 
    } 
</script> 

"SayHi"스크립트를 수정해야하는 원본 페이지.

나는 주사 한 태그가 reaplceChild에 의해 감지되고 "수정"되었음을 확인했습니다. 그리고 아직 그들을 실행하지 않습니다.

궁극적 인 질문은 createElement()를 사용하여 만든 태그를 실행할 수없는 이유입니다. 또는 내가 할 수 있어야한다면, 내가 잘못하고있는 것입니다!

답변

0

주입 된 스크립트가 실행되지 않습니다. 이는 의도적으로 설계된 동작입니다. 당신이 할 수있는 일은 아무것도 없습니다. HTTP를 통해

  1. 로드를 :

    는 페이지에 자바 스크립트를 삽입하는 두 가지 방법이 있습니다. 예, createElement()으로 스크립트 태그를 만들 수 있지만 src 속성을 사용하여 HTTP를 통해 파일에서 스크립트를로드 할 때만 작동합니다. 스크립트 태그의 내용을 수동으로 변경하는 것은 오래 전에 보안 문제로 간주되었으며 브라우저는 넷스케이프 네비게이터에서 javascript를 원래 구현 한 이후로 허용하지 않았습니다.

  2. eval()을 사용하십시오. 예 eval은 악의이지만 스크립트 태그의 내용을 실행하려면 eval(script.innerHTML)을 수행 할 수 있습니다. 내 충고는 만약 당신이 eval을 필요로한다는 것을 알게된다면, 당신이하려고하는 것을 재평가하고 당신의 아키텍처를 재고 할 시간이다.

-2

if (nodeScriptIs(node) === true) 

항상 false returnd이 판단.