2011-02-16 5 views
0

Я пытаюсь настроить CKEditor так, чтобы он мог напрямую вставлять видео YouTube ... Я видел, что есть proposed patch, но я хочу сохранить исходный дистрибутив CKEditor, так что мне было интересно если во время выполнения можно использовать «обезьянную патч» CKEditor, чтобы, если пользователь вводит URL-адрес YouTube в диалоговом окне Flash, URL-адрес преобразуется, чтобы разрешить встраивание.Monkey patching CKEditor для встраивания видео YouTube

Я попытался это:

CKEDITOR.on('dialogDefinition', function(ev){ 
    if (dialogName == 'flash'){ 
     var infotab = dialogDefinition.getContents('info'); 
     var f = dialogDefinition.onOk; 
     dialogDefinition.onOk = function(ev) { 
      var cur = this.getContentElement('info', 'src').getValue(); 
      var newurl = cur.replace('youtube.com/watch?v=', 'youtube.com/v/'); 
      if (cur != newurl) { 
       this.getContentElement('info', 'src').setValue(newurl); 
      }; 
      f(ev); 
     } 
    } 
} 

, но он не будет работать, так как внутри f код использует this, и мой «заплаты» меняет его ...

ответ

1

Если вы приложите onOK другой собственности dialogDefinition, this будет правильным в нем (я думаю).

CKEDITOR.on('dialogDefinition', function(ev){ 
    if (dialogName == 'flash'){ 
     var infotab = dialogDefinition.getContents('info'); 
     dialogDefinition.oldOnOk = dialogDefinition.onOk; //change here 
     dialogDefinition.onOk = function(ev) { 
      var cur = this.getContentElement('info', 'src').getValue(); 
      var newurl = cur.replace('youtube.com/watch?v=', 'youtube.com/v/'); 
      if (cur != newurl) { 
       this.getContentElement('info', 'src').setValue(newurl); 
      }; 
      dialogDefinition.oldOnOk(ev); //and change here 
     } 
    } 
} 

Или используйте Function.apply:

CKEDITOR.on('dialogDefinition', function(ev){ 
    if (dialogName == 'flash'){ 
     var infotab = dialogDefinition.getContents('info'); 
     var f = dialogDefinition.onOk; 
     dialogDefinition.onOk = function(ev) { 
      var cur = this.getContentElement('info', 'src').getValue(); 
      var newurl = cur.replace('youtube.com/watch?v=', 'youtube.com/v/'); 
      if (cur != newurl) { 
       this.getContentElement('info', 'src').setValue(newurl); 
      };     
      f.apply(this, ev); //change here 
     } 
    } 
} 
+1

f.apply (это, [эв]) работает в Firefox и IE, большое спасибо :) – Joril

+0

Кроме того, я должен добавить перед, если строка: вар dialogName = ev.data.name; \t var dialogDefinition = ev.data.definition; – rhu

Смежные вопросы