0

私は次のフォームを持っています:

  • 発行開始- 2xinput秒、1 つは時間用、もう 1 つは日付用。
  • 発行終了- 2xinput秒、1 つは時刻用、もう 1 つは日付用。
  • 投稿コンテンツ- 1x textarea.

日付/時刻の入力はjQuery InputMaskを使用し、textarea はCKEditorを使用します( jQuery Adapterを使用して、ckeditor を$()andに公開し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 に何かを書き、コンソールprint ckeditor .val() とコンソールリンクで print ckeditor .getData() の両方でテストします。

  2. 上記の入力でバインド入力マスクをクリックし、印刷テストをもう一度クリックします。はval()動作を停止しますが、getData (ネイティブの ck 実装)は動作し続けます。

問題がアダプターにあるのか入力マスクにあるのかわかりませんでした:(


アップデート:

ck adapter と inputmask の両方が$.extendon になることを発見しました$.fn.val$.fn.val実際に拡張するのではなく、アダプタが動作を停止するブラウザで上書きされているようです(imo、両方の拡張を保持する必要がありましたか?)

$.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)
}

$.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 とマージする方法はありますか?

4

1 に答える 1

0

いつかこのエラーに遭遇する人のために、私はRobinHerbots ( jquery-inputmaskの作成者) と話しましたが、問題は次のようです:

は、元のコードn.inputmask.val.apply(t, r);への呼び出しを行います。fn.valしたがって、 inputmask は、html に挿入されたときに参照を作成します ( を介して呼び出されたときではなく$(selector).inputmask())。をキャッシュし$.fn.valます$.inputmask.valが、を使用して呼び出されたときに実際に拡張するだけ.inputmask()です。その後、ckeditor は後で val (後で呼び出された) を変更しますが、inputmask は ckeditor が拡張する前の元の val をキャッシュしているため、ckeditor のものを上書きします。


このアイデアをベースとして使用して、ckeditor スクリプトを inputmask スクリプトの前に移動することをテストしました。最後のhttp://jsfiddle.net/RaphaelDDL/QjVf8/8/のスクリプトを変更してフィドルの改訂を行いました(外部リソースを参照)。

上書きされた$.fn.valnow :dancer:を表示していたブラウザーで機能したようです。

詳細については、https://github.com/RobinHerbots/jquery.inputmask/issues/319を確認してください。

于 2013-08-27T20:50:59.940 に答える