我正在使用Scripatculous Autocompleter 1.9.0。我的问题是结果列表div的位置在Chrome和Firefox中不正确,但在IE中有效。结果列表div显示在文本框的顶部。我能够修改controls.js并修复问题,但我想知道我是否在使用样式表做错了。这是我的代码:
style.css:
div#autocomplete
{
position: relative;
}
input#query {
width:500px;
}
div#answerlist {
width:500px;
max-height:700px;
overflow-y:scroll;
overflow-x:auto;
border:1px solid #CCCCCC;
}
index.phtml:
<div id="webphone" style="width: 1000px">
<center>
<label>Search:</label>
<input type="text" name="query" id="query"></input>
</center>
<div id="answerlist"></div>
</div>
<script type="text/javascript">
new Ajax.Autocompleter("query","answerlist","index/search", {frequency: 0.5, minChars: 1});
</script>
我尝试取消嵌套div和所有元素的“位置”选项的许多其他变体。没有任何效果。
然后,我开始使用controls.js Autocompleter.create函数和onShow函数:
controls.js:
function(element, update){
if(!update.style.position || update.style.position=='absolute') {
/***alert(update.style.position);***/
update.style.position = 'absolute';
Position.clone(element, update, {
setHeight: false,
offsetTop: element.offsetHeight
});
}
Effect.Appear(update,{duration:0.15});
};
首先,即使我将answerlist的位置样式显式设置为relative或absolute,alert函数也总是返回一个空字符串。其次,即使脚本明确地使位置绝对并定位元素,最终位置也是不正确的!我是唯一一个经历过这种情况的人吗?我在linux和windows上尝试过很多版本的chrome和firefox。我一定做错了什么。当然,我可以通过注释掉这部分代码并使用绝对定位来定位div元素来解决问题。但我不想这样做......
答案 0 :(得分:4)
在遇到同样的问题之后,我找到了解决方案并在https://prototype.lighthouseapp.com/projects/8886/tickets/1286-error-in-elementcloneposition#ticket-1286-1
打开了一张票那里描述了修复,但基本上,Element.clonePosition具有以下内容:
if (parent == document.body) {
delta[0] -= document.body.offsetLeft;
delta[1] -= document.body.offsetTop;
}
必须替换为:
if (parent == document.body) {
var parentOffset = Element.viewportOffset(parent);
delta[0] -= parentOffset[0];
delta[1] -= parentOffset[1];
}