2013-08-13 2 views
1

У меня на моей странице довольно простой jquery-ui блок автозаполнения. HTML прост и выглядит следующим образом:jQuery-ui автозаполнение текстового поля закрывается на мышь над

<div class="control-group"> 
    <label for="addCampaignUser"></label> 
    <div class="controls"> 
     <input id="addCampaignUser" /> 
     <button id="addCampaignUserButton">Add User</button> 
    </div> 
</div> 

JavaScript является немного более сложным, но все же не так уж плохо:

$('#addCampaignUser').autocomplete({ 
    minLength: 2, 
    source: function (request, response) { 
     var term = request.term; 
     if (term in cache) { 
      response(cache[term]); 
      return; 
     } 

     $.post("@Url.Action("ForCampaignAutoComplete", "CustomerUser")", { "searchTerm": request.term }) 
      .done(function (data) { 
       console.log('{request: ' + JSON.stringify(request) + "}"); 
       console.log('{data: ' + JSON.stringify(data) + "}"); 
       cache[request.term] = data; 
       response(data); 
      }) 
      .fail(function (err) { 
       console.error(err); 
      }); 
    }, 
    select: function (event, ui) { 
     console.log(ui.item ? "Selected: " + ui.item.Name : "Nothing selected, input was " + this.value); 
    }, 
    close: function(event, ui) { 
     console.log("closed: " + event); 
    } 
}) 
.data("ui-autocomplete")._renderItem = function (ul, item) { 
    return $("<li>").append("<a>" + item.Name + " (" + item.CustomerName + ")</a>").appendTo(ul); 
}; 

Все, кажется, работает, как ожидалось:

Working jquery-ui-autocomplete

Проблема заключается в том, что, как только я нахожусь над любым из элементов в списке, или если я попытаюсь выбрать один из элементов с помощью стрелки вверх/вниз, список закрывается, (или select или focus событий).

Я попытался удалить <a> тегов вокруг item.Name в .data("ui-autocomplete") обработчике, например, так:

 .data("ui-autocomplete")._renderItem = function (ul, item) { 
      return $("<li>").append(item.Name + " (" + item.CustomerName + ")").appendTo(ul); 
     }; 

Это фиксирует Автозакрытие проблемы, но никогда ничего не получает выбрано.

Я попытался отключить все различные надстройки и библиотеки, которые могут мешать, но пока ничего. Я использую jquery-2.0.3.js и jquery-ui-1.10.3.js.

Я делаю что-то явно неправильно?

[Edit: Включая код для всей страницы, в соответствии с просьбой]

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="utf-8"> 
    <title></title> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <link href="/Content/bootstrap?v=j_-_1Zyowtnxf-sjdU3kRasY7Qp7ZP_jWGqEkV333nA1" rel="stylesheet"/> 

     <!-- Le HTML5 shim, for IE6-8 support of HTML5 elements --> 
    <!--[if lt IE 9]> 
     <script src="/scripts/html5shiv.js"></script> 
    <![endif]--> 


</head> 
<body> 
    <div class="navbar navbar-fixed-top"> 
     <div class="navbar-inner"> 
      <div class="container"> 
       <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse"> 
        <span class="icon-bar"></span> 
        <span class="icon-bar"></span> 
        <span class="icon-bar"></span> 
       </a> 
       <a class="brand" href="/">Payboard</a> 
       <div class="nav-collapse collapse"> 
        <ul class="nav"> 
         <li><a href="/customer/index">Customers</a></li><li><a href="/campaign/index">Campaigns</a></li><li><a href="/integration/index">Integrations</a></li><li><a href="/account/index">Account</a></li><li><a href="/account/logout">Logout</a></li><li><a href="/test/index">Test</a></li> 
        </ul> 
       </div> 
      </div> 
     </div> 
    </div> 
    <div class="container"> 



     <h2>AutoComplete</h2> 

<h4>End users assigned to the campaign</h4> 
<div class="control-group"> 
    <label for="addCampaignUser"></label> 
    <div class="controls"> 
     <input id="addCampaignUser" /> 
     <button id="addCampaignUserButton">Add User</button> 
    </div> 
</div> 




     <hr> 
     <footer> 
      <p>&copy; Payboard 2013</p> 
     </footer> 
    </div> 
    <script src="/Scripts/jquery-2.0.3.js"></script> 
<script src="/Scripts/jquery-ui-1.10.3.js"></script> 
<script src="/Scripts/jquery.unobtrusive-ajax.js"></script> 
<script src="/Scripts/jquery.validate.js"></script> 
<script src="/Scripts/jquery.validate.unobtrusive-custom-for-bootstrap.js"></script> 
<script src="/Scripts/jquery.validate.unobtrusive.js"></script> 
<script src="/Scripts/flot/jquery.flot.js"></script> 
<script src="/Scripts/flot/jquery.flot.time.js"></script> 
<script src="/Scripts/flot/jquery.flot.stack.js"></script> 
<script src="/Scripts/flot/jquery.flot.categories.js"></script> 
<script src="/Scripts/bootstrap.js"></script> 

    <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script> 

    <!-- Payboard JS bundle --> 
    <script src="/Scripts/knockout-2.3.0.debug.js"></script> 
<script src="/Scripts/jquery.event.drag.js"></script> 
<script src="/Scripts/SlickGrid/slick.core.js"></script> 
<script src="/Scripts/SlickGrid/slick.formatters.js"></script> 
<script src="/Scripts/SlickGrid/slick.grid.js"></script> 
<script src="/Scripts/require.js"></script> 
<script src="/Scripts/jquery.signalR-1.1.3.js"></script> 
<script src="/Scripts/linq.js"></script> 
<script src="/Scripts/Payboard/Main.js"></script> 
<script src="/Scripts/dateformat.js"></script> 


    <script type="text/javascript"> 

     // Payboard.ready(function() { 
     $(function() { 

      var cache = {}; 

      $('#addCampaignUser').autocomplete({ 
       minLength: 2, 
       source: function (request, response) { 
        var term = request.term; 
        if (term in cache) { 
         response(cache[term]); 
         return; 
        } 

        $.post("/CustomerUser/ForCampaignAutoComplete", { "searchTerm": request.term }) 
         .done(function (data) { 
          console.log('request: ' + JSON.stringify(request)); 
          console.log('data: ' + JSON.stringify(data)); 
          cache[request.term] = data; 
          response(data); 
         }) 
         .fail(function (err) { 
          console.error(err); 
         }); 
       }, 
       select: function (event, ui) { 
        console.log(ui.item ? "Selected: " + ui.item.Name : "Nothing selected, input was " + this.value); 
       }, 
       focus: function (event, ui) { 
        console.log(ui.item ? "Focused: " + ui.item.Name : "Nothing focused, input was " + this.value); 
       } 
      }) 
      .data("ui-autocomplete")._renderItem = function (ul, item) { 
       return $("<li>").append("<a>" + item.Name + " (" + item.CustomerName + ")</a>").appendTo(ul); 
       // return $("<li>").append(item.Name + " (" + item.CustomerName + ")").appendTo(ul); 
      }; 
     }); 

    </script> 

</body> 
</html> 
+0

Можете ли вы представить весь HTML-код, похоже, проблема в ссылках на сценарий ... Он работает на моем конце. –

+1

Помимо вызовов сервера, [this example] (http://jsfiddle.net/erMRf/) отражает ваш код? Кроме того, вы дважды загружаете jQueryUI, можете ли вы удалить вторую ссылку и посмотреть, помогает ли это вообще? –

+0

@AndrewWhitaker - Это был jquery-ui, загружаемый дважды, что вызвало проблему. Я удалил второй груз, и все это начало работать. Большое спасибо - я пропустил это, потому что он загружался в двух отдельных местах. Бросьте его в ответ, и я дам вам кредит :-). –

ответ

4

Похоже, вы в том числе jQueryUI дважды. После того, как здесь:

<script src="/Scripts/jquery-ui-1.10.3.js"></script> 

и снова здесь:

<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script> 

Это может быть причиной вашей проблемы - удалить одну из ссылок.

Смежные вопросы