Я бы начал избавиться от встроенного кода '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
Причина, по которой я здесь использую async: false
, заключается в том, что по умолчанию aync имеет значение true, что означает, что запрос AJAX может быть передан только частично к тому времени, когда браузер увидит return: true
и уйдет со страницы.
Это то «состояние гонки», о котором я упоминал. Здесь это дешевый трюк, который позволяет избежать его, заставляя браузер фактически останавливаться до тех пор, пока запрос не будет выполнен, а затем позволяя браузеру щелкнуть ссылку.
Более сложным ответом было бы возвращение «false» (что приведет к уничтожению нативного поведения «переходить по ссылке») в браузерах, а затем перенаправление real , выполненное в функции complete
.
Это не без собственных проблем, и может привести к медленному поведению в браузере, когда запросы завершены, что позволяет пользователям время щелкать по другим ссылкам, которые, похоже, ничего не делают, а затем в конечном итоге один запрос проходит в произвольное время, и происходит случайное перенаправление.
Следовательно, передовые решения включают в себя блокирование остальной части страницы и предоставление некоторого рода индикации прогресса по завершении запроса.
(И, следовательно, сложность этого решения на порядок сложнее в простом примере, чем async: false
)