diff --git a/src/pretix/static/pretixbase/js/addressform.js b/src/pretix/static/pretixbase/js/addressform.js
index 3c5015756e..60890bcc66 100644
--- a/src/pretix/static/pretixbase/js/addressform.js
+++ b/src/pretix/static/pretixbase/js/addressform.js
@@ -2,10 +2,11 @@ $(function () {
"use strict";
$("select[data-country-information-url]").each(function () {
- let counter = 0;
+ let xhr;
const dependency = $(this),
+ loader = $("").hide().prependTo(dependency.closest(".form-group").find("label")),
url = this.getAttribute('data-country-information-url'),
- form = $(this).closest(".panel-body, form, .profile-scope"),
+ form = dependency.closest(".panel-body, form, .profile-scope"),
isRequired = dependency.closest(".form-group").is(".required"),
dependents = {
'city': form.find("input[name$=city]"),
@@ -15,17 +16,15 @@ $(function () {
'vat_id': form.find("input[name$=vat_id]"),
},
update = function (ev) {
- counter++;
- const curCounter = counter;
+ if (xhr) {
+ xhr.abort();
+ }
for (var k in dependents) dependents[k].prop("disabled", true);
- dependency.closest(".form-group").find("label").prepend(" ");
- $.getJSON(url + '?country=' + dependency.val(), function (data) {
- if (counter > curCounter) {
- return; // Lost race
- }
+ loader.fadeIn();
+ xhr = $.getJSON(url + '?country=' + dependency.val(), function (data) {
var selected_value = dependents.state.prop("data-selected-value");
if (selected_value) dependents.state.prop("data-selected-value", "");
- dependents.state.find("option").filter(function (t) {return !!$(this).attr("value")}).remove();
+ dependents.state.find("option:not([value=''])").remove();
if (data.data.length > 0) {
$.each(data.data, function (k, s) {
var o = $("