В CKEditor, как сделать ссылку открытой в новом окне по умолчанию при удалении целевой вкладки?

Я хочу, чтобы ссылки открывались в новом окне по умолчанию. Я старался:

CKEDITOR.on('dialogDefinition', function ( ev ){
   if(ev.data.name == 'link'){
      ev.data.definition.getContents('target').get('linkTargetType')['default']='_blank';
   }
});

Не работает Но я понял, что если я уберу следующую строку. Оно работает.

config.removeDialogTabs = 'image:advanced;image:Link;link:advanced;link:target';

Но тогда проблема в том, что теперь есть целевая вкладка, которая позволяет пользователю изменять цель ссылки.

Что я хочу сделать редактор максимально простым и не хочу, чтобы пользователи могли изменить цель ссылки. Тем не менее, я хочу установить цель по умолчанию в качестве цели:_blank. Какие-либо предложения? Спасибо!

3 ответа

Кажется, что если вы удалите вкладку "Цель", вы не сможете изменить значение по умолчанию на "новое окно".

Тем не менее, вы можете удалить все параметры в списке Target, кроме "нового окна", и установить его в качестве значения по умолчанию.

Попробуйте следующий код:

CKEDITOR.on('dialogDefinition', function(e) {
    if (e.data.name === 'link') {
        var target = e.data.definition.getContents('target');
        var options = target.get('linkTargetType').items;
        for (var i = options.length-1; i >= 0; i--) {
            var label = options[i][0];
            if (!label.match(/new window/i)) {
                options.splice(i, 1);
            }
        }
        var targetField = target.get( 'linkTargetType' );
        targetField['default'] = '_blank';
    }
});

В этом случае вкладка "Цель" все еще существует, но есть только одно значение ("новое окно") для выбора, поэтому пользователи не могут изменить это.

Надеюсь это поможет.

Вот как я обновил свои ссылки, чтобы они открывались в новой вкладке, не затрагивая никакие другие ссылки на странице, а только ссылки из ckEditor. Это в Angular, но вы можете использовать ту же идею в зависимости от вашей платформы.

Я создал канал, чтобы преобразовать ссылку, чтобы включить цель:

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'setlinktarget'
})
export class SetLinkTarget implements PipeTransform {

  transform(value: any): any {
    return value.split('<a ').join('<a target="_new"');
  }

}

Затем я применил канал к своему контенту:

<div [innerHTML]="myRecord.commentsWithHTML | setlinktarget">

Это кажется намного проще, чем все другие варианты, в которых вам нужно изменить файлы ckeditor. Надеюсь, это кому-то поможет.

Другой способ сделать это для предоставления необходимых данных в функции onOk, см. Этот конкретный коммит

Вы добавляете целевой атрибут к объекту данных в функции onOk в plugins/link/dialogs/link.js

onOk: function() {
            var data = {};

            // Collect data from fields.
            this.commitContent( data );


            // Overwrite, always set target="_blank"
            data.target = {
                dependent: "",
                fullscreen: "",
                height: "",
                left: "",
                location: "",
                menubar: "",
                name: "_blank",
                resizable: "",
                scrollbars: "",
                status: "",
                toolbar: "",
                top: "",
                type: "_blank",
                width: ""
            };
     //more code below
     }
CKEDITOR.on('dialogDefinition', function (ev) { 
   var dialogName = ev.data.name;
   var dialog = ev.data.definition.dialog;
   var dialogDefinition = ev.data.definition;

   if(dialogName == 'link') {
      dialogDefinition.onLoad = function () {
         if(dialogName == 'link'){
             dialogDefinition.getContents('target').get('linkTargetType')['default']='_blank';
         }
         dialog.hidePage( 'target' );                   
    };
}
});

//And configure the below
 config.removeDialogTabs = 'image:advanced;link:advanced;link:upload;';

Перейти к ckeditor/plugins/link/dialogs/link.js и вставьте следующий код:

/* Here we are latching on an event ... in this case, the dialog open event */

CKEDITOR.on('dialogDefinition', function(ev) {
    try {    
        /* this just gets the name of the dialog */    
        var dialogName = ev.data.name;

        /* this just gets the contents of the opened dialog */
        var dialogDefinition = ev.data.definition;

        /* Make sure that the dialog opened is the link plugin ... otherwise do nothing */
        if(dialogName == 'link') {`enter code here`    
            /* Getting the contents of the Target tab */
            var informationTab = dialogDefinition.getContents('target');

            /* Getting the contents of the dropdown field "Target" so we can set it */
            var targetField = informationTab.get('linkTargetType');

            /* Now that we have the field, we just set the default to _blank
               A good modification would be to check the value of the
               URL field and if the field does not start with "mailto:" or a
               relative path, then set the value to "_blank" */
            targetField['default'] = '_blank';
        }
    } catch(exception) {
         alert('Error ' + ev.message);
    }
});
Другие вопросы по тегам