Drupal 7:如何在ckeditor_link插件中覆盖CKEditor的target属性清理规则
解决CKEditor移除target字段中[]字符的问题
针对你遇到的CKEditor链接对话框自动移除[dialog]中方括号的问题,我推荐直接在ckeditor_link插件内部修改处理逻辑,这样既能满足需求,又不会影响其他CKEditor功能。以下是具体实现步骤:
核心思路
问题出在CKEditor链接对话框的target字段commit函数里,原代码用replace(/\W/gi,"")移除了所有非单词字符(包括方括号)。我们需要重写这个函数,允许保留[]字符,从而让[dialog]完整保留在最终的链接中。
具体实现步骤
- 找到
ckeditor_link插件的主文件(通常是ckeditor_link.js) - 在插件的
init方法中,添加对CKEditor对话框定义事件的监听,修改链接对话框的target字段处理逻辑:
CKEDITOR.plugins.add('ckeditor_link', { init: function(editor) { // 保留插件原有的初始化代码(比如自动补全相关逻辑) // 监听对话框加载事件,修改链接对话框的target处理 editor.on('dialogDefinition', function(ev) { const dialogName = ev.data.name; const dialogDefinition = ev.data.definition; // 仅处理链接对话框 if (dialogName === 'link') { // 获取"目标"标签页 const targetTab = dialogDefinition.getContents('target'); if (targetTab) { // 获取target输入字段 const targetField = targetTab.get('target'); if (targetField && targetField.commit) { // 重写commit函数,保留[]字符 targetField.commit = function(linkObj) { linkObj.target || (linkObj.target = {}); // 只移除除了字母、数字、下划线和[]之外的非法字符 const targetValue = this.getValue(); linkObj.target.name = targetValue.replace(/[^\w\[\]]/gi, ''); // 如果不需要过滤任何字符,也可以直接用下面这行: // linkObj.target.name = targetValue; }; } } } }); } });
代码说明
- 我们通过
dialogDefinition事件拦截链接对话框的加载过程,修改其中target字段的commit函数。 - 原正则
/\W/gi会匹配所有非单词字符(包括[]),我们把它改成/[^\w\[\]]/gi,这样就会保留方括号和合法单词字符。 - 如果你不需要对target值做任何过滤,可以直接把replace逻辑去掉,直接赋值
linkObj.target.name = targetValue;,这样更简单。
验证与生效
修改完成后,记得清除Drupal的缓存和CKEditor的浏览器缓存,然后在WYSIWYG编辑器中测试:
- 插入内部链接,在"目标"标签页输入
[dialog] - 保存内容后查看源码,应该能看到
<a href="your-internal-path" target="[dialog]">...</a>的正确格式,这样就能正常触发jQuery UI对话框功能了。
内容的提问来源于stack exchange,提问作者gwar9
相关产品推荐
相关产品推荐

