次のコードがあります。
var supportOnInput = 'oninput' in document.createElement('input');
$("input[maxlength], textarea[maxlength]").each(function() {
var $this = $(this);
var maxLength = parseInt($this.attr('maxlength'));
$this.attr('maxlength', null);
var el = $("<span class=\"character-count label bg-success\">" + maxLength + "</span>");
el.insertAfter($this);
$this.bind(supportOnInput ? 'input' : 'keyup', function() {
var cc = $this.val().length;
el.text(maxLength - cc);
if(maxLength < cc) {
el.addClass("bg-danger");
} else {
el.removeClass("bg-danger");
}
});
});
問題は、考慮する必要がある動的に生成された入力要素があることです。問題はイテレータにあるため、に変更bind
してon
も必ずしも解決するとは限りません。each
それを機能させるためのスマートなソリューションはありますか?
アップデート:
問題を詳しく説明するために、特定の長さまでの入力を受け入れるコメント フォームがあります。上記のスクリプトは、フィールドの長さについてクライアント側の検証を実行します。通常は正常に機能しますが、フィールド自体が動的に生成された場合 (たとえば、この検証が必要なコメント フィールドを持つ AJAX 経由で追加された投稿)、機能しません。$.each()
ページがロードされたときに現在存在する要素のみを調べ、そのようにバインドされていないため、イテレータ関数で発生していると思います.on()
。それで、私の質問は、動的に生成された要素で動作するように、上記のコードを置き換える最も賢い方法は何ですか?