我正在尝试将使用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是一个变量(数组),它在我刚刚加载到浏览器中的页面中是全局的。将脚本文本保存在变量function_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_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_ar is not defined",这意味着它在检查player_ar是否为null时阻塞,因为该变量根本没有声明。
我想知道Gecko的行为是不同于IE的,也许第一个浏览器在加载页面后没有保存变量环境。请帮帮忙,我没办法了。
发布于 2015-11-09 05:01:23
经过一周的尝试,我发现我用错了函数。它仍然是EvaluateScript,但我不知道为什么这个原型可以工作,而另一个不能工作。我直接向geckofx的人请求帮助其他面临同样问题的人,我贴出了他们的回复(感谢Andrey Filippov)。代码如下所示(它实际上是可以工作的,所以它也经过了测试):
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());
}https://stackoverflow.com/questions/33489972
复制相似问题