Я бы начал избавляться от встроенного кода 'onclick' и привязывать событие позже:
<a href="http://google.com" rel="outbound" >Click</a>
$("a[rel=outbound]").click(function(){
var url = this.href;
$.ajax({
async: false,
type: "POST",
url: "Logger.ff", //dynamic url to logging action
data: {
sid: 'abc123' //random data
clicked: url
},
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
cache: false
});
return true;
});
Кроме того, у вас может возникнуть "состояние гонки". В моем примере я установил для async значение false.
Это остановит возврат функции и переход по ссылке до того, как запрос будет выполнен.
Об асинхронном
Причина, по которой я использую здесь async: false
, заключается в том, что по умолчанию aync имеет значение true, что означает, что запрос AJAX может быть передан только частично к тому времени, когда браузер увидит return: true
и уйдет со страницы.
Это то самое «состояние гонки», о котором я упоминал. Здесь это дешевый трюк, который позволяет избежать этого, заставляя браузер фактически останавливаться до тех пор, пока запрос не будет завершен, а затем позволяя браузеру щелкнуть ссылку.
Более изощренным ответом было бы вернуть "false" (что убьет встроенное в браузер поведение "follow link"), а затем выполнить настоящее перенаправление в функции complete
.
Это не лишено собственных проблем и может привести к замедлению просмотра при выполнении запросов, что дает пользователям время щелкнуть другие ссылки, которые, по-видимому, ничего не делают, а затем в конечном итоге один запрос проходит в случайное время, и, казалось бы, случайный происходит перенаправление.
Следовательно, продвинутые решения включают в себя блокировку остальной части страницы и предоставление какой-либо индикации хода выполнения запроса.
(И, следовательно, сложность этого решения на порядок сложнее реализовать на простом примере, чем async: false
)
person
Kent Fredric
schedule
19.03.2009