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

标签 c# javascript dom browser

我发现了一些其他类似的问题,但不完全是这样,并且解决方案无法解决这个特定问题。我正在开发一个类似于 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/

相关文章:

c# - 当其他应用程序的用户登录问题 C# 时用户注销

c# - Active Directory 中的 userAccountControl

javascript - VBA - 使用 IE 自动化处理 Javascript 弹出窗口

javascript - 生成器函数未添加到 DOM 的元素

javascript - 如何blit DOM?

javascript比较两个DOM树

c# - 使用 Azure B2C 进行 .NET 核心 JWT 验证

javascript - postgres : relation does not exist when the table clearly exists when calling from node. js

javascript - 如何将数组中的所有数字转换为相应的月份?

c# - 如何使用 Bootstrap 控件更改个人资料图片