我使用C#编写了使用WebBrowser
编写的网页抓取应用程序。
其中一个功能是让用户编写一个将在网页中注入和调用的javascript函数。这是一个用户制作的函数,它接收一个C#对象作为参数,其中包含一个名为UserData
的属性,用户可以使用该属性存储他想要的任何内容,即使在浏览器导航后它也会保留在那里到另一页。它还包含一个Browser
对象,我将在这里作为示例使用。
如果我在安装IE8时注入并调用了以下函数:
function ToBeInjected(Global)
{
function Data()
{
this.csObject = Global.Browser;
this.jsObject = "hi";
}
Global.UserData = new Data();
}
然后导航到另一个页面并注入并调用此函数:
function ToBeInjected(Global)
{
alert(Global.UserData.jsObject); // works ok on IE8 and IE9 (shows "hi")
alert(Global.UserData.csObject); // works on IE8 (show the object's type) but not IE9 ("Permission Denied" error)
}
第二个alert
将正常工作,并向我显示我的Browser
对象的类型(此处传递的Global
对象与前一个函数是同一个对象)。
我知道浏览器导航后存在的对象可能看起来很奇怪,但确实如此,并且它始终存在并且从未出现过问题,我的应用程序将此作为功能使用。
但是现在我刚刚安装了IE9,并且对象仍然存在,但是在UserData
是一个包含指针的javascript对象(Data
对象)的特殊情况下(或者你会把它叫做外部C#对象(Browser
对象),我得到一个“Permission Denied”javascript错误。 (如果我不在同一页面中导航并运行这两个脚本,则它在两个IE版本上都能正常工作。)
我知道我的例子没用,但它只是一个样本。在其他情况下,使用包含指向外部C#对象的对象的javascript对象是有用的。
所以,即使这是一个超级特殊的问题,你有什么建议我可以做些什么来解决它或为什么我在IE9中遇到这个问题?
答案 0 :(得分:0)
听起来您希望数据在页面之间保持不变。您是否考虑过以下任何一种情况:
将用户数据存储为Cookie。在后续页面加载中重新阅读它们
使用window.external托管C#代码中持续存在于页面之间的对象。