【问题标题】:Calling a JS function from HTML IFRAME (both web resources)从 HTML IFRAME(两个 Web 资源)调用 JS 函数
【发布时间】:2012-12-08 12:56:11
【问题描述】:

我上传了两个网络资源,a.HTMLb.JS。在 HTML 文档中,我有一个执行脚本的部分(并且它按预期工作)上传加载到我的表单上的 IFRAME。

现在,由于代码的大小,我觉得有必要对其进行重构,我想将一些方法从我的 HTML Web 资源的 script 标签中移出到单独的 JS Web 资源中。

在第一步中,我设置了单独的 JS 网络资源,如下所示。

function test() { alert("Success."); }

我从 HTML 文档中的脚本执行以下操作,得到一个错误,因为页面似乎不知道 test

alert("Get ready for test...");
test();
alert("Did it work?");

当然,我已将 JS 网络资源添加到表单并保存已发布。令人惊讶的是,关于这个主题的信息很少。我找到了这些链接,但没有一个完全符合我的需要,也没有提示我如何解决手头的问题。

  • This link 类似于我想要实现的目标它是关于 从 JS 调用 JS,两者都是 Web 资源。
  • This link 与我想要的对角相反

我应该纠正什么?

【问题讨论】:

  • @eicto 如果 JavaScript 不是 Web 资源,您将如何将 JavaScript 输入服务器? (我拥有的不仅仅是 JS 的基础知识,我只是不确定如何在其他 Web 资源中引用一个函数。坦率地说,我不确定你也不知道。我的代码有效 - 我只是希望重构它。)
  • @eicto 不要让你的泡沫破灭,但 OP 确实有 CRM Dynamics 的标签。我检查了你的页面,我确信你是一个伟大的 JS 程序员,但我认为你错过了 MS 已经设法让事情 hrmp... 不同,当谈到将 JS 放入 CRM 时。如果你不明白网络资源在CRM中的重要性,你不应该太自大地批评他/她。 在评论中声明这是重构工作代码的问题。这意味着保证了对JS的基本理解。坦率地说,让 JS 在基础层面上工作并不那么复杂。
  • 是的,我只是想向 OP 展示一种在复杂问题中看到简单事物的方式。我不是伟大的 JS 程序员 :) 并且我根本不是程序员,我的主要工作是系统管理 :)

标签: javascript html iframe dynamics-crm-2011


【解决方案1】:

从 Microsoft Dynamics CRM 中的 HTML 网络资源调用 javascript 网络资源中的函数

CRM 2015

Javascript 网络资源:

function test() { alert("Success."); }

HTML 网络资源:

window.parent.test();

CRM 2016

他们现在在 iframe 中加载 HTML 网络资源,因此您无法访问外部 js 文件,但您可以访问 XRM 对象。所以你可以把函数放在这个对象上。

Javascript 网络资源:

Xrm.Page.test = test;
function test() { alert("Success."); }

HTML 网络资源:

window.parent.Xrm.Page.test();

【讨论】:

    【解决方案2】:

    检查您所做的以下假设:

    • 保存网络资源?
    • 发布所有更改?
    • 将资源添加到相关实体的框架中?
    • 命名函数hazaa
    • 调用正确的名称,即parent.window.test()?

    如果以上所有,做三件事。

    1. 联系微软。您刚刚发现了一个严重的错误。
    2. 小心。 很快就会有猪飞了。
    3. 买一件外套。天气会变得更冷。

    (我的意思是,您肯定错过了我提供的列表中的某些内容,并且您无需联系 Microsoft,猪不会开始飞,而且该死的不要冻结。)

    【讨论】:

    • 无需躲避。短期内不会有空降的猪。我实际上错过了列出的 两个 项。谢谢你们!
    【解决方案3】:

    我认为您的 test() 函数在您的 html 文档窗口的范围内。 当您从 iframe 的文档中调用它时,它会在其范围内搜索 test()。

    试一试

    alert("Get ready for test...");
    parent.window.test();
    alert("Did it work?");
    

    如果 test() 在 iframe 中定义并且您从 HTML 文档中调用它,请尝试此操作。

    alert("Get ready for test...");
    document.getElementById("iframeId").src ="javascript:test();"
    alert("Did it work?");
    

    【讨论】:

    • 好吧,告诉我一件事,JS 正在 iframe 中加载,函数在包含 iframe 的 html 中定义?
    • @AndreasJohansson:如果我正确理解了您的问题,请检查我编辑的答案。
    • 啊,我不清楚。对此感到抱歉。 IFRAME 包含一个网络资源(HTML 文档),它在 that 文档中,我有一个执行某些内容的脚本标记。 除此之外我还向我的 CRM 上传了一个纯 JavaScript 的其他网络资源。 那个脚本我想从中执行一个函数。
    • 我马上试试。但是,如果我不指定 test 函数所在的 哪个文件,我不确定服务器将如何理解我的意思。如果我有两个 JS 怎么办Web 资源,每个资源都包含一个名为 Boom()? 的函数的定义。在 C# 中,我会使用 Package1.Boom()Package2.Boom() 之类的东西,但我该如何在 JavaScript 中做到这一点?!它们不能简单地相互覆盖,对吗?
    • 他将 IFRAME 组件添加到 CRM 中。它实际上与普通的 Web 开发完全不同。使用 Dynamics Server 时,看不到创建 IFRAME 的代码(我知道,我知道 - 这真的很奇怪)。基本上,人们只能看到放入框架的 HTML 的内容。而且我们不允许操作 DOM。 (令人震惊,对吗?)但是,我看到您仍然设法为他提供了一个非常好的建议(parent.window.functionName 参考)。干得好,为此 +1!
    猜你喜欢
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    相关资源
    最近更新 更多