【问题标题】:Using jQuery to animate WPForms hidden/conditional fields使用 jQuery 为 WPForms 隐藏/条件字段设置动画
【发布时间】:2020-04-22 11:16:16
【问题描述】:

我在我的 WordPress 网站上使用 WPForms 插件。我的一个表单有一个隐藏字段,当您单击表单上其他地方的单选按钮时会出现该字段,当您单击另一个单选按钮时会再次消失。

隐藏字段在隐藏时有一个类.wpforms-conditional-hide,设置为display:none。当字段显示时,该类神奇地更改为.wpforms-conditional-show,设置为display:block

我想为这个字段的隐藏和显示设置动画,例如让它滑入和滑出视图。我不能使用 CSS,因为 CSS 无法使用“显示”属性进行动画/过渡,并且隐藏字段没有设置高度。我的网站上已经有 jQuery,所以我想找到一种方法来使用 jQuery 来实现这一点,例如。使用类似 slideToggle 或类似的东西。

问题是,我不想将动画绑定到单选按钮上的单击操作。特别是因为我希望它能够在任何表单上的任何隐藏字段上工作。因此,如果可能的话,我只想在隐藏字段的类从 .wpforms-conditional-hide 更改为 .wpforms-conditional-show 并返回时使用 slideToggle (或类似的东西),或者每当其 CSS 属性从 display:none 更改为display:block 并返回。

这可能吗?

[更新]

为了记录,这是我现在使用的整个函数,其中包含@blex 提供的答案和他的 cmets 的代码和建议。下面的功能将在 WordPress 上与 WPForms 一起“按原样”工作。

function slide_hidden_wpforms_fields() {
if ( wp_script_is( 'jquery', 'done' ) ) {
?>
<script type="text/javascript">
jQuery( document ).ready(function( $ ) {
$( document ).one( "wpformsProcessConditionals", function() {
    var classname = 'wpforms-conditional-show';
    $( '.wpforms-field' ).each( function( i, el ) {
        var wasVisible = $( el ).hasClass( classname );
        var obs = new MutationObserver( function( mutations ) {
            mutations.forEach( function( mutation ) {
                if ( mutation.attributeName === 'class' ) {
                    isVisible = $( el ).hasClass( classname );
                    if ( isVisible !== wasVisible ) {
                        wasVisible = isVisible;
                        $( el )[isVisible ? 'hide' : 'show']().slideToggle( 200 );
                    }
                }
            });
        });
        obs.observe( el, {
            'attributes': true
        });
    });
});
});
</script>
<?php
}
}
add_action( 'wpforms_wp_footer_end', 'slide_hidden_wpforms_fields' );

【问题讨论】:

  • 从您的描述中,我了解到您想响应这个班级变化。那正确吗?在您的情况下,使用 $('#field').slideDown()slideUp 而不是使用类会更容易(即使类更优雅),但这只有在您有权访问切换类的代码时才有可能跨度>
  • 我不完全确定 jQuery 意义上的“反应”是什么意思,但听起来是正确的 - 我确实想“反应”(在字典意义上)类的变化通过让隐藏的字段滑入视图而不是立即出现在视图中。不幸的是,我无法访问切换类的代码——这将是 WordPress 插件中内置的东西。我还希望将解决方案基于类更改,而不是基于 ID,因为我希望它适用于使用这两个切换类的页面(和其他页面)上的所有隐藏字段。

标签: javascript jquery wordpress


【解决方案1】:

编辑有关完整的复制和粘贴答案,请参阅@GermanKiwi's

您可以使用Mutation Observer 来检测类的变化。这是一个例子:

var classname = 'wpforms-conditional-show';
// For each input (use your own selector)
$('input').each(function(i, el) {
  // Save its state
  var wasVisible = $(el).hasClass(classname);
  // Create a mutation observer
  var obs = new MutationObserver(function(mutations) {
    // When mutations are received, for each of them
    mutations.forEach(function(mutation) {
      // If the mutation is a change of class
      if (mutation.attributeName === 'class') {
        // Check the presence of that class
        isVisible = $(el).hasClass(classname);
        // If that changed (and only for this specific class)
        if (isVisible !== wasVisible) {
          // Update the state
          wasVisible = isVisible;
          // Hide the element before sliding it down, or vice versa
          $(el)[isVisible ? 'hide' : 'show']().slideToggle(200);
        }
      }
    });
  });
  // Start the observer
  obs.observe(el, {
    'attributes': true
  });
})

// Just for the demo
var i = 0,
    inputs = $('input');
setInterval(function(){inputs.eq(i).toggleClass(classname);i=(i+1)%inputs.length;},100);
input { display: none; }
.wpforms-conditional-show { display: block; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" placeholder="Hello">
<input type="text" placeholder="World">
<input type="text" placeholder="And">
<input type="text" placeholder="Welcome">

【讨论】:

  • 几个后续问题:(1)使用您的脚本,每当我现在重新加载页面时,隐藏的字段会在它滑出视线之前暂时可见。有什么办法可以防止这种情况发生吗? (2) 有人在stackoverflow.com/a/41555175/3019930 用单行 jQuery sn-p 回答了一个类似的问题,我认为它会起作用 - 而且它要短得多!像这样的事情是不可能的,例如。检测 CSS 属性的变化(从 display:none 到 display:block)而不是检测类的变化?
  • 另一个问题:在检查了我正在使用的插件的代码之后 - WPForms - 我可以看到它正在使用 .addClass() 和 .removeClass() 将隐藏字段的类从“ .wpforms-conditional-hide”到“.wpforms-conditional-show”。这是否意味着我可以使用这些作为 slideToggle 的触发器,这会是更好的方法吗?例如: .on( "addClass", function() { do stuff }
  • @GermanKiwi (1) 如果没有看到页面,我无法确定,但也许插件在页面加载后立即更改了类。然后,也许你需要延迟上面的脚本。 (2) 这一条线与我使用的一条线很接近:$(el)[isVisible ? 'hide' : 'show']().slideToggle(200);,但是,您链接到的答案没有检测到任何东西,它只是动画。不过,可以调整我的答案以检测display 的变化。 (3) 没有触发addClass 事件。为此,您需要自己触发它by editing the plugin's code
  • 嗨@blex,很抱歉延迟回复,感谢您迄今为止提供的有用提示!您关于插件在页面加载后更改类的理论听起来可能是罪魁祸首。我刚刚创建了一个测试表单,我想知道您是否可以看一下,看看这是否是在重新加载页面时隐藏字段暂时可见的原因?如果这就是原因,我将如何为您精彩的脚本添加延迟?我将在此处的单独评论中发布指向我的测试表单的链接(以便稍后删除)....
  • 我将把我的整个函数粘贴到这里的第二个答案中,以防它帮助其他 WPForms 用户看到准备复制粘贴的整个内容,但我会将你的标记为接受的答案。感谢您的帮助!
猜你喜欢
  • 2011-08-25
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
相关资源
最近更新 更多