当 iframe 的表单验证失败时,让父页面滚动到顶部

Posted

技术标签:

【中文标题】当 iframe 的表单验证失败时,让父页面滚动到顶部【英文标题】:Get parent page to scroll to top when iframe's form validation fails 【发布时间】:2014-09-14 16:37:40 【问题描述】:

客户希望为他们的站点范围订阅应用程序调整现有表单。由于网站的布局方式,实现这一点的最简单方法是让 iframe 将现有表单拉入新页面。但是,当表单验证触发失败时,这会导致现有行为出现一些问题。

我在页面中有一个 iframe:

<iframe class="contactForm" frameborder="0"  
   src="/path/to/contact.html" Please fill out the entire form";
        $('#formErrors').text(error);
        $('html,body').animate(
            scrollTop: $("#formErrors").offset().top,
                'fast');
        
     else 
        //execute ajax submission here
    

执行。如果表单验证失败,则表单页面顶部的 div 元素将填充错误文本,并动画快速滚动动作。但是,由于 iframe 设置的高度足以容纳原始表单页面而无需任何滚动,因此不会执行此滚动操作。

有什么方法可以让这个滚动动作在窗口中工作 IFONLY IF 这个脚本加载到 iframe 中,同时保持现有的行为原始页面?

【问题讨论】:

应该显示错误信息的div是在iframe还是父页面? @Khalid,它在 iframe 中。 window.top == window 只有在脚本从主窗口(不在 iframe 中)执行时才应该测试为真 【参考方案1】:

解决方案是使用window.postMessage。

在父窗口中,我有

function receiveMessage(e)

  console.log("Received Message: " + e);

  if (e.originalEvent.origin === 'http://www.site.client.com') 
    $("html, body").animate(
        scrollTop : 441
    , "fast");
  

$(window).bind("message", receiveMessage);

并为 iframe 内容的原始 js 代码添加了这个:

window.parent.postMessage("Scroll", "http://www.site.client.com/");

这会导致 iframe 发布一条由父级捕获的消息。由于这是发布的唯一消息,因此当且仅当域匹配时,我使用它来触发滚动事件。

【讨论】:

【参考方案2】:
$('form#ContactForm').bind('submit', function(event) 
    if ( !validation ) 

        var error ="Please fill out the entire form";
        $('#formErrors').text(error);
        if (window.top != window) 
            $('html,body').animate(
                scrollTop: $("#formErrors").offset().top,
                    'fast');
            
        
     else 
        //execute ajax submission here
    

【讨论】:

这不会为父窗口实现滚动动作。 不,它没有,但这不是你问的。

以上是关于当 iframe 的表单验证失败时,让父页面滚动到顶部的主要内容,如果未能解决你的问题,请参考以下文章

解决iframe重定向让父级页面跳转

vue element ui表单验证不通过,滚动到页面上第一个验证失败的输入框位置

Google ReCaptcha 在 ios 设备上验证时滚动到页面底部

当用户在 iframe 中导航时,强制 iframe 的父页面自动滚动到顶部?

Bootstrap表单验证之后滚动到第一个验证失败的位置

vue+Element表单验证之滚动条定位到校验未通过的表单控件的位置