jQuery это нормально, чтобы явно назначить свойство длины .queue ()? - PullRequest
3 голосов
/ 23 августа 2011

Я новичок в jQuery, и первое, что я сделал, это то, что я считаю классической задачей: анимировать выпадающее меню.#navBar - это div, содержащий ul, и меню открывается, когда пользователь наводит курсор мыши на li.Вот код:

$(document).ready(function()
{
     $("#navBar>ul>li").hover(function()
     {
         var $menu = $(this).find("div");
         if ($menu.queue().length > 1) $menu.queue().length = 1;
         $menu.slideDown(200).css("z-index", "1");
     },
     function()
     {
         $(this).find("div").delay(500).slideUp(400).css("z-index","0");
     });
});

Мой вопрос относится к строке:

if ($menu.queue().length > 1) $menu.queue().length = 1;

Я сделал это, чтобы избежать проблемы постановки в очередь бесконечных анимаций, избегая при этом скачка использования стопа (правда правда).Это прекрасно работает, но я чувствую себя неловко из-за явного назначения длины очереди (никакой другой язык программирования, с которым я знаком, не позволяет мне делать это).

Я боюсь, что, назначая длину, я простоограничение того, насколько далеко заходит очередь jQuery, но не удаление фактически помещенных в очередь анимаций и, возможно, утечка памяти.На самом деле я хотел бы просто удалить любые анимации, находящиеся в очереди, кроме первой, но, похоже, не могу найти способ сделать это.

В любом случае, как я уже сказал, теперь он работает отлично.Может кто-нибудь сказать мне, если я делаю что-то глупое?

Ответы [ 2 ]

1 голос
/ 23 августа 2011

Видимо, присваивание свойству длины в порядке:

http://www.w3schools.com/jsref/jsref_length_array.asp

Если вы присвоите значение свойству length массива, которое меньше фактической длины массива, элементы после назначенной длины будут потеряны.

Хорошая статья здесь:

http://www.bloggingdeveloper.com/post/JavaScript-Array-Length-Property.aspx

0 голосов
/ 23 августа 2011

То, что вы ищете, не возможно, и то, что вы сделали, не сработает.Но вы можете достичь того, чего хотите, и другим способом.Попробуйте это, в основном проверяя, что элемент уже анимируется. Ничего не делайте, дайте ему завершить анимацию.

$(document).ready(function()
{
     $("#navBar>ul>li").hover(function()
     {
         var $menu = $(this).find("div");
         if(!$menu.is(":animated")){
             $(this).find("div").slideDown(200).css("z-index", "1");
         }
     },
     function()
     {
         var $menu = $(this).find("div");
         if(!$menu.is(":animated")){
             $(this).find("div").delay(500).slideUp(400).css("z-index","0");
         }
     });
});

Надеюсь, это вам поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...