0

我正在尝试配置 CKEditor 以便它可以直接嵌入 YouTube 视频......我看到有一个提议的补丁,但我想保持原来的 CKEditor 发行版不变,所以我想知道是否可以“猴子补丁”CKEditor在运行时,如果用户在 Flash 对话框中键入 YouTube URL,则 URL 会被转换为允许嵌入。

我试过这个:

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,并且我的“补丁”改变了它......

4

1 回答 1

1

如果您将 附加onOK到 的另一个属性dialogDefinitionthis则在其中将是正确的(我认为)。

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
       }
    }
}
于 2011-02-16T21:39:36.377 回答