我有以下代码:
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()
的限制。所以,我的问题是,更换上述代码的最聪明方法是什么,以便它可以使用动态生成的元素?
答案 0 :(得分:0)
使用.on()
:
var supportOnInput = 'oninput' in document.createElement('input');
$('body').on( supportOnInput ? 'input' : 'keyup', ".maxlength", function() {
// do your stuff here
});
注意选择器是按类.maxlength
答案 1 :(得分:0)
我通过将其变成插件来解决这个问题。
(function($) {
$.fn.lilCharacterCount = function() {
var supportOnInput = 'oninput' in document.createElement('input');
var $this = $(this);
var maxLength = parseInt($this.attr('maxlength'));
var $counter = $("<span class=\"character-count label bg-success\">" + maxLength + "</span>");
$counter.insertAfter($this);
$this.on(supportOnInput ? 'input' : 'keyup', function() {
var charCount = $this.val().length;
$counter.text(maxLength - charCount);
if(maxLength <= charCount) {
$counter.removeClass("bg-success");
$counter.addClass("bg-danger");
} else {
$counter.removeClass("bg-danger");
$counter.addClass("bg-success");
}
});
}
}(jQuery));
答案 2 :(得分:-1)
我认为您需要从.each()中删除绑定并使用它:
以下是处理“.on”的摘录:
事件处理程序仅绑定到当前选定的元素;在您的代码调用.on()时,它们必须存在于页面上。
我相信这对你来说不是一个选择。尝试使用“.delegate”。
$( "body" ).delegate("input[maxlength], textarea[maxlength]",
supportOnInput ? 'input' : 'keyup', function( event ) {
// do your stuff
});