TinyMCE 第二场演出出现问题。帮助

发布于 2024-12-02 16:50:24 字数 3588 浏览 0 评论 0原文

添加tinyMCE 作为内联编辑器。有一个下一个问题:第一次工作正常 - 使用自定义样式显示(如我设置),工作正常,但是当我单击取消然后再次开始编辑时,我有空编辑器 - 编辑区域中没有文本。所以这是一段代码: UPD:cm.Node - document.createElement 和 el.setAttribute 的包装器,cm.getByAttr('attr', 'attr_val', el) - 从 el 通过 attr 获取 elemnt。 req - AJAX 的包装器,cm.merge - 就像 PHP 中的 array_merge

var EditBlock = function(){
    var my = this;
    var o = cm.merge({
        'id' : '',
        'act' : '',
        'val' : '',
        'nobr' : false,
        'text' : false,
        'onSaved' : function(){},
        'onSave' : function(){},
        'params' : {'iconsPath' : 'interface/common/images/stdc/nicEditorIcons.gif'}
    }, arguments[0]);
    var prefix = 'tinyMCE_' + Math.random() + '_';
    var node = cm.getEl(o.id);
    var txtArea = cm.addClass(cm.Node('textarea', {'id' : prefix + o.id, 'style': ('width:' + node.offsetWidth + 'px')}), prefix + o.id);
    var saveBtn = cm.Node('input', {'type':'button', 'value':'Save'});
    var cancelBtn = cm.Node('input', {'type':'button', 'value':'Cancel'});
    var container = cm.Node('div', txtArea, cm.Node('div', saveBtn, cancelBtn));

    var plainText = function(node){
        var str = '';
        var childs = node.childNodes;        
        for(var i = 0, ln = childs.length; i < ln; i++){
            if(childs[i].nodeType == 3)
                str += childs[i].nodeValue;
            else if(childs[i].childNodes.length)
                str += plainText(childs[i]);
        }
        return str;
    }

    var init = function(){
        node.onclick = my.edit;
        cancelBtn.onclick = my.close;
        saveBtn.onclick = function(){
            my.save();
            my.close();
        }
    }

    my.save = function(){
        var tmp = cm.Node('div', tinyMCE.get(prefix + o.id).getContent());
        var content = o.text? plainText(tmp) : tmp.innerHTML;
        o.onSave(content);
        node.innerHTML = content;
        req({
        'act' : o.act, 
        'data' : 'data[content]=' + escape(content) + (o.val? '&data[val]=' + o.val : ''), 'handler' : function(){o.onSaved(content)}
        });
    }
    my.close = function(){
        tinyMCE.init({
            'editor_deselector' : prefix + o.id
        });
        container.parentNode.removeChild(container);
        node.style.display = 'block';
    }
    my.edit = function(){
        txtArea.value = node.innerHTML;
        node.style.display = 'none';
        node.parentNode.insertBefore(container, node);
        var styles = '';
        var styleRef = cm.getByAttr('rel', 'stylesheet');
        for(var i = 0, ln = styleRef.length; i < ln; i++){
            styles += (i > 0? ',' : '') + styleRef[i].href;
        }
        tinyMCE.init({
            'height' : '100%',
            'content_css' : styles + ',/sdtc-new/nc/interface/common/css/mce-editor.css',
            'mode' : "specific_textareas",
            'editor_selector' : prefix + o.id
        });

    }
    init();
}

使用这样的:

new EditBlock({'onSave' : function(content){
            page.content = content;
            viewDepartment(page);
        }, 'id':'depContent', 'act' : '/departments/setContent/', 'val' : page.id, 'params' : {buttonList : ['fontSize','bold','italic','underline','strikeThrough','html']}});

所以......再次讨论问题。当第一次开始编辑时,单击保存时一切正常 - 一切也都正常(仍然存在一些错误,但保存后我可以单击并再次开始编辑),但是当单击取消时,该编辑器被隐藏,但当我再次单击编辑时,我有一个空的编辑区域。我看到控制台并发现取消后,当我再次开始编辑时,我会创建新的编辑,但旧的不会销毁 - 只是隐藏。

我尝试使用tynyMCE.Editor 类方法,如 hide 和 show 以及 setContent,并得到了一些结果 - 取消后我可以再次编辑,但编辑区域没有样式和按钮。

请帮忙。如果是通过代码提出的问题 - 我很乐意回答。 谢谢。

Added tinyMCE as inline editor. Have a next probllem : first time this is work good - show with custom style (as I setup), works correctly but when I click cancel and then start edit again I have empty editor - without text in edit area. so this is a code:
UPD : cm.Node - wrapper for docuement.createElement and el.setAttribute, cm.getByAttr('attr', 'attr_val', el) - get elemnt by attr from el. req - wrapper for AJAX, cm.merge - like array_merge in PHP

var EditBlock = function(){
    var my = this;
    var o = cm.merge({
        'id' : '',
        'act' : '',
        'val' : '',
        'nobr' : false,
        'text' : false,
        'onSaved' : function(){},
        'onSave' : function(){},
        'params' : {'iconsPath' : 'interface/common/images/stdc/nicEditorIcons.gif'}
    }, arguments[0]);
    var prefix = 'tinyMCE_' + Math.random() + '_';
    var node = cm.getEl(o.id);
    var txtArea = cm.addClass(cm.Node('textarea', {'id' : prefix + o.id, 'style': ('width:' + node.offsetWidth + 'px')}), prefix + o.id);
    var saveBtn = cm.Node('input', {'type':'button', 'value':'Save'});
    var cancelBtn = cm.Node('input', {'type':'button', 'value':'Cancel'});
    var container = cm.Node('div', txtArea, cm.Node('div', saveBtn, cancelBtn));

    var plainText = function(node){
        var str = '';
        var childs = node.childNodes;        
        for(var i = 0, ln = childs.length; i < ln; i++){
            if(childs[i].nodeType == 3)
                str += childs[i].nodeValue;
            else if(childs[i].childNodes.length)
                str += plainText(childs[i]);
        }
        return str;
    }

    var init = function(){
        node.onclick = my.edit;
        cancelBtn.onclick = my.close;
        saveBtn.onclick = function(){
            my.save();
            my.close();
        }
    }

    my.save = function(){
        var tmp = cm.Node('div', tinyMCE.get(prefix + o.id).getContent());
        var content = o.text? plainText(tmp) : tmp.innerHTML;
        o.onSave(content);
        node.innerHTML = content;
        req({
        'act' : o.act, 
        'data' : 'data[content]=' + escape(content) + (o.val? '&data[val]=' + o.val : ''), 'handler' : function(){o.onSaved(content)}
        });
    }
    my.close = function(){
        tinyMCE.init({
            'editor_deselector' : prefix + o.id
        });
        container.parentNode.removeChild(container);
        node.style.display = 'block';
    }
    my.edit = function(){
        txtArea.value = node.innerHTML;
        node.style.display = 'none';
        node.parentNode.insertBefore(container, node);
        var styles = '';
        var styleRef = cm.getByAttr('rel', 'stylesheet');
        for(var i = 0, ln = styleRef.length; i < ln; i++){
            styles += (i > 0? ',' : '') + styleRef[i].href;
        }
        tinyMCE.init({
            'height' : '100%',
            'content_css' : styles + ',/sdtc-new/nc/interface/common/css/mce-editor.css',
            'mode' : "specific_textareas",
            'editor_selector' : prefix + o.id
        });

    }
    init();
}

use this like :

new EditBlock({'onSave' : function(content){
            page.content = content;
            viewDepartment(page);
        }, 'id':'depContent', 'act' : '/departments/setContent/', 'val' : page.id, 'params' : {buttonList : ['fontSize','bold','italic','underline','strikeThrough','html']}});

So ... again about problem. When first time start to edit that all works fine when click save - all works too (still exists some bugs but after saving I can click and start edit again) but when click cancel that editor is hide but when I click to edit again I have a empty edit area. I see to console and find that after canceling when I start editing again then I create new edit but old not destroy - only hidden.

I try to usetynyMCE.Editor class methods like hide and show and setContent and was a some result - after canceling I could edit egain but edit area was without styles and buttons.

Please help. If would be quaestion by code - I pleasure to answer.
Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

○愚か者の日 2024-12-09 16:50:24

不要在这里使用 hide()show() 。您应该正确关闭tinymce,以便能够使用与第一个编辑器相同的id 重新初始化tinymce 编辑器。

要关闭编辑器实例,请使用:

tinymce.execCommand('mceRemoveControl',true,'editor_id');

重新初始化使用

tinymce.execCommand('mceAddControl',true,'editor_id');

Don't use hide() and show() here. You should shut down tinymce correctly in order to be able to reinitialize a tinymce editor with the same id as the first one.

To shut down an edtor instance use:

tinymce.execCommand('mceRemoveControl',true,'editor_id');

To reinitialize use

tinymce.execCommand('mceAddControl',true,'editor_id');
风流物 2024-12-09 16:50:24

请注意!
这些已经发生了变化,您可能会有更好的运气(对于较新的版本,我认为是 4+):

尝试使用 mceRemoveEditormceAddEditor...如下所示:

tinymce.execCommand('mceRemoveEditor',true,'editor_id');

tinymce.execCommand('mceAddEditor',true,'editor_id');

Please note!
These have since changed, you may have better luck with (for newer versions, 4+ I think):

try mceRemoveEditor and mceAddEditor instead...as in:

tinymce.execCommand('mceRemoveEditor',true,'editor_id');

tinymce.execCommand('mceAddEditor',true,'editor_id');
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文