2013-02-19 75 views
11

这里的问题是示范防止TinyMCE的自删除跨度元素

你可以在这里尝试一下:http://fiddle.tinymce.com/SLcaab

这是TinyMCE的默认配置

  • 较少所有的插件
  • 与extended_valid_elements:“span”

1 - 打开HTML源代码编辑器

2 - 粘贴此HTML到HTML源代码编辑器:

<p><span>Hello</span></p> 
<p><a href="http://www.google.com">Google 1</a></p> 
<p><a href="http://www.google.com">Google 2</a></p> 

3 - 在HTML源代码编辑器中单击更新粘贴在编辑器中的HTML

4 - 请记住,'你好'有一个跨度。

5 - 将光标放在Google 2之前,然后按退格键(两个链接应在同一段落元素内合并)。

6 - 使用Html Source Editor查看生成的html。

结果(问题):尽管我们在TinyMCE设置中将'span'添加到extended_valid_elements,但在html文档中没有更多跨度。

注意:我删除了所有的插件,以确保问题是TinyMCE的核心。

编辑1 - 我也试过: valid_children: “+ P [跨度]” - 仍然无法正常工作

编辑2:只有转载WebKit的(OK在Firefox和IE)

+0

作品在这个小提琴iwth内容已经设置,也许跨度越来越迷路时粘贴 – Thariama 2013-02-19 17:13:33

+0

@Thariama你是什么意思“内容已经设置”?粘贴不是问题,因为如果您在Html源代码编辑器(步骤3)中单击更新按钮后重新打开Html源代码编辑器,跨度仍然存在。 – W3Max 2013-02-19 17:57:01

+0

contetn alread set意味着它使用afiddle来放置在init textarea中的内容 – Thariama 2013-02-20 11:23:04

回答

1

您是否正在运行最新版本的TinyMCE?我遇到了相反的问题 - 新版本的TinyMCE会添加不需要的span元素。降级到v3.2.7已经解决了我的问题,如果您愿意使用旧版本,那么这对您也可能有用。

类似的错误已被报道,请参阅以下链接过滤 “跨度” 元素上的错误: http://www.tinymce.com/develop/bugtracker_bugs.php#!order=desc&column=number&filter=span&status=open,verified&type=bug

+1

降级tinymce是一个坏主意。旧版本将无法顺利使用新的浏览器版本 - 这就是为什么tinymce应该尽可能最新的原因 – Thariama 2013-02-20 11:19:35

+1

@Thariama是对的。我们不能只是降级,因为我们需要最新版本的某些功能/错误修正。但是你也是对的,这绝对是3.5.8版本中的TinyMCE(major)bug :-( – W3Max 2013-02-20 14:27:19

+0

是的,降级不是一个好主意 - 只是一个临时解决方案,而你希望在下一个版本中修复。你可以做的最好的事情就是向TinyMCE开发者报告一个新的bug,或者投票修复类似的bug。如果你有时间可以试着找出导致它的原因。 – 2013-02-20 18:30:19

1

尝试此3.5.8:在tiny_mce_src.js

  1. 更换cleanupStylesWhenDeleting(与此::

    function cleanupStylesWhenDeleting() { 
         function removeMergedFormatSpans(isDelete) { 
           var rng, blockElm, wrapperElm, bookmark, container, offset, elm; 
           function isAtStartOrEndOfElm() { 
             if (container.nodeType == 3) { 
               if (isDelete && offset == container.length) { 
                 return true; 
               } 
    
               if (!isDelete && offset === 0) { 
                 return true; 
               } 
             } 
           } 
    
           rng = selection.getRng(); 
           var tmpRng = [rng.startContainer, rng.startOffset, rng.endContainer, rng.endOffset]; 
    
           if (!rng.collapsed) { 
             isDelete = true; 
           } 
    
           container = rng[(isDelete ? 'start' : 'end') + 'Container']; 
           offset = rng[(isDelete ? 'start' : 'end') + 'Offset']; 
    
           if (container.nodeType == 3) { 
             blockElm = dom.getParent(rng.startContainer, dom.isBlock); 
    
             // On delete clone the root span of the next block element 
             if (isDelete) { 
               blockElm = dom.getNext(blockElm, dom.isBlock); 
             } 
    
             if (blockElm && (isAtStartOrEndOfElm() || !rng.collapsed)) { 
               // Wrap children of block in a EM and let WebKit stick is 
               // runtime styles junk into that EM 
               wrapperElm = dom.create('em', {'id': '__mceDel'}); 
    
               each(tinymce.grep(blockElm.childNodes), function(node) { 
                 wrapperElm.appendChild(node); 
               }); 
    
         blockElm.appendChild(wrapperElm); 
             } 
           } 
    
           // Do the backspace/delete action 
           rng = dom.createRng(); 
           rng.setStart(tmpRng[0], tmpRng[1]); 
           rng.setEnd(tmpRng[2], tmpRng[3]); 
           selection.setRng(rng); 
           editor.getDoc().execCommand(isDelete ? 'ForwardDelete' : 'Delete', false, null); 
    
           // Remove temp wrapper element 
           if (wrapperElm) { 
             bookmark = selection.getBookmark(); 
    
             while (elm = dom.get('__mceDel')) { 
               dom.remove(elm, true); 
             } 
    
             selection.moveToBookmark(bookmark); 
           } 
         } 
    
    
          editor.onKeyDown.add(function(editor, e) { 
           var isDelete; 
    
           isDelete = e.keyCode == DELETE; 
           if (!isDefaultPrevented(e) && (isDelete || e.keyCode == BACKSPACE) && !VK.modifierPressed(e)) { 
             e.preventDefault(); 
             removeMergedFormatSpans(isDelete); 
           } 
         }); 
    
         editor.addCommand('Delete', function() {removeMergedFormatSpans();}); 
    }; 
    
  2. 线1121)把一个外部链接tiny_mce_src.js在HTML以下tiny_mce.js

+0

黑客攻击核心是一个糟糕的主意,特别是在一个项目中像TinyMCE一样复杂 – claviska 2013-10-28 16:09:39

+0

同意不得不得到的东西虽然 – 2013-11-08 13:15:20

10

我有同样的问题,我找到解决方案。微小的MCE删除了SPAN标签,没有任何arrtibute。试试我们跨班或另一个attrib。例如:

<h3><span class="emptyClass">text</span></h3> 

在TinyMCE 4+这个方法很好的工作。

+0

谢谢,它的工作原理。我讨厌这个多功能的编辑器,但有很多遗留的代码要保留:) – 2015-04-23 08:25:14

+0

这可以工作,但不如[Jangho Bae的答案](http://stackoverflow.com/a/35524890/302103 ),因为它允许没有类的跨度。 – 2016-07-28 14:46:30

+0

我正在使用tinymce 4.6.6我已经指定了带有span标签的类,但仍然没有解决此问题 – 2017-10-11 07:03:20

0

可以通过将它写成JavaScript脚本来防止WYSIWIG剥离空标签,从而使用它。这里我的问题是包含字体真棒图标,其中使用空<我>或<范围>标签。

<script>document.write('<a href="https://www.facebook.com" target="_blank"><i class="fa fa-facebook"></i></a>');</script> 
10

插入extended_valid_elements : 'span'tinymce.init

tinymce.init({ 
    selector: 'textarea.tinymce', 
    extended_valid_elements: 'span', 
    //other options 
}); 
+1

这应该是公认的答案,因为它实际上使用TinyMCE中内置的选项解决了问题。 – 2016-07-28 14:35:55

+0

原来的帖子说他已经确认这已经确定了。 – foray 2016-10-23 19:48:37

+0

这可行,但它从我的范围中删除类。我使用这行代码,但它可能允许一些错误元素: valid_elements:'+ * [*]', – 2016-12-16 20:25:20

1

TinyMCE的取下跨度标签没有任何属性。我们可以对任何属性使用span,这样它就不会被删除。

e.g <span class="my-class">Mahen</span> 
0

遇到了这个问题,并不满意所有提供的答案。

我们确实需要在某些时候更新wordpress,所以更改核心文件不是一个选项。给元素添加属性只是为了修复tinyMCE行为似乎也不是正确的。

随着functions.php文件中的以下钩子,tinyMCE将不再删除空的<span></span>标签。

function tinyMCEoptions($options) { 
    // $options is the existing array of options for TinyMCE 
    // We simply add a new array element where the name is the name 
    // of the TinyMCE configuration setting. The value of the array 
    // object is the value to be used in the TinyMCE config. 

    $options['extended_valid_elements'] = 'span'; 
    return $options; 
} 
add_filter('tiny_mce_before_init', 'tinyMCEoptions'); 
1

在在TinyMCE插件参数启用: 使用的Joomla文字过滤。

确保您的用户组在全局配置>文本过滤器中设置了“无过滤”选项。

+0

因为这是一个joomla anwer,你确定这是一个joomla问题吗? – 2017-10-18 09:11:09