IE中的Script.aculo.us自动完成程序问题
我正在IE中的Script.aculo.us自动完成程序控件遇到问题(我已经在IE6和7中尝试过)。加载页面后,第一个字符输入到文本框中时,建议无法显示。在最初的故障之后,控件将按预期方式工作。
我已经验证了建议数据是从服务器正确返回的;该问题似乎与建议元素的位置有关,因为在我们希望显示建议时,页面上其他相对定位的元素会错位。
有没有人听说过这样的问题或者对如何解决有任何建议?
编辑:作为对Chris的回应,我已将partialChars参数设置为1,并且该控件在我尝试过的所有其他浏览器中都有效,这些浏览器是Firefox,Safari,Opera和Chrome的最新版本。我可能应该首先明确这一点。谢谢。
解决方案
问题只是在IE中还是在所有浏览器中?实际上,忽略第一个字符是自动完成程序的默认设置。在controls.js中,有一个名为Autocompleter.Local的类,该类具有一个名为partialChars的字段,默认为2. 该字段的文档说:
// partialChars触发前要输入多少个字符
//部分匹配(不同于minChars,后者定义了
//进行匹配需要多少个字符
//)。默认为2.
我仍然不知道到底是什么引起了这个问题,但是我设法找到了解决办法。这个想法是执行通常在页面加载时导致第一个字符输入失败的处理,以使其摆脱干扰:
new Ajax.Autocompleter(textInputId, suggestionsHolderId, suggestionsUrl, params); //Hack Event.observe(window, 'load', function() { try { Position.clone($(textInputId), $(suggestionsHolderId), { setHeight: false, offsetTop: $(textInputId).offsetHeight}); } catch(e){} });
我确实有完全相同的问题。该问题仅出现在IE中(也在8.0 beta中)
我尝试过的Firefox和Chrome都没有任何问题。
根据其他人的说法,这是由于HTML文件中的DOCTYPE声明所致。在这里检查:http://prototype.lighthouseapp.com/projects/8887/tickets/32-ajax-autocomplete-in-ie-with-doctype
该错误还在ruby开发板上得到了票证:http://dev.rubyonrails.org/ticket/11051
这两个链接都有解决此问题的解决方案。
希望该错误将在下一个版本的prototype / scriptaculous中修复:)
非常感谢入侵。我自己使用了它,但是对其进行了修改,因此仅在通过以下操作使用Ajax.Autocompleter时才调用它。
function positionAuto(element, entry) { setTimeout( function() { Element.clonePosition('choices_div', 'text_element', { 'setWidth': false, 'setHeight': false, 'offsetTop': $('text_element').offsetHeight } ); }, 300); return entry; } new Ajax.Autocompleter('text_element', 'choices_div', [url to web service], { paramName: 'fulltext', minChars: 2, callback: positionAuto, // See above [etc...]
由于回调是在发出实际请求之前调用的,因此在那一刻放置DIV最有意义。并且将确保即使调整窗口大小或者滚动窗口,DIV的位置也正确。令人发疯的是,为了使其始终如一地工作,我不得不将其包装在" setTimeout()"中。我没有尝试过多地使用不同的计时设置,但是如果可以使用的超时阈值较低,我想知道。
在IE 8和7上进行了测试,效果很好。并与其他真正的浏览器一起使用。希望这可以减轻一些编码人员在处理此问题时的头痛。
这是一个已知的Bug,该bug可以正常运行,但尚未包括在内。我们可以在此处了解更多信息:https://prototype.lighthouseapp.com/projects/8886-prototype/tickets/618-getoffsetparent-returns-body-for-new-hidden-elements-in-ie8-final#ticket- 618-9