gpt4 book ai didi

c# - 导航后无法调用在注入(inject) Web 浏览器文档的代码中创建的 JavaScript 对象的方法

转载 作者:行者123 更新时间:2023-11-28 10:23:19 24 4
gpt4 key购买 nike

我发现了一些其他类似的问题,但不完全是这样,并且解决方案无法解决这个特定问题。我正在开发一个类似于 Internet Explorer 的 iMacros 的项目。这是我的简化代码:

public partial class Form1 : Form
{
public JSObject jsObject = new JSObject();
int uniqueNameEnsurer = 0;

public Form1()
{
InitializeComponent();
webBrowser1.Navigate("www.google.com");
}

private void InvokeCode(string functionCode)
{
HtmlElement head = webBrowser1.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser1.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
element.text = "function MyInjectedFunction" + uniqueNameEnsurer + "(Param){" + functionCode + "}";
head.AppendChild(scriptEl);
webBrowser1.Document.InvokeScript("MyInjectedFunction" + uniqueNameEnsurer, new object[] { jsObject });
uniqueNameEnsurer++;
}

private void button1_Click(object sender, EventArgs e)
{
InvokeCode(@"
function MyObject()
{
this.Something = 'hello';
this.SomeFunc = function(){
alert('in SomeFunc!!!');
}
}

Param.UserData = new MyObject();
");
}

private void button2_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("www.bing.com");
}

private void button3_Click(object sender, EventArgs e)
{
InvokeCode(@"
alert(Param.UserData.Something);
Param.UserData.SomeFunc();
");
}
}

[PermissionSet(SecurityAction.Demand, Name = "FullTrust")]
[System.Runtime.InteropServices.ComVisibleAttribute(true)]
public class JSObject
{
public object UserData;
}

所以,我要做的是,单击button1(调用button1_Click),然后单击button2(调用button2_Click),等待一秒钟加载,然后单击button3 (调用 button3_Click)。当我单击button3时,我收到一条警告,提示“hello”(这意味着该对象在导航后以某种方式持续存在),但紧接着,我收到一条错误,提示“无法从释放的脚本中执行代码”。这可能是某种安全问题。我发现一些帖子正在讨论,但没有一个能解决我的问题。我可以通过将 SomeFunc 创建为字符串,然后使用 eval 来解决此问题,但这是一个令人讨厌的解决方案。如果我可以对我的 C# 代码做任何事情,让 JavaScript 代码保持原样(当然,并且可以工作),那就太酷了。如果没有,最好的解决方法是什么,以便我可以在导航后调用 SomeFunc

最佳答案

这里发生了一些我不太明白的事情。首先,我不会指望调用 Navigate 后脚本会出现。一旦你导航,我认为你应该重新注入(inject)你想要的所有脚本。

其次,我没有看到“MyObject”的定义位置?我看到“new MyObject();”在你的脚本中,但我没有看到 MyObject 函数在任何地方定义,所以你的 SomeFunc() 没有定义并不让我感到惊讶。假设样本不完整。

最后,您应该考虑在 JSObject 上实现 IReflect 和 IExpando。它可能会解决您所有的问题。

关于c# - 导航后无法调用在注入(inject) Web 浏览器文档的代码中创建的 JavaScript 对象的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5009189/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com