2012-02-01 26 views
5

Tôi có AutoCompleteExtender trên trang hoạt động tốt nhưng khi tôi cuộn xuống trang và sử dụng nó, đề xuất hiển thị ở vị trí sai (dọc).
Điều này xảy ra với Safari & Chrome nhưng không phải với IE & FF và vì vậy tôi nghĩ rằng đó có thể là lỗi của webkit.
Heres mã:AutoCompleteExtender có vị trí sai, đối với trình duyệt webkit, sau khi cuộn xuống trang

<td> 
     <div style="position: relative;"> 
      <asp:TextBox ID="DepartureAirportTextBox" runat="server" CssClass="DepartureAirport airport-textbox" 
          onblur="javascript:DepartureLostFocus();" onkeydown="javascript:DepartureChanged(event);"></asp:TextBox> 
      <asp:Panel ID="DepartureAutocompleteDropDownPanel" runat="server" ScrollBars="Vertical" 
          CssClass="autocomplete-panel" Style="display: none;" /> 
      <AjaxControlToolkit:AutoCompleteExtender ID="DepartureAirportAutoComplete" runat="server" 
          TargetControlID="DepartureAirportTextBox" CompletionSetCount="200" ServicePath="../WebServices/SecureService.asmx" 
          ServiceMethod="ListAirports" MinimumPrefixLength="3" BehaviorID="DepartureAirport" 
          CompletionListElementID="DepartureAutocompleteDropDownPanel" OnClientItemSelected="SelectDepartureAirport" 
          OnClientPopulating="ShowDepartureIcon" OnClientPopulated="HideDepartureIcon"> 
      </AjaxControlToolkit:AutoCompleteExtender>    
    </div> 
</td> 

Tôi đã thử this & this giải pháp trên SO, nhưng không ai làm việc.
Cách khắc phục?

Cập nhật:
Thậm chí the simplest example từ Microsoft có sự cố này. Thêm một số phần tử <p> trước và sau hộp văn bản & bộ mở rộng để tạo vùng có thể cuộn và kiểm tra nó.

<asp:TextBox ID="txtMovie" runat="server"></asp:TextBox> 
     <AjaxControlToolkit:AutoCompleteExtender ID="AutoCompleteExtender1" TargetControlID="txtMovie" 
      runat="server" UseContextKey="True" MinimumPrefixLength="2" ServiceMethod="GetCompletionList" /> 

Lấy mã cho GetCompletionList từ liên kết ở trên. Vấn đề này rất dễ tái sản xuất.

+0

Tôi nghĩ rằng điều này phải được thực hiện bởi một trong đó đã thực hiện tự động hoàn này. Tôi nghĩ rằng vấn đề là render cuối cùng, menu thả không nằm trong div với hộp văn bản và css cũng cần sửa chữa. – Aristos

Trả lời

6

Tôi đã tìm thấy solution on Asp.net forums.

function resetPosition(object, args) { 
    var tb = object._element; 
    var tbposition = findPositionWithScrolling(tb); 
    var xposition = tbposition[0]; 
    var yposition = tbposition[1] + 20; // 22 textbox height 
    var ex = object._completionListElement; 
    if (ex) 
     $common.setLocation(ex, new Sys.UI.Point(xposition, yposition)); 
} 
function findPositionWithScrolling(oElement) { 
    if (typeof (oElement.offsetParent) != 'undefined') { 
     var originalElement = oElement; 
     for (var posX = 0, posY = 0; oElement; oElement = oElement.offsetParent) { 
      posX += oElement.offsetLeft; 
      posY += oElement.offsetTop; 
      if (oElement != originalElement && oElement != document.body && oElement != document.documentElement) { 
       posX -= oElement.scrollLeft; 
       posY -= oElement.scrollTop; 
      } 
     } 
     return [posX, posY]; 
    } else { 
     return [oElement.x, oElement.y]; 
    } 
} 

Gọi resetPosition về sự kiện OnClientShown Extender của

+0

Vẫn tự hỏi những gì $ phổ biến! Nó là một thể hiện của lớp Sys.UI.DomElement? –

+3

Tốt hơn nên sử dụng tb.clientHeight với 20 "số ma thuật". – aleyush

Các vấn đề liên quan