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()で作成されたタグを実行できないか、できなければならないことです。