jQuery能检查input内容是否改变了吗?
有没有可能绑定的JavaScript(jQuery是最好的)事件“改变”forms的input值莫名其妙?
我知道.change()
方法,但它不会触发,直到你(光标)离开input字段。 我也考虑使用.keyup()
方法,但它也反应在箭头键等。
每当input文本发生变化时,我只需要触发一个动作即使它只是一个字母的变化。
有一个简单的解决scheme,这是HTML5 input
事件。 当前版本的所有主要浏览器都支持<input type="text">
元素,并且IE <9有一个简单的解决方法。有关更多详细信息,请参阅以下答案:
- jQuery键盘事件
- 仅捕获改变input的按键?
示例(除IE <9:请参阅上面的解决方法的链接):
$("#your_id").on("input", function() { alert("Change to " + this.value); });
是的,比较它改变之前的价值。
var previousValue = $("#elm").val(); $("#elm").keyup(function(e) { var currentValue = $(this).val(); if(currentValue != previousValue) { previousValue = currentValue; alert("Value changed!"); } });
另一种select是只在特定的键上触发你改变的function。 使用e.KeyCode
找出被按下的键。
function checkChange($this){ var value = $this.val(); var sv=$this.data("stored"); if(value!=sv) $this.trigger("simpleChange"); } $(document).ready(function(){ $(this).data("stored",$(this).val()); $("input").bind("keyup",function(e){ checkChange($(this)); }); $("input").bind("simpleChange",function(e){ alert("the value is chaneged"); }); });
您也可以将初始值存储在数据属性中,并使用当前值对其进行testing
<input type="text" name="somename" id="id_someid" value="" data-initail="your initail value" /> $( "#id_someid" ).keyup(function() { return $(this).val() == $(this).data().initail });
如果初始值没有改变,将返回true
你可以在jQuery中使用数据,并捕获所有的事件,然后testing它的最后一个值(未经testing):
$(document).ready(function() { $("#fieldId").bind("keyup keydown keypress change blur", function() { if ($(this).val() != jQuery.data(this, "lastvalue") { alert("changed"); } jQuery.data(this, "lastvalue", $(this).val()); }); });
这对于一长串物品也是相当不错的。 使用jQuery.data
意味着你不必创build一个JavaScriptvariables来跟踪值。 你可以做$("#fieldId1, #fieldId2, #fieldId3, #fieldId14, etc")
来跟踪很多领域。
更新:增加了bind
列表的blur
。
我必须使用这种代码来将扫描仪粘贴到现场
$(document).ready(function() { var tId,oldVal; $("#fieldId").focus(function() { oldVal = $("#fieldId").val(); tId=setInterval(function() { var newVal = $("#fieldId").val(); if (oldVal!=newVal) oldVal=newVal; someaction() },100); }); $("#fieldId").blur(function(){ clearInterval(tId)}); });
未testing…
我不认为有一个“简单”的解决scheme。 您可能需要同时使用onKeyUp和onChange事件,以便在使用鼠标进行更改时捕获这些事件。 每次你的代码被调用时,你都可以将你所看到的值存储在这个字段附近的this.seenValue上。 这应该会更容易一些。
当然,你也可以在键盘和鼠标事件的组合上设置事件,也可以设置onblur。 在这种情况下,存储input的值。 在下次调用中,将当前值与最后存储的值进行比较。 只有做到了魔术,如果它真的改变了。
要做到这一点或多或less干净的方式:
您可以将数据与DOM元素相关联(lookup api.jquery.com/jQuery.data)因此,您可以编写一组通用的事件处理程序,并将其分配给表单中的所有元素。 每个事件都可以将它所触发的元素传递给一个generics函数。 该函数可以将旧值添加到元素的数据。 这样,你应该能够实现这个作为一个通用的一段代码,在你的整个表单和你从现在开始写的每一个表单上。 :)我猜可能不会超过20行代码。
一个例子是在这个小提琴: http : //jsfiddle.net/zeEwX/
由于用户可以进入操作系统菜单并使用鼠标select粘贴,因此没有安全的事件可以触发您的操作。 我发现总是有效的唯一方法是有一个setInterval检查input值是否已经改变:
var inp = $('#input'), val = saved = inp.val(), tid = setInterval(function() { val = inp.val(); if ( saved != val ) { console.log('#input has changed'); saved = val; },50);
你也可以使用jQuery特殊事件来设置它。