【问题标题】:Is it possible to override javascript in an iFrame from the parent? If so how?是否可以从父级覆盖 iFrame 中的 javascript?如果有怎么办?
【发布时间】:2012-01-19 16:53:20
【问题描述】:

我在我们的一个触摸屏应用程序中使用 Telerik RadSpell 控件。我已经设法将它的样式设置得恰到好处,但是该死的东西使用 window.alert 和 window.confirm 来提示用户是否要保留更改等。

我想禁用这些警报,而不必拆开和修改 Telerik 控件。

问题是拼写检查对话框使用 iframe,我似乎无法覆盖 iframe 内的 window.confirm 函数。


用于测试覆盖确认的示例代码。


<!-- mainpage.htm -->
<html>
    <head>
        <script type="text/javascript">
            window.confirm = function(msg){ alert(msg); }
            confirm("Main Page Confirm");
        </script>
    </head>
    <body>
        <iframe src="./iframepage.htm" >
        </iframe>
    </body>
</html>

<!-- iframepage.htm -->
<html>
    <head>
        <script type="text/javascript">
            confirm("iframe confirm");
        </script>
    </head>
    <body>
        Some content.
    </body>
</html>

结果

是否可以覆盖父级 iframe 中的 javascript?如果有怎么办?

【问题讨论】:

  • 我应该补充一点,该应用程序不会在任何地方使用警报或确认,因为这些对话框对于触摸屏来说很糟糕。

标签: javascript iframe telerik


【解决方案1】:

我刚刚在第一个论坛分享了一个更简单的解决方案,它演示了如何覆盖 cancelHandler 并隐藏确认对话框。

为方便起见,我在下面粘贴解决方案:

我会提出一种更简单的方法来禁用弹出窗口,它是覆盖 cancelHandler 函数。为此,请按照以下步骤操作:

1) 在 Web 应用的根目录下创建一个名为 dialog.js 的 JS 文件,并使用以下函数填充它:

Telerik.Web.UI.Spell.SpellDialog.prototype.cancelHandler = function (e) {
    if (this._cancel.disabled) {
        return $telerik.cancelRawEvent(e);
    }
    //changes will be applied only if spell handler response is received, text has changed
    //and the user confirms
    this.closeDialog(this._spellProcessor && this._spellProcessor.textChanged() && true);

    return $telerik.cancelRawEvent(e);
}

2) 保存文件并将 RadSpell 的 DialogsScriptFile 属性设置为指向该文件,例如

3) 测试解决方案。

我希望这会有所帮助。

【讨论】:

  • 甜,这完美!如果您不介意我问,您在哪里可以查看整个 js 文件?
  • @RumenJekov 你能帮我在父窗口的 iframe 中覆盖 alert() 吗?
【解决方案2】:

您可以使用 javascript IFF 获取对内部窗口的引用,该框架与父级来自同一个域。

//Get iframe element by getElementById, frames[0], or whatever way you want
var myFrame = document.getElementById("myFrame");
//Get the window of that frame, overwrite the confirm
myFrame.contentWindow.confirm = function(msg){ alert("I overwrote it! : " + msg); }

【讨论】:

  • 有一个警告,你需要在 iframe 加载后执行此操作,所以你需要挂钩到 iframe 元素的onload
【解决方案3】:

你应该能够:

document.getElementById('iframe').contentWindow.confirm = [this is confirm in the iframe];

也许这样的事情可能对你很有效:

document.getElementById('iframe').contentWindow.confirm = window.confirm;

这会将 iframe 的确认链接到父项的确认,如果您已经在父项中对确认进行了一些处理,这很好。

请注意,您还需要为可能的未定义对象添加一些处理。

var iframe = document.getElementById('iframe');
//iframe exists
if(iframe){
 var iframe_window = document.getElementById('iframe').contentWindow;
 //window exists (won't if frame hasn't loaded)
 if(iframe_window){
  iframe_window.confirm = window.confirm;
 }
}

【讨论】:

  • 您应该从 iframe 的 onload 处理程序中覆盖该函数,而不是空检查
【解决方案4】:

您可以查看以下资源,这些资源可能对您的方案有所帮助: http://www.telerik.com/community/forums/aspnet-ajax/spell/how-do-i-turn-off-the-confirm-dialog.aspxhttp://www.telerik.com/help/aspnet-ajax/spell-client-check-finished.html

他们展示了如何删除 RadSpell 确认和警报弹出窗口。

最好的问候, 瘤胃

【讨论】:

  • 嗨 Rumen,第一个链接实际上是我第一次遇到这个问题时写的一篇文章,我发现实现该解决方案的过程就像大多数 Telerik 控件的黑客攻击一样,在实践。不幸的是,第二个链接中的事件仅适用于最终的“拼写检查完成”消息,而不适用于控件内置的 2 个其他警报和 1 个确认对话框。因此,我试图破解我的方式! :)
猜你喜欢
  • 2011-01-20
  • 2015-10-30
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2014-04-17
  • 1970-01-01
相关资源
最近更新 更多