如何使Ajax.Autocompleter执行请求而无需键入?
时间:2020-03-06 14:38:15 来源:igfitidea点击:
我正在使用scriptaculous的Ajax.Autocompleter进行具有不同过滤器的搜索。
http://github.com/madrobby/scriptaculous/wikis/ajax-autocompleter
筛选器要求我动态地将数据传递到自动完成程序中,这是我成功地从以下链接中学到的。
http://www.simpltry.com/2007/01/30/ajaxautocompleter-dynamic-parameters/
现在,我有多个过滤器和一个搜索框。我如何获得自动完成程序来进行请求,而无需键入输入,而是单击一个新的过滤器?
这是一个需要澄清的用例。页面加载,有多个过滤器(只是与onclicks链接),以及一个添加了自动完成程序的输入字段。我键入一个查询,并执行自动完成请求。然后,我单击一个不同的过滤器,我希望使用相同的查询执行另一个请求,但是使用不同的过滤器。
或者更简洁地说,如何使自动完成程序在需要时执行请求,而不是依靠键入来触发它?
解决方案
看完Scriptaculous的源代码,看看按键时会发生什么,我建议我们尝试调用onObserverEvent()。
var autoCompleter = new Ajax.Autocompleter(/* exercise for the reader */); // Magic happens autoCompleter.onObserverEvent();
要回答我自己的问题:伪造按键。它确保发出请求,并且下拉框变为可见。这是我伪造按键的功能,该功能考虑了IE和Firefox的差异。
function fakeKeyPress(input_id) { var input = $(input_id); if(input.fireEvent) { // ie stuff var evt = document.createEventObject(); evt.keyCode = 67; $(input_id).fireEvent("onKeyDown", evt); } else { // firefox stuff var evt = document.createEvent("KeyboardEvent"); evt.initKeyEvent('keydown', true, true, null, false, false, false, false, 27, 0); var canceled = !$(input_id).dispatchEvent(evt); } }
var autoCompleter = new Ajax.Autocompleter(/* exercise for the reader */); // Magic happens autoCompleter.activate();
我还发现activate()方法效果很好。这是我的示例代码。
<script type="text/javascript"> /*<![CDATA[*/ var autocomp1 = new Ajax.Autocompleter("search", "AjaxResultsListPlaceholder", "ajaxServerSideSearchHandler.php", { frequency: 1, minChars: 10, indicator: "AjaxWorkingPleaseWaitPlaceholder", } ); /*]]>*/ </script> <form id="theform"> <input type="text" id="search" name="search" value="" /> <input type="button" id="btn_search" name="btn_search" value="Search" onclick="autocomp1.activate();" /> <div id="AjaxWorkingPleaseWaitPlaceholder" style="display: none; border: 1px solid #ffaaaa;"> </div> <div id="AjaxResultsListPlaceholder" style="display: none;; border: 1px solid #aaffaa;"> </div> </form>