Monkey 修补 CKEditor 以嵌入 YouTube 视频

发布于 2024-10-17 21:32:49 字数 892 浏览 1 评论 0原文

我正在尝试配置 CKEditor,以便它可以直接嵌入 YouTube 视频...我看到有一个建议的补丁< /a> 但我想保持原来的 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,而我的“补丁”改变了它......

I'm trying to configure CKEditor so that it could embed YouTube videos directly... I saw there's a proposed patch but I want to keep the original CKEditor distribution as it is, so I was wondering if it's possible to "monkey patch" CKEditor at runtime so that if the user types a YouTube URL inside the Flash dialog, the URL gets transformed to allow embedding.

I've tried this:

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);
       }
    }
}

but it won't work, since inside f the code uses this, and my "patch" changes it...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

万劫不复 2024-10-24 21:32:49

如果将 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
       }
    }
}

If you attach the onOK to another property of dialogDefinition, this will be correct within it (I think).

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
       }
    }
}

Or use 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
       }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文