2017-12-04 9 views
0

IWebBrowser2コントロールに読み込まれたドキュメントのDOMにDIVとスクリプトを挿入しています。私はスクリプトを実行することができませんでした。なぜなら、そういう形で注入されると、実際のスクリプトタグではないからです。"fixed"スクリプトタグでもスクリプトが実行されません

私は解決策を見つけました、または私は考えました、ここでは別の質問で。コード化された(以下の)コードは機能しているようです。つまり、挿入されたテキストタグのすべてを、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()しようとすると、それは動作しません。私はそれを確認しました - 私がそのスクリプトを注入されたブロックではなく元のページに移動すると動作します。しかし、私はそれを注入ブロックを実行する必要があります。

注入されたブロックは、次のようになります。私は、次の手順を実行コントロールをホストする私のコードで

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

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

 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」スクリプトを実行します"SayHi"スクリプトを修正する元のページ。

私が注射したタグが検出され、reaplceChildによって「修正」されたことを確認しました。しかし、それらを実行することは何もしません。

究極の質問は、createElement()で作成されたタグを実行できないか、できなければならないことです。

答えて

0

注入スクリプトは実行されません。これは設計によるものです。あなたができることは何もありません。

ページにJavaScriptを注入するだけで、2つの方法があります

  1. は、HTTP経由でそれをロードしますが。はい、createElement()でスクリプトタグを作成できますが、src属性を使用してHTTP経由でファイルからスクリプトを読み込む場合にのみ機能します。スクリプトタグの内容を手動で変更することは、以前はセキュリティ上の問題と考えられていました.Netscape Navigatorでjavascriptを元々実装して以来、これまでに許可されたブラウザはありませんでした。

  2. eval()を使用してください。はいevalは悪ですが、eval(script.innerHTML)を実行してスクリプトタグの内容を実行することができます。私のアドバイスは、あなた自身がevalを必要としていることが分かった場合、あなたがしようとしていることを再評価し、あなたのアーキテクチャを再考する時です。

-2

この判断

if (nodeScriptIs(node) === true) 

は常にfalseをreturnd。

関連する問題