【问题标题】:Why is WP7 WebBrowser InvokeScript call throwing Error: 80020101?为什么 WP7 WebBrowser InvokeScript 调用抛出错误:80020101?
【发布时间】:2011-03-25 03:58:17
【问题描述】:

这个错误似乎是由于调用的 javascript 函数中出现的任何问题:

SystemException was unhandled    
An unknown error has occurred. Error: 80020101.

我使用 javascript 作为 Web 应用后端的接口,并且我有两个运行正常的调用,从 ajax 调用加载和返回 JSON,如下所示:

在 Silverlight 中:

MyBrowser.InvokeScript("getData", "/Me/Feed?numberOfResults=-1", "MyFeed");

加载到 WebBrowser 的 Javascript

function getData(url, context) {
    $.ajax({
        url: url,
        dataType: 'jsonp',
        success: function (result) {
            callback(result, context);
        }
    });
}

但稍后我想将数据回传到服务器,我也在做同样的事情:

MyBrowser.InvokeScript("postData", "thedata", "CreatePost");

function postData(payload, context) {
    $.ajax({
        type: "POST",
        url: "/Post/Create?" + tz(),
        data: payload,
        dataType:"json",
        success:function (result) {
            callback(result, context);
        }
    });
}

现在我得到了异常。

真正奇怪的是,我可以立即从脚本中调用该函数,并将其发布到后端就好了。

postData("sampledata", "PostTest");

起初,唯一的区别似乎是一个是 GET,另一个是 POST,所以我将 GET ajax 调用复制到第二个调用中(这发生在用户输入上,第一个发生在加载时)。结果是一样的(我得到了同样的错误)。只要它们不包含 ajax 调用(它出现),我就可以从此事件中获取其他命令在 javascript 中触发。所以你可能认为这是一个时间问题——所以我把调用移到上面调用其他正在工作的 InvokeScript 的地方,但它仍然不起作用(同样的例外)。

我还尝试在一个单独的线程上调用它,使用 Dispatcher.BeginInvoke 进行良好的测量并且没有骰子。

Dispatcher.BeginInvoke(() =>
{
    MyBrowser.InvokeScript("postData", "thedata", "CreatePost");
});

我完全感到困惑。似乎确实有一些一致性,如果调用失败,它每次都会失败,但我不知道有效的调用和失败的调用之间有什么区别。

谁能告诉我我做错了什么,或者我不明白一起使用 InvokeScript 和 Ajax 的原因是什么??

谢谢!

[编辑 - 添加这个内联(在 cmets 中)因为我经常收到这个问题]

我已经为此工作了 6 个小时,这就是我所看到的:

  • 我从 2 个不同的事件中调用这些事件; 1) 当浏览器控件上的页面加载完成时,2) 当用户点击我的“发布”按钮时
  • 当 Ajax 调用是来自加载事件的 GET 时,不会发生错误
  • 从用户事件调用相同的 GET 调用时会发生错误
  • 使用加载事件中的 POST 调用 Ajax 调用时也会发生错误
  • 在调用不尝试从用户事件中进行任何 Ajax 的函数时不会发生错误

【问题讨论】:

  • 它是否使用自然的 XMLHTTPRequest 来做到这一点?
  • 调用InvokeScript时页面是否已完全加载?可能是 $.ajax 函数还没有加载?
  • 嗨,NeXXeuS - 我不确定我是否理解您的建议。你的意思是我应该尝试使用 Javascript 作为 Web 应用程序的接口并直接访问它吗?主要是,我的团队不想只为这个客户重写他们所有的东西,另一件事是这种方法提供了现有的 Facebook 身份验证并避免了所有跨域 Silverlight 问题
  • Eugenio,它肯定是加载的。我在加载时调用 getData 并且一切正常。稍后,当用户在我的应用程序中点击一个按钮时,调用 postData 并收到此错误。

标签: javascript jquery ajax silverlight windows-phone-7


【解决方案1】:

如果找不到 javascript 方法或 JS 抛出错误,您将收到 80020101 错误。

在查找方法方面,控件将完全匹配签名。这不是标准的 javascript 行为,所以要小心。

注意在浏览器控件中缓存页面(及其内容),因为这会吸引很多人。 :(

【讨论】:

  • 谢谢,马特。这也是我的理解——但你可以在我的示例代码中看到函数名称和签名是相同的; “postData”,取 2 个参数。我知道页面缓存 - 我在每次测试之前都会清除它。
  • @Nathan Roberton 更改方法的内容以确定问题所在。让postData 做一些绝对有效的事情,以确保它不是互操作问题。这也可能是一个 jQuery 问题,因为它不完全支持 IE7Mobile。
  • 谢谢,马特 - 我已经为此工作了 6 个小时,这就是我所看到的: - 我正在从 2 个不同的事件中拨打这些电话; 1)当页面加载在浏览器控件上完成时,2)当用户点击我的“发布”按钮时 - 当 Ajax 调用是来自加载事件的 GET 时不会发生错误 - 调用相同时会发生错误来自用户事件的 GET 调用 - 使用加载事件中的 POST 调用 Ajax 调用时也会发生错误 - 调用不尝试来自用户事件的任何 Ajax 的函数时不会发生错误。
  • 为了更好的衡量,我今天早上用另一组眼睛再次重现了这些结果
【解决方案2】:

看到 GET 与 JSONP 一起工作,而 POST 根本不工作,似乎暗示您可能要跨域?通常在同一个域上不需要使用 JSON*P*。

所以我的猜测是这违反了同源政策。

【讨论】:

  • 是的,事实证明,虽然我的页面与服务在同一个域中,但我正在从其他地方加载 javascript,这造成了跨域情况。谢谢,丹!
【解决方案3】:

我刚刚解决了一个类似的问题。

这有点奇怪……它需要: 1.将参数作为一个逗号分隔字符串传递给javascript函数 2.使用split()解析javascript中的字符串 3. 创建表达式字符串(即带参数的函数调用) 4. 对字符串表达式执行 eval()。

我猜你也可以将一个 evals 的字符串传递给一个 javascript 数组。

汤姆

【讨论】:

    【解决方案4】:

    唯一的问题(我也遇到过同样的问题)是因为您的 Web 浏览器控件未加载并且正在调用 javascript 函数。

    正如在其中一个答案中所指出的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多