【问题标题】:Custom functions unavailable from BrowserInteropHelper.HostScript in an XBAPXBAP 中的 BrowserInteropHelper.HostScript 无法使用自定义函数
【发布时间】:2011-10-27 20:18:13
【问题描述】:

我正在尝试使用 XBAP 来获取 TWAIN 图像,但我什至没有走那么远。我似乎无法让 BrowserInteropHelper.HostScript 让我与主机页面上的 javascript 对话。

  • 我在 iframe 中运行 XBAP。
  • 我尝试了完全信任(尽管这应该是一项要求)。
  • 我正在 IE9、.NET Framework 4.0 上进行测试
  • BrowserInteropHelper.HostScript 不为空,我可以使用普通的窗口方法,如 .Close()。

我的代码如下所示:

索引.html:

<p id="someP">My cat's breath smells like cat food.</p>

<script type="text/javascript">
    function WorkDamnit() {
        $('#someP').hide();
    }
</script>

<iframe src="@Url.Content("~/XBAPs/WPFBrowserApplication1.xbap")" style="border: none;" width="500" height="500" />

Page1.xaml.cs:

private void Button_Click(object sender, RoutedEventArgs e)
{
    if (BrowserInteropHelper.HostScript == null)
        throw new ApplicationException("hostscript is null");
    else
        BrowserInteropHelper.HostScript.WorkDamnit();
}

我明白了:

System.MissingMethodException: Method '[object Window].WorkDamnit' not found.

新信息:

此方案在网络上的其他 PC 上正常工作,我发现了原因。 IE9 有一个默认开启的设置,叫做“在兼容性视图中显示 Intranet 站点”。这会导致页面以“IE7 模式”呈现,并且 javascript 函数可从 XBAP 获得。如果我单击文档模式:(在 F12 开发人员工具控制台下)并切换到 IE9 模式,则它不再起作用(如上所述)。在我自己的 PC 上,它默认使用 IE9 模式(应该如此),除非我手动切换到 IE7 模式,否则它不起作用。

【问题讨论】:

    标签: c# javascript xbap


    【解决方案1】:

    在IE9中,你可以使用窗口方法,所以你可以试试setTimeout

    BrowserInteropHelper.HostScript.setTimeout("WorkDamnit()",0);
    

    【讨论】:

      【解决方案2】:

      这是由于 IE 安全设​​置。 如果页面是从本地驱动器打开的,IE 默认会阻止脚本。 IE 应将警告消息显示为“'为了帮助保护您的安全,Internet Explorer 已限制...”

      但是您可以更改设置
      选中复选框“允许活动内容在我的电脑上的文件中运行”

      【讨论】:

      • 选中此选项不起作用,但它在此处的其他一些工作站(Win7/IE9 和 XP/IE8)上工作,因此您可能走在正确的轨道上。我只是希望我的电脑上有一些迹象表明它为什么不允许它工作。
      • 我认为该选项不适用,因为脚本正在(并且已经)运行。我只是无法从 XBAP 访问这些功能。如果我直接从 file:// URI 打开 hmtl 文件,我会收到脚本警告。
      • 解决此问题的另一种方法是在 html 页面中添加 Mark of the web (MOTW) 参见msdn.microsoft.com/en-us/library/ms537628(v=vs.85).aspx
      • 谢谢,但我没有遇到这个问题。 “允许活动内容”对我的问题没有影响,只有兼容模式。
      【解决方案3】:

      IE9 不会暴露BrowserInteropHelper.HostScript,除非它处于兼容模式。

      【讨论】:

        【解决方案4】:

        这是事实之后的事,但我想插话,因为我已经处理了这个问题,而且它是一个丑陋的问题。

        正如您所观察到的,它所运行的机器可以正常工作,因为它们是在兼容模式下运行的。您可以通过将以下标记添加到您的 html 文档来指示 IE9 使用兼容模式呈现您的页面:

        <meta http-equiv="X-UA-Compatible" content="IE=8"/>
        

        我有信心说,添加此标签是您唯一的“解决方案”。我已经花了数周时间寻找更好的,这就是我仍然坚持的那个。

        无论出于何种原因,ScriptInteropHelper 在 IE9 中都存在很多问题。它没有得到微软的太多关注,可能是因为它的功能很模糊。也就是说,特别是因为 IE7 和 IE8 有各种各样的怪癖,所以必须在兼容模式下运行非常烦人。有许多 MSDN 文章,例如 this oneenter link description here 进一步讨论了这个问题。

        【讨论】:

        • 最后,我选择了一个 ActiveX 扫描控件。它可以工作并且不会强迫我使用兼容模式(另外,我发现一个有 activex 和 npapi 版本的,所以它可以在大多数浏览器中工作)。似乎仍然支持 Silverlight,但忘记了 XBAP。
        • 您好 Luggage,请问您选择了什么 ActiveX 控件?
        【解决方案5】:

        如果有人仍然想知道这个问题,我已经找到了解决方案。基本上,您可以从文档对象正确通信,而无需在最新浏览器中使用任何 hack 并使用 HTML5 doctype。

        我写了一篇博文,其中包含代码和示例:

        XBAP and Javascript with IE9 or newer - Solution for MissingMethodException problems

        快速解释这可以正常工作:

        Javascript

        document.ResponseData = function (responseData) {
            alert(responseData);
        }
        

        C# XBAP

        var hostScript = BrowserInteropHelper.HostScript;
        hostScript.document.ResponseData("Hello World");
        

        然后它可以用于将 C# 对象传递给 Javascript 并用作“代理”对象。查看该博客文章了解如何使用它的详细信息。

        【讨论】:

        • 你是说只使用BrowserInteropHelper.HostScript.document 而不是BrowserInteropHelper.HostScript
        • 不完全是。可以通过 BrowserInteropHelper.HostScript.document 从 C# 调用扩展函数到文档对象。
        【解决方案6】:

        BrowserInteropHelper.HostScript.setTimeout("WorkDamnit()",0);

        它可以工作,但是如果我想向 js 发送回调函数,我该如何发送带有 setTimeout 的对象?


        当用于 ie8 它的工作良好

        dynamic host = BrowserInteropHelper.HostScript;
        host.sampleJSFunction(new CallbackObject(this));
        

        【讨论】:

          猜你喜欢
          • 2011-02-09
          • 2015-06-29
          • 1970-01-01
          • 1970-01-01
          • 2012-02-14
          • 2016-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多