如何检测是否通过外部脚本更改了某些文本框?

时间:2011-08-07 13:13:23

标签: javascript jquery html html5 textinput

我有一些jQuery插件可以更改一些元素,我需要一些事件或jQuery插件,当某些文本输入值发生变化时触发事件。 我已经下载了jquery.textchange插件,它是一个很好的插件但不会通过外部源检测到更改。

3 个答案:

答案 0 :(得分:1)

尝试将旧值设置为全局变量,然后在文本输入上触发onkeypress事件,并在其旧值和新值之间进行比较。像这样的事情

  var oldvlaue = $('#myInput').val();
  $('#myInput').keyup(function(){
     if(oldvlaue!=$('#myInput').val().trim())
     {
        alert('text has been changed');
     }
 });

您测试此示例here

修改

尝试在您的文字输入中添加EventListner,但我不了解更多信息,但您可以查看Post这可能会有所帮助

答案 1 :(得分:1)

@MSS - 好吧,这是一个kludge,但它有效:

当我调用boxWatcher()时,我将值设置为3,000,但您需要更频繁地执行此操作,例如100或300。

http://jsfiddle.net/N9zBA/8/

var theOldContent = $('#theID').val().trim();
var theNewContent = "";

function boxWatcher(milSecondsBetweenChecks) {
    var theLoop = setInterval(function() {
    theNewContent = $('#theID').val().trim();
    if (theOldContent == theNewContent) {
        return; //no change
    }
    clearInterval(theLoop);//stop looping
    handleContentChange();
    }, milSecondsBetweenChecks);
};

function handleContentChange() {
    alert('content has changed');
    //restart boxWatcher
    theOldContent = theNewContent;//reset theOldContent
    boxWatcher(3000);//3000 is about 3 seconds
}


function buttonClick() {
  $('#theID').value = 'asd;lfikjasd;fkj';
}

$(document).ready(function() {
    boxWatcher(3000);
})

答案 2 :(得分:1)

感谢@Darin因为他/她的解决方案我已经标记为答案,但我已经制作了一些小的jQuery插件来实现名为'txtChgMon'的相同工作。

(function ($) {
    $.fn.txtChgMon = function (func) {
        var res = this.each(function () {
            txts[0] = { t: this, f: func, oldT: $(this).val(), newT: '' };
        });
        if (!watchStarted) {
            boxWatcher(200);
        }
        return res;
    };
})(jQuery);
var txts = [];
var watchStarted = false;


function boxWatcher(milSecondsBetweenChecks) {
    watchStarted = true;
    var theLoop = setInterval(function () {
        for (var i = 0; i < txts.length; i++) {

            txts[i].newT = $(txts[i].t).val();
            if (txts[i].newT == txts[i].oldT) {
                return; //no change
            }
            clearInterval(theLoop); //stop looping
            txts[i].f(txts[i], txts[i].oldT, txts[i].newT);
            txts[i].oldT = $(txts[i].t).val();
            boxWatcher(milSecondsBetweenChecks);
            return;
        }
    }, milSecondsBetweenChecks);
}