#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть система меню с вкладками, и при нажатии на вкладку загружается определенная страница в соответствующий раздел вкладок.
В настоящее время у меня есть ряд следующих функций. Набор для каждой вкладки, и это создает довольно уродливый код. Могу ли я что-нибудь сделать, чтобы упростить и уменьшить повторение?
Каждый экземпляр «TAB» — это название вкладки, на которую был нажат. URL-адрес {% … %} раздел — это динамический URL-адрес Django.
Я думал, что если бы название вкладки и URL были помещены в массив видов, это, по крайней мере, позволило бы создавать все функции в массовом порядке. Но есть ли способ упростить его еще больше?
Спасибо за любую помощь.
function loadTABlog() {
$("#TABlog").load("{% url list_TABlog person.id %}", function(response, status, xhr) {
if (status == "error") {
var msg = "Sorry but there was an error: ";
$("#TABlog").html(msg xhr.status " " xhr.statusText);
}
});
return false;
};
$("#loadTABlog").click(function() {
$("#TABlog").empty().html('<img src="{{ STATIC_URL }}loading.gif" class="ajaxloader" />');
loadTABlog();
});
Ответ №1:
Я бы попытался сделать его управляемым данными. Что-то вроде
var tabs = [
{activator: "#loadTabLog",
element: "#tabLog",
url: "{% url list_tab_log 9000 %}"},
...
];
И выполните итерацию по нему, назначив обработчики:
for (var i = 0; i < tabs.length; i) {
var t = tabs[i];
$(t.activator).click(function() {
$(t.element).empty().html("<img>");
...
$(t.element).load(t.url.replace("9000", actual_user_id), ...);
});
}
Комментарии:
1. Привет, Аянами. Это интересная идея. Я попытался реализовать то, что вы предложили, но, похоже, работает только одна из вкладок — последняя. Если я удалю раздел активатора последних вкладок, он будет работать, но для новой последней вкладки.
2. И если я помещаю предупреждение в цикл for для t.url, он всегда показывает один и тот же URL, независимо от того, какая вкладка нажата.
3. @user973347 не видя кода или, предпочтительно, jsfiddle, я вообще не могу вам помочь ._.
4. $.each(вкладки, функция() { console.log(this.activator ‘ ‘ this.element); $(this.element).empty().html(‘<img src=»{{ STATIC_URL }}loading.gif » class=»ajaxloader» />’); $(this.element).load(this.url, функция (ответ, статус, xhr) { if (status == «ошибка») { var msg = «Извините, но произошла ошибка: «; $($(this).attr (‘href’)).html(msg xhr.status » » xhr.statusText); } возвращает false; }); });
5. jsfiddle.net/8tEA4 Это исправляет проблему. Теперь я понимаю, что из-за того, что это язык поздней привязки, «я» в цикле существовал только в конце цикла для использования. Следовательно, почему это всегда была последняя вкладка. Еще раз спасибо за вашу помощь, Аянами.