How to get Bootstrap typeahead click result before the input change event
我正在尝试使用引导程序预先输入作为用户的灵活选择。因此,如果该项目是已知的,他们会选择它,否则会打开一个对话框,允许他们输入新项目。
我通过观察输入上的更改事件来执行此操作,如果输入 val 不在源数组中(对于预先输入),则向用户显示"添加项目"对话框。问题是,如果用户单击其中一个选项,则会在预先输入有机会设置 val 之前发送更改事件。这是因为点击会导致文本模糊。
我想检查活动元素以解决此问题,因此在更改事件中查看 document.activeElement 并查看它是否是预先输入的选项之一,这不起作用并返回了整个正文元素。
这是代码的精简版:
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 | <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button> <h3 id="myModalLabel">Unknown Contact <p>The contact you have entered is unknown. Press cancel to enter a different contact or fill out the details below to create a new contact</p> <label>Name</label> <input id="modal_contact" type="text" placeholder="dealership contact" value=""/> <label>Email</label> <input id="modal_contact_email" type="text" placeholder="dealership contact" value=""/> <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button> <button id="save" class="btn btn-primary">Save changes</button> |
Javascript
1 2 3 4 5 6 7 8 9 10 11 12 13 | var contacts = ['pete','geoff']; $('.typeahead').typeahead({source:contacts, updater : function(item){ console.log('updater fired'); //fires after first change event return item; }}); $('input').change(function(ev){ console.log($(ev.target).val()); if ($.inArray($(ev.target).val(), contacts) < 0) $('#contactModal').modal(); }) |
还有一个 JSFiddle 版本 http://jsfiddle.net/k39vM/
有谁知道我如何测试用户是否点击了提前输入以找出是否导致更改事件?
我之前的建议实际上没有奏效,因为正如您所提到的,有一个有点意外的
但是,经过一些反复试验,我确实认为我可能已经找到了解决方法。导致问题的实际上并不是
因此,可以在
时,您仍然必须手动忽略
简化的HTML(我使用了
1 2 3 | <input class="typeahead" type="text" placeholder="contact" value="Peter skillet"></input> <input type="text"></input> <p id="text" /> |
JavaScript(文本可以用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | var contacts = ['pete', 'geoffrey']; var $text = $("#text"); var typeahead = $('.typeahead').typeahead({source: contacts}).data('typeahead'); typeahead.select = function () { var val = this.$menu.find('.active').attr('data-value'); this.$element.val(this.updater(val)) .trigger('selected'); // <- unique event return this.hide() }; $('input.typeahead').on('change', function (e) { var $target = $(e.target); if (typeahead.mousedover) { $text.html($text.html() +"mousedover [ignored selection]<br />"); } else if ($.inArray($target.val(), contacts) < 0) { $text.html($text.html() +"show add<br/>"); } }).on('selected', function () { $text.html($text.html() +"selected<br />"); }); |
作为参考,这是默认的
1 2 3 4 5 6 7 | select: function () { var val = this.$menu.find('.active').attr('data-value') this.$element .val(this.updater(val)) .change() return this.hide() } |
该问题的一个更简单的解决方案是在您的点击事件中包含以下内容:
1 2 3 | var typeahead = $(this).data("typeahead"); if (typeahead && this.value != typeahead.$menu.find('.active').attr('data-value')) return; |
如果附加,第一行将检索预先输入。第二个将确保当前值与所选值匹配。
您还可以在 if 中检查