jQuery inputmask使CKEditor适配器停止工作

时间:2013-08-27 14:33:54

标签: jquery internet-explorer webkit ckeditor jquery-inputmask

我有以下表格:

  • 发布开始 - 2x input s,一个用于时间,一个用于日期;
  • 发布结束 - 2x input s,一个用于时间,一个用于日期;
  • 发布内容 - 1x textarea

日期/时间的输入使用jQuery InputMask和textarea使用CKEditor(使用jQuery Adapter,将ckeditor公开给$()val()

使用适配器,我可以:

  • 使用$('#idOfTextarea').val()代替CKEDITOR.instances['idOfTextarea'].getData();
  • 使用$('#idOfTextarea').val('some value')代替CKEDITOR.instances['idOfTextarea'].setData('some value');

问题:

  • IE (v9)和Webkits (Chrome v30& v31,Safari v5.1)val()在我将输入绑定的那一刻停止工作输入掩码;
  • Firefox (v22)和Opera (v12.16):继续工作val()

演示:

以下是小提琴示例:http://jsfiddle.net/RaphaelDDL/QjVf8/

  1. 在CKEditor上写一些内容并使用 打印控制台上的ckeditor .val() 打印ckeditor .getData()进行测试在控制台上 链接。

  2. 单击上面输入 绑定输入掩码 ,然后再次单击打印测试。 val()将停止工作,而getData (原生ck实施)将继续有效。

  3. 我无法找到问题是适配器还是输入掩码:(


    更新

    我发现ck适配器和输入掩码都在$.extend上生成$.fn.val。似乎$.fn.val在适配器停止工作的浏览器上被覆盖,而不是实际扩展(imo,必须同时保持两个扩展,不是吗?)

    输入掩码(chrome)之前的

    $.fn.val

    function(d) {
        if (arguments.length) {
            var k = this,
                i = [],
                f = this.each(function() {
                    var b = a(this),
                        c = b.data("ckeditorInstance");
                    if (b.is("textarea") && c) {
                        var f = new a.Deferred;
                        c.setData(d, function() {
                            f.resolve()
                        });
                        i.push(f.promise());
                        return !0
                    }
                    return g.call(b, d)
                });
            if (i.length) {
                var b = new a.Deferred;
                a.when.apply(this, i).done(function() {
                    b.resolveWith(k)
                });
                return b.promise()
            }
            return f
        }
        var f = a(this).eq(0),
            c = f.data("ckeditorInstance");
        return f.is("textarea") && c ? c.getData() : g.call(f)
    }
    
    输入掩码(chrome)之后

    $.fn.val

    function() {
        var t, i, r;
        return arguments.length == 0 ? (t = n(this), t.data("inputmask") ? t.data("inputmask").autoUnmask ? t.inputmask("unmaskedvalue") : (i = n.inputmask.val.apply(t), i != t.data("inputmask")._buffer.join("") ? i : "") : n.inputmask.val.apply(t)) : (r = arguments, this.each(function() {
            var t = n(this),
                i = n.inputmask.val.apply(t, r);
            return t.data("inputmask") && t.triggerHandler("setvalue.inputmask"), i
        }))
    }
    

    在Firefox上,$.fn.val始终相同(当我调用inputmask时不会改变)。

    有没有办法可以将inputmask的扩展与ckeditor合并?

1 个答案:

答案 0 :(得分:0)

对于那些有一天遇到此错误的人,我已经与RobinHerbotsjquery-inputmask的创建者)进行了交谈,似乎问题是:

n.inputmask.val.apply(t, r);会调用原始fn.val代码。 因此,输入掩码在将其插入到html时(而不是通过$(selector).inputmask()调用时)生成ref。它将$.fn.val缓存到$.inputmask.val上,但实际上只是在使用.inputmask()调用时对其进行扩展。然后ckeditor稍后修改val(稍后调用),但由于inputmask已经缓存了ckeditor扩展之前的原始val,它会覆盖ckeditor一个。


使用这个想法作为基础,我测试了在输入掩码脚本之前移动ckeditor脚本。我对改变最后http://jsfiddle.net/RaphaelDDL/QjVf8/8/的脚本的小提琴进行了修改(参见外部资源)。

似乎它适用于现在显示被覆盖$.fn.val的浏览器:舞者:

有关详情,请查看https://github.com/RobinHerbots/jquery.inputmask/issues/319