Javascript WebBrowser到Gecko:注入Java脚本

Javascript WebBrowser到Gecko:注入Java脚本,javascript,webbrowser-control,gecko,Javascript,Webbrowser Control,Gecko,我正在尝试将使用WebBrowser控件的应用程序移植到Gecko。 我唯一无法管理的就是javascript注入来访问刚刚下载的页面的全局变量。 例如,如果javascript是: function get_players() { strout = "no data"; try { if (players_ar == null) return "Javascript error: players_ar is null";

我正在尝试将使用WebBrowser控件的应用程序移植到Gecko。 我唯一无法管理的就是javascript注入来访问刚刚下载的页面的全局变量。 例如,如果javascript是:

function get_players()
{
    strout = "no data";
    try
    {
        if (players_ar == null) 
            return "Javascript error: players_ar is null";
        else
            return players_ar[0]["fp"];
    }
    catch (err)
    {
        strout += ";Javascript error = " + err;
    }

    return strout;
}
players_ar是一个变量(数组),它在我刚刚加载到浏览器的页面中是全局的。将脚本文本保存在变量函数_text中,并使用WebBrowser按如下方式调用脚本:

HtmlElement head = webBrowser.Document.GetElementsByTagName("head")[0];
HtmlElement scriptEl = webBrowser.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)scriptEl.DomElement;
element.text = function_text;
HtmlElement res = head.AppendChild(scriptEl);
pl_data = (string)webBrowser.Document.InvokeScript("get_players");
我成功地返回了players\u ar元素的值。 对Gecko进行同样的操作并不成功:

GeckoHtmlElement head = webBrowser.Document.GetElementsByTagName("head")[0];
GeckoElement scriptEl = webBrowser.Document.CreateElement("script");

nsIDOMHTMLScriptElement element = (Gecko.nsIDOMHTMLScriptElement)scriptEl.DOMElement;
element.SetTextAttribute(new nsAString(Resources.players_loader));
GeckoNode res = head.AppendChild(scriptEl);

using (var java = new AutoJSContext(GlobalJSContextHolder.BackstageJSContext))
{
    string result;
    const string javascript =
        @"
        function get_players()
        {
            strout = 'no data';
            try
            {
                if (players_ar == null)
                    return 'Javascript error: players_ar is null';
                else
                    return players_ar[0]['fp'];
            }
            catch (err)
            {
                strout += ';Javascript error = ' + err;
            }

            return strout;
        }
        get_players();
        ";

    if (java.EvaluateScript(javascript, (nsISupports)webBrowser.Document.DomObject, out result))
    {
        MessageBox.Show(String.Format("javascript returned '{0}'", result));
    }
}
在这种情况下,返回的值是:“no data;Javascript error=ReferenceError:players\u ar not defined”,这意味着它会阻止检查player\u ar是否为null,因为根本没有声明变量

我想知道Gecko的行为是否与IE有所不同,也许第一个浏览器在加载页面后并没有保存可变的环境。
请帮忙,我没有主意了。

经过一周的尝试,结果证明我使用了错误的函数。它仍然是EvaluateScript,但我不知道为什么这个原型可以工作而另一个不能工作。我直接向geckofx的伙计们询问,为了帮助其他面临同样问题的人,我发布了他们的回复(感谢Andrey Filippov)。 这方面的代码如下(它实际上可以工作,因此也经过了测试):


经过一周的尝试,结果证明我使用了错误的函数。它仍然是EvaluateScript,但我不知道为什么这个原型可以工作而另一个不能工作。我直接向geckofx的伙计们询问,为了帮助其他面临同样问题的人,我发布了他们的回复(感谢Andrey Filippov)。 这方面的代码如下(它实际上可以工作,因此也经过了测试):


经过一周的尝试,结果证明我使用了错误的函数。它仍然是EvaluateScript,但我不知道为什么这个原型可以工作而另一个不能工作。我直接向geckofx的伙计们询问,为了帮助其他面临同样问题的人,我发布了他们的回复(感谢Andrey Filippov)。 这方面的代码如下(它实际上可以工作,因此也经过了测试):


经过一周的尝试,结果证明我使用了错误的函数。它仍然是EvaluateScript,但我不知道为什么这个原型可以工作而另一个不能工作。我直接向geckofx的伙计们询问,为了帮助其他面临同样问题的人,我发布了他们的回复(感谢Andrey Filippov)。 这方面的代码如下(它实际上可以工作,因此也经过了测试):


可能是因为更新。它现在的用法如下:
webBrowser.Window
,而不是
webBrowser.Window.JSContext
。可能是由于更新。它现在的用法如下:
webBrowser.Window
,而不是
webBrowser.Window.JSContext
。可能是由于更新。它现在的用法如下:
webBrowser.Window
,而不是
webBrowser.Window.JSContext
。可能是由于更新。它现在的用法如下:
webBrowser.Window
,而不是
webBrowser.Window.JSContext
const string function_text =
    @"
        function get_players()
        {
            strout = 'no data';
            try
            {
                strout += ';clubname = ' + this.screenX;

                if (players_ar == null)
                    return 'Javascript error: players_ar is null';
                else
                    return players_ar[0]['fp'];
            }
            catch (err)
            {
                strout += ';Javascript error = ' + err;
            }

            return strout;
        }                    
        ";

GeckoElement scriptEl = webBrowser.Document.CreateElement("script");

scriptEl.TextContent = function_text;
GeckoNode res = webBrowser.Document.Head.AppendChild(scriptEl);

using (var java = new AutoJSContext(webBrowser.Window.JSContext))
{
    JsVal result = java.EvaluateScript("get_players()", webBrowser.Window.DomWindow);
    MessageBox.Show(result.ToString());
}