当前位置: 首页 > 面试题库 >

动态加载wordpress wp_editor(ajax)

沃阳曜
2023-03-14
问题内容

这是一个答案/解决方案,而不是一个问题,即使我尝试了我的开发环境,仍然可能存在一些错误。

我最近尝试在小部件/菜单中使用wp_editor,经过一番搜索,我没有找到想要的完整解决方案。

在按小时挖掘wp的代码后,我将在下面分享我的解决方案:


问题答案:

可能涉及黑客攻击,但是,我尝试将其最小化。

为了使wp_editor可以在动态html中工作(这意味着在不重新加载页面的情况下,js会更改页面结构),需要注意两个主要问题:

  1. TinyMce
  2. 快速标签

对于[tinymce]:

一个。需要正确重置UI

  • 解决方法是[删除mce实例]-> [获取正确的mce设置]-> [重新初始化新的mce实例]

  • 在js代码中(id表示textarea id):

        tinymce.execCommand('mceRemoveEditor', true, id);
    var init = tinymce.extend( {}, tinyMCEPreInit.mceInit[ id ] );
    try { tinymce.init( init ); } catch(e){}

b。提交前需要将数据写回textarea

  • 解决方案是[将单击绑定到按钮]->在submt上:: [关闭mce]-> [打开提交]
  • 在js代码中:
        jq('textarea[id="' + id + '"]').closest('form').find('input[type="submit"]').click(function(){
        if( getUserSetting( 'editor' ) == 'tmce' ){
            var id = mce.find( 'textarea' ).attr( 'id' );
            tinymce.execCommand( 'mceRemoveEditor', false, id );
            tinymce.execCommand( 'mceAddEditor', false, id );
        }
        return true;
    });

对于[快速标记]:

一个。重新初始化标签

  • [获取设置]-> [设置鼠标事件]-> [重新初始化QTags]

b。切换到适当的标签(MCE标签或快速标签标签)

  • [切换到当前标签页模式]

  • 两者都在js代码中:

        if ( typeof(QTags) == 'function' ) {
        jq( '[id="wp-' + id + '-wrap"]' ).unbind( 'onmousedown' );
        jq( '[id="wp-' + id + '-wrap"]' ).bind( 'onmousedown', function(){
            wpActiveEditor = id;
        });
        QTags( tinyMCEPreInit.qtInit[ id ] );
        QTags._buttonsInit();
        switchEditors.switchto( jq( 'textarea[id="' + id + '"]' ).closest( '.widget-mce' ).find( '.wp-switch-editor.switch-' + ( getUserSetting( 'editor' ) == 'html' ? 'html' : 'tmce' ) )[0] );
    }

另外,请记住,如果您使用Ajax,则每次回传mce UI时,都需要在js中重新执行[reset mce
UI]和[Qtags]。一个简单的解决方案是在您发回html并在php中检测以下内容时使用js代码:

$isAjax = defined( 'DOING_AJAX' ) && DOING_AJAX == true );

关于js值的默认设置:

  1. mce: tinyMCEPreInit.mceInit

  2. qtags: tinyMCEPreInit.qtInit

如果尝试将默认设置用于小部件模式,则需要找到默认设置。

要获取小部件模板ID,请使用JS代码:

    function getTemplateWidgetId( id ){
            var form = jQuery( 'textarea[id="' + id + '"]' ).closest( 'form' );
            var id_base = form.find( 'input[name="id_base"]' ).val();
            var widget_id = form.find( 'input[name="widget-id"]' ).val();
            return id.replace( widget_id, id_base + '-__i__' );
    }

因此,您可以通过以下方式获取设置:

  1. 对于mce:
        var init;
    if( typeof tinyMCEPreInit.mceInit[ id ] == 'undefined' ){
        init = tinyMCEPreInit.mceInit[ id ] = tinymce.extend( {}, tinyMCEPreInit.mceInit[ getTemplateWidgetId( id ) ] );
    }else{
        init = tinyMCEPreInit.mceInit[ id ];
    }
  1. 对于Qtags:
        var qInit;
    if( typeof tinyMCEPreInit.qtInit[ id ] == 'undefined' ){
        qInit = tinyMCEPreInit.qtInit[ id ] = jq.extend( {}, tinyMCEPreInit.qtInit[ getTemplateWidgetId( id ) ] );
        qInit['id'] = id;
    }else{
        qInit = tinyMCEPreInit.qtInit[ id ];
    }

有关完整的代码示例,请检查:https :
//github.com/hezachary/wordpress-wysiwyg-
widget/blob/master/widget_wp_editor.class.php

如果有人想在菜单清单中使用wp_editor进行管理,则原理应相同。

如果您有任何疑问或更好的解决方案,请发表评论,谢谢。



 类似资料:
  • 问题内容: 我正在尝试为我的网站创建页面主题功能。我想使用单独的CSS文件在页面上动态加载相应的主题。 我正在使用此代码: 效果很好,但是如果CSS文件未加载,它不会返回任何信息。 加载时,有什么方法可以捕捉吗?也许通过使用ajax? 问题答案: 加载CSS文件(或其任何其他更改)时,Internet Explorer会触发一个事件。其他浏览器不会触发任何事件,因此您将必须手动检查样式表是否已加载

  •  说明 调用方法: $.f2e.util.getScript(url,cache,fn); 函数说明: 加载js,并提供相关回调 参数说明: 参数名 类型 说明 备注 url string 地址 无 cache boolean 缓存 无 fn function 回调函数 无 脚本 <script> $.f2e.util.getScript(url,true,function(){

  • 我知道如何加载CSS。 怎么卸载?

  • 问题内容: 我查找了语法并搜索了api,但仍然对该过程感到困惑。我还搜索了Stackoverflow。加载类并从中动态创建对象的正确方法是什么?换句话说,我希望用户指定要创建的对象类型,然后创建该类型的对象。我不需要菜单,因为我希望他们能够选择当前目录中的任何类。 问题答案: 假设该类具有无参数构造函数,则最简单的方法是- 参考-java.lang.Class

  • 问题内容: 我正在考虑减少使用。js(看起来不错),但我们的网站要求在初始页面加载后动态加载某些样式。但是,似乎所有LESS样式表必须在less.js脚本加载之前先加载。即这有效 但是如果换行,它将失败,除非正确订购,否则Firefox和chrome都不会尝试加载“style.less”。在本教程中明确指出了订购要求。 有什么方法可以在初始页面加载后加载更少的样式表? - 保存您的LESS代码时,

  • 问题内容: 如何可靠,动态地加载JavaScript文件?这将用于实现模块或组件,该模块或组件在“初始化”时将根据需要动态加载所有需要的JavaScript库脚本。 使用该组件的客户端不需要加载实现该组件的所有库脚本文件(并将标记手动插入其网页),只需加载“主”组件脚本文件即可。 主流JavaScript库如何做到这一点(原型,jQuery等)? 这些工具是否将多个JavaScript文件合并到脚