Javascript Jquery文本更改事件

Javascript Jquery文本更改事件,javascript,jquery,Javascript,Jquery,我需要在文本框的内容发生变化时触发事件 我不能使用键控也不能使用按键 如果按住键,则“向上键”和“向下键”不起作用 在文本实际更改之前,按键触发。它也不识别backspace或delete 所以现在我假设我必须构建一些自定义逻辑或下载一个插件。有插件吗?或者,如果我应该构建一个,我应该注意哪些约束 例如,Facebook是通过在顶部搜索来实现的。你可以按住 另一个例子是写一个stackoverflow问题。在编辑器的正下方,内容被实时复制,退格,一切正常。他们是怎么做的?投票怎么样?执行setI

我需要在文本框的内容发生变化时触发事件

我不能使用键控也不能使用按键

如果按住键,则“向上键”和“向下键”不起作用

在文本实际更改之前,按键触发。它也不识别backspace或delete

所以现在我假设我必须构建一些自定义逻辑或下载一个插件。有插件吗?或者,如果我应该构建一个,我应该注意哪些约束

例如,Facebook是通过在顶部搜索来实现的。你可以按住


另一个例子是写一个stackoverflow问题。在编辑器的正下方,内容被实时复制,退格,一切正常。他们是怎么做的?

投票怎么样?执行
setInterval
并调用一个函数,每隔500毫秒检查一次文本?无论如何,您都不想检测每个键上的内容更改,因为在一些较旧的浏览器/较旧的计算机上,它会变得有点慢,并且您会注意到键入和文本显示之间的延迟。

您需要一个观察者类型的功能


如果其他功能不可用,它会求助于setInterval轮询:

我刚刚查看了SO的源代码。看起来他们做了很多类似的事情:


他们做了一些额外的工作,为粗体、斜体和链接等制作HTML标记,并计时。如果生成HTML的时间太长,它们会将延迟从1增加到更长。

我成功地使用了jQuery(在Chrome中)。如果按住一个键,它会计算每一次更改,而不仅仅是第一次更改,并且会计算非打印键(如backspace)

HTML

<input id="txt" type="text" />
<span id="changeCount">0</span>
正如我上面所说的,您需要过滤掉所有不改变文本的键代码,如ctrl、shift、alt、enter等。如果在文本框为空时按backspace或delete键,或者如果文本框具有最大长度并按下可打印键,则还有一个边界条件,但处理这些问题也不是非常困难


这是一个可行的解决方案。

我有一个简单的解决方案,我们很乐意在我们的一个项目中使用

你可以试试@

delayRun()函数


Zurb有一个很棒的插件,它可能对你有用

@Jason Gennaro,一个混合了格式化和显示文本框更改并将其发送到服务器的程序。明白了@pixelfreak有一个好主意,下面是三种检测文本变化的方法(来自另一个问题:)看起来,如果你绑定到“输入”事件,它会正常工作。您好,这对我来说很好,除了按键事件之外,您还可以添加粘贴事件来检测像这样的所有文本更改$('textarea').bind('paste',function(){setTimeout(updatePreview,1);});​
<input id="txt" type="text" />
<span id="changeCount">0</span>
$('#txt').keydown(function(event) {
    // Don't count the keys which don't actually change
    // the text. The four below are the arrow keys, but
    // there are more that I omitted for brevity.
    if (event.which != 37 && event.which != 38 &&
        event.which != 39 && event.which != 40) {

        // Replace the two lines below with whatever you want to
        // do when the text changes.
        var count = parseInt($('#changeCount').text(), 10) + 1;
        $('#changeCount').text(count);

    }
});
var i = 0;
$('#text').bind('check_changed', function(){
    var t = $(this);

    // do something after certain interval, for better performance
    delayRun('my_text', function(){
        var pv = t.data('prev_val');

        // if previous value is undefined or not equals to the current value then blablabla
        if(pv == undefined || pv != t.val()){
            $('#count').html(++i);
            t.data('prev_val', t.val());
        }
    }, 1000);
})
// if the textbox is changed via typing
.keydown(function(){$(this).trigger('check_changed')})
// if the textbox is changed via 'paste' action from mouse context menu
.bind('paste', function(){$(this).trigger('check_changed')});

// clicking the flush button can force all pending functions to be run immediately
// e.g., if you want to submit the form, all delayed functions or validations should be called before submitting. 
// delayRun.flush() is the method for this purpose
$('#flush').click(function(){ delayRun.flush(); });
;(function(g){
    var delayRuns = {};
    var allFuncs = {};

    g.delayRun = function(id, func, delay){
        if(delay == undefined) delay = 200;
        if(delayRuns[id] != null){
            clearTimeout(delayRuns[id]);
            delete delayRuns[id];
            delete allFuncs[id];
        }
        allFuncs[id] = func;
        delayRuns[id] = setTimeout(function(){
            func();
            delete allFuncs[id];
            delete delayRuns[id];
        }, delay);
    };

    g.delayRun.flush = function(){
        for(var i in delayRuns){
            if(delayRuns.hasOwnProperty(i)){
                clearTimeout(delayRuns[i]);
                allFuncs[i]();
                delete delayRuns[i];
                delete allFuncs[i];
            }
        }
    };
})(window);