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()를 사용하여 만든 태그를 실행할 수없는 이유입니다. 또는 내가 할 수 있어야한다면, 내가 잘못하고있는 것입니다!