11

我处于一种奇怪的情况,我以前没有问题实现我正在寻找的东西。以下代码是托管 TinyMCE 富文本框的 HTML 页面的一部分:

...
<textarea id="editing_field">This text is supposed to appear in the rich textbox</textarea>
...

起初,这按预期工作,创建了一个包含文本的富文本框。不过,在某些时候,TinyMCE 代码决定将 textarea HTML 转换为以下内容:

<textarea id="editing_field" style="display: none;"/>
This text is supposed to appear in the rich textbox

这会呈现文本框下方的文本,这并不完全理想。我不知道是什么导致了这种行为变化,尽管我也在使用 jQuery 以及它是否会产生任何影响。

我可以通过在页面加载后使用 javascript 将内容加载到文本框中来解决此问题,方法是使用 ajax 或将文本隐藏在 HTML 中并仅移动它。但是,如果可能的话,我想直接从 PHP 将文本发送到文本框中。任何人都知道这里发生了什么以及如何解决它?

更新 2:我已经成功地重现了导致行为改变的情况:起初我只是在 textarea 中有纯文本,就像在第一个代码片段中一样。但是,保存内容后,文本将如下所示:

<p>This text is supposed to appear in the rich textbox</p>

标签的存在p会导致 TinyMCE 触发封闭文本区域到只是单个标签的文本区域之间的转换(如上图所示)。

更新 1:添加 TinyMCE 配置文件:

tinyMCE.init({
        // General options
        mode : "exact",
        elements : "editing_field",
        theme : "advanced",
        skin : "o2k7",
        skin_variant : "black",
        plugins : "safari,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template",
        save_onsavecallback : "saveContent",

        // Theme options
        theme_advanced_buttons1 : "save,newdocument,|,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull", 
        theme_advanced_buttons2 : "search,replace,|,bullist,numlist,|,outdent,indent,blockquote,|,undo,redo,|,forecolor,backcolor", 
        theme_advanced_buttons3 : "hr,removeformat,|,sub,sup,|,charmap,emotions,|,print,|,fullscreen,code", 
        theme_advanced_buttons4 : "styleselect,formatselect,fontselect,fontsizeselect",
        theme_advanced_toolbar_location : "top", 
        theme_advanced_toolbar_align : "left", 
        theme_advanced_statusbar_location : "bottom", 
        theme_advanced_resizing : false,

        // Drop lists for link/image/media/template dialogs
        template_external_list_url : "lists/template_list.js",
        external_link_list_url : "lists/link_list.js",
        external_image_list_url : "lists/image_list.js",
        media_external_list_url : "lists/media_list.js",

        // Replace values for the template plugin
        template_replace_values : {
            username : "Some User",
            staffid : "991234"
        },

        width : "450",
        height : "500"
    });
4

8 回答 8

18

如果不调用 tinyMCE 的 JavaScript 函数,可能需要处理浏览器兼容性问题。

如果页面上只有一个 tinymce 框,则可以这样做:

tinyMCE.activeEditor.setContent('<span>some</span>');

您还可以设置格式,例如 BBCode。查看setContent文档。

我会让您的 PHP 代码将 HTML 回显到 JavaScript 函数中,并使用以下命令调用它onload

function loadTinyMCE($html) {
    echo "
        <script type="text/javascript">function loadDefaultTinyMCEContent(){
             tinyMCE.activeEditor.setContent('$html');
        }</script>
    ";
}

然后

<body onload="loadDefaultTinyMCEContent()">

如果您不想使用页面onload事件,tinymce 有一个名为oninit的 init 选项,其功能类似。

或者,setupcontent_callback使您可以直接访问 iframe。

于 2009-01-28T17:14:07.130 回答
2

鉴于<p>标签的存在会导致转换,我怀疑您的 HTML 最终看起来像:

...
<textarea id="editing_field"><p>This text is supposed to appear in the rich textbox</p></textarea>
...

不幸的是,HTML 元素在技术上不允许在<textarea>标签内,因此可能会将<p>标签视为新块元素的开始,从而隐式关闭您的 textarea。要解决此问题,您可以对尖括号进行编码:

...
<textarea id="editing_field">&lt;p&gt;This text is supposed to appear in the rich textbox&lt;/p&gt;</textarea>
...

使用 PHP,这可以通过htmlspecialchars()在将其回显到页面之前发送您的值来完成。

于 2009-06-29T22:08:43.073 回答
1

第二个示例 <textarea ... /> 是空标记符号。如果您希望文本位于标签内,您需要像第一种方式 <teatarea ....>foo</textarea>

什么是输出 textarea 标签?您可以调试它以查看它是否正在执行空标记表示法?

埃里克

于 2009-01-28T16:12:57.037 回答
1

tinyMCE.activeEditor.setContent('some') 为我工作。干杯

于 2010-12-22T12:20:16.243 回答
0

看来我已经解决了这个问题,除非有任何破坏解决方案的边缘情况。在将页面内容保存到数据库之前,我在页面内容上使用了以下 PHP 代码:

$content = str_replace(chr(10), "", $content);
$content = str_replace(chr(13), "", $content);
$content = str_ireplace('<','&#x200B;<',$content);

它的作用是删除任何换行符,然后在任何开始标记之前添加一个零宽度的不可见字符。然后,在 TinyMCE 发挥作用之前,此文本将插入到 textarea 标记之间。我不知道为什么,但这不会触发问题,并且附加的字符没有显示在最终的 html 或 TinyMCE 的 html 视图中,所以我可以看到这个解决方案的唯一问题是性能下降。一个细节是,似乎只有开始标签需要以这种方式添加,但为了简单起见,我在这里没有考虑到这一点。

于 2009-01-29T13:51:32.760 回答
0

我在使用 React 时遇到了同样的问题,也许与此有关。传递给组件的初始值是原始值。收到后,组件将接管并处理内容,无论是否向其传递新值。因此,如果您要传递一个字符串,那么它就是一个常量,并且它存在于您的组件的初始渲染中。但是,如果您要传递一个变量,则该变量的初始值可能与您要显示的值不同(例如,在您收到要显示的值之前,它可能为 null 或未定义)。在我的情况下,我收到一个带有页面内容的对象,其中之一是要显示为初始内容的 html。但是 render 方法首先被一个空对象触发,然后是带有数据的实际对象。

于 2018-01-16T15:26:32.047 回答
0

在 tinyMCE.init 中设置 -

init_instance_callback: function (editor) {
                AFunction();
            }

function AFunction(){
//your code here
tinyMCE.get('youtinytextareaname').setContent("your text here");
}
于 2018-08-05T06:53:53.040 回答
-1

要更改特定的 tinymce 字段,您可以执行以下操作:

tinyMCE.get('editing_field').setContent('your default text');
于 2016-11-07T16:50:14.607 回答