Zac*_*Zac 4 javascript ajax wordpress jquery wysiwyg
这是一个答案/解决方案,而不是一个问题,仍然可能存在一些错误,即使我尝试了我的开发环境.
我最近尝试在小部件/菜单中使用wp_editor,经过一些搜索,我没有找到我想要的完整解决方案.
在我按小时挖掘wp的代码之后,我会在下面分享我的解决方案:
可能涉及黑客,但是,我试图最小化它们.
要使wp_editor可以在动态html中工作(这意味着没有重新加载页面,js更改页面结构),有两个主要问题需要注意:
对于[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){}
Run Code Online (Sandbox Code Playgroud)湾 需要数据在提交之前写回textarea
在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;
});
Run Code Online (Sandbox Code Playgroud)对于[快速标签]:
一个.重新初始化标签
湾 切换到正确的选项卡(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] );
}
Run Code Online (Sandbox Code Playgroud)另外,请记住,如果你使用ajax,每次回发mce UI时,你需要在你的js中重新执行[reset mce UI]和[Qtags].一个简单的解决方案是使用js代码发回html,并在php中检测:
$isAjax = defined( 'DOING_AJAX' ) && DOING_AJAX == true );
关于js值中的默认设置:
mce: tinyMCEPreInit.mceInit
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__' );
}
Run Code Online (Sandbox Code Playgroud)
所以你可以通过以下方式获得设
对于mce:
var init;
if( typeof tinyMCEPreInit.mceInit[ id ] == 'undefined' ){
init = tinyMCEPreInit.mceInit[ id ] = tinymce.extend( {}, tinyMCEPreInit.mceInit[ getTemplateWidgetId( id ) ] );
}else{
init = tinyMCEPreInit.mceInit[ id ];
}
Run Code Online (Sandbox Code Playgroud)对于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 ];
}
Run Code Online (Sandbox Code Playgroud)有关完整的代码示例,请查看:https://github.com/hezachary/wordpress-wysiwyg-widget/blob/master/widget_wp_editor.class.php
如果有人想在管理员的菜单中使用wp_editor,原则应该是相同的.
如果您有任何疑问或更好的解决方案,请发表评论,谢谢.
| 归档时间: |
|
| 查看次数: |
8633 次 |
| 最近记录: |