Вторая функция должна выполняться только один раз, когда страница загружается, верно?
Таким образом, вместо $('.overview_table_header').ready(function() {
просто используйте $(function() {
, что сокращенно для document.ready / document.onLoad.
Цикл, вероятно, происходит, потому что обратный вызов ajax что-то изменил в '.overview_table_header'
, снова вызвав .ready()
.
Я бы переписал код следующим образом:
$('.overview_table_header').click(function() {
sort($(this))
});
$(function() { // when page is loaded
sort()
});
sort(param) {
var col, dir;
dir= $("#sortDirection").val();
if (!param) { // first run
col = $("#sortColumn").val();
} else {
col = $.trim(param.text()); // This is dangerous! (1)
$("#sortColumn").val(col);
}
$.get("/sort", { col: col, sort: dir},
function(data) {
$('#pages').html(data.html);
$("#sortDirection").val(data.sort);
}
);
});
Секретные данные стали бы такими:
<input type="hidden" id="sortColumn" name="sortColumn" value="date" />
<input type="hidden" id="sortDirection" name="sortColumn" value="asc" />
Некоторые заметки:
- Не используйте имена, такие как secretdata / first / last, для хранения ваших переменных, кто-то, имеющий дело с этим кодом, в будущем очень запутается (даже вы, через несколько месяцев).
- Вам лучше хранить это в скрытых входах, они даже распространяются автоматически, если вы отправляете форму
- (1) Получение имени столбца из
$.trim(param.text());
опасно, лучше передать нормализованное имя столбца, например, в атрибут data-columnName
и получить его с помощью .data("columnName")
- Я не понимаю, почему вы сохраняете направление два раза (secredata и header: sort-sort), поэтому я изменил только одно место хранения.