2016-11-03 9 views
0

У меня есть таблица, в которой я могу щелкнуть строки() классом .details. Это покажет div с id="details" с дополнительной информацией об элементе в строке.slideUp и slideDown jQuery

У меня есть следующий код.

$('.details').click(function() { 
    $('#details').slideUp('slow'); 
    $('#details').load($(this).data('url'), { id: $(this).data('id') }, function() { 
     $(this).slideDown('slow'); 
    }); 
}); 

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

$('#details').slideUp('slow', function() { 
    $('#details').load($(this).data('url'), { id: $(this).data('id') }, function() { 
     $(this).slideDown('slow'); 
    }); 
}); 

Однако это не позволяет коду работать. Кто-нибудь есть идея о том, как это решить?

Спасибо.

EDIT:

Моя строка таблицы выглядит следующим образом:

<tr class="details" data-id="@item.VehicleID" data-url="@Url.Action("Details", "Vehicle")"> 
</tr> 

Мой ДИВ выглядит следующим образом:

<div id="details"></div> 
+1

Код выглядит хорошо. Уверены ли вы, что у вас есть другие ошибки js на вашей странице? проверьте свою консоль браузера – Shyju

+0

В консоли нет ошибок, и этот фрагмент кода является единственным в моем скрипте. – Zeliax

+0

Вы говорите, что слайд-шоу не работает? – Shyju

ответ

1

Одна из проблем, я вижу, с кодом, вы используете $(this).data('url') для получения значения атрибута данных url, установленного в tr, которое было нажато. но $(this) на самом деле $('#details') там, потому что вы обращаетесь к нему внутри слайд-модуля $('#details'), у которого нет атрибута данных url. Поэтому вы должны получить сообщение об ошибке

Решение состоит в том, чтобы назначить $(this) (щелкнув строку) на локальную переменную и использовать ее внутри вашей другой функции обратного вызова.

Это должно сработать.

$(function() { 


    $('.details').click(function() { 
     var _this = $(this); 

     $('#details').slideUp('slow', function() { 
      $('#details').load(_this.data('url'), { id: _this.data('id') }, function() { 
       $('#details').slideDown('slow'); 
      }); 
     }); 
    }); 

}); 
+0

Спасибо. Я думал, что это будет что-то вроде этого. Может ли это быть сделано с помощью «родителя» каким-либо образом? Однако я считаю, что это самое чистое решение. – Zeliax

+1

. Вы можете использовать родительский метод, но если вы введете другой элемент DOM между кодами, он сломается.Поэтому я считаю, что чтение и хранение локальной переменной - хорошая идея. или вы можете прочитать значение url и id из $ (this), прежде чем выполнять вызов slideUp, сохранить в локальной переменной и использовать это. – Shyju