WordPress定制器:检查并替换css选择器的值

时间:2018-06-23 作者:Troy Templeman

我使用以下jquery将CSS样式注入到<style id="customizer-preview"> 中的标记<head> 自定义程序预览窗口的:

wp.customize( \'site_title_color\', function( value ) {
    value.bind( function( newval ) {
        if ( $( \'#customizer-preview .site-title\' ).length > 0 ) {
             $( \'#customizer-preview .site-title\' ).remove();
        }
        $( \'#customizer-preview\' ).append( \'.site-title { color: \' + newval + \' ; }\' );
    } );
} );
它工作得很好,只是之前输入的值没有被删除,新值只是被添加,使CSS变得混乱。第3-5行是问题所在。基本上,我要检查是否已经有一个值分配给选择器.site-title. 如果有,请将其清除并用新值替换。

1 个回复
SO网友:Tim Elsass

您正在使用selector 在这方面:

       if ( $( \'#customizer-preview .site-title\' ).length > 0 ) {
         $( \'#customizer-preview .site-title\' ).remove();
       }
这就像样式化CSS属性一样,如果要将该规则添加到样式表中,它会为元素添加样式#customizer-preview .site-title 因此,上面的代码说明选择器#customizer预览是否存在元素。站点标题,然后删除该元素。

然后使用此代码:

        $( \'#customizer-preview\' ).append( \'.site-title { color: \' + newval + \' ; }\' );
您正在选择您提到的具有ID的样式表customizer-preview. 然后添加为选择器创建的文本字符串。站点标题并在该元素内设置颜色属性。

在“自定义预览”窗口的上下文中,只需将样式直接应用于即可轻松得多。更新值时的站点标题选择器,如下所示:

wp.customize( \'site_title_color\', value => {
    value.bind( to => $( \'.site-title\' ).css( \'color\', to ) );
} );
这样,在内联应用样式时,您就不必担心检查问题,并且会覆盖样式表属性,我假设在您的案例中保存设置时,这些属性是在PHP中创建的。如果多次更改设置,则会继续覆盖该内联样式。这为用户提供了一个准确的预览,这正是定制程序的作用所在。只要两种演示文稿相同,那么输出是否与前端的输出相匹配对用户来说并不重要。

否则,如果你真的想,是的,完全可以按你的要求去做。您需要对样式表规则进行一些解析,您的示例代码很容易做到这一点,但随着处理的内容越来越多,可能会变得更加复杂。这就是它的外观:

wp.customize( \'site_title_color\', value => {
    value.bind( to => {

        // Access stylesheet.
        var css = document.getElementById( \'customizer-preview\' ).sheet;

        // Loop through stylesheet\'s CSS rules to find index of selector.
        for ( var i = 0; i < css.cssRules.length; i++ ) {

            // Check if there\'s a match for your selector.
            if ( \'.site-title\' === css.cssRules[ i ].selectorText ) {

                // Delete the rule from the stylesheet and exit loop.   
                css.deleteRule( i );
                break;
            }
        }

        // Insert new style rule at end using the sheet\'s cssRules length.
        css.insertRule( \'.site-title { color: \' + to + \'; }\', css.cssRules.length );
    } );
} );
由于对这段代码进行了注释,所以应该很容易理解。显然这对你的问题很好,但是如果.site-title 包含的不仅仅是color 属性,则您希望更新规则中的颜色属性,以便保留样式表规则中为.site-title.

结束

相关推荐

如何使用JavaScript选中类别复选框

我正在创建此链接,它向管理面板发送一个额外的参数,例如:/wp-admin/post-new.php?post_type=CPT&msscategory=40 然后,我将一些javascript放入给定页面的队列中(作为操作添加到admin_footer):$screen = get_current_screen(); if ( in_array( $screen->id, array( \'CPT\' ) ) && $screen->act