Итак, три маленькие части:

1) MaxMind geo IP lookup, который получает нам код страны через IP-адрес:

var onSuccess = function(x){

var ip = x.traits.ip_address;
document.getElementById('ip_address').value = ip;

var country_code = x.country.iso_code;
document.getElementById('ip_country_code').value = country_code;

…

};

2) массив ссылок на страны с десятичными процентами налога:

// Array of values for tax rates
var tax_rates= new Array();
tax_rates["noteu"]=0.0;
tax_rates["ES"]=21.0;
tax_rates["AU"]=20.5;
tax_rates["BE"]=21.7;
…

3) функция TaxPrice, которая использует один из этих десятичных знаков для расчета налога, а затем общую сумму, подлежащую оплате в форме подписки. Обратите внимание на XXXXX:

function TaxPrice()
{
var taxprice=0;
XXXXX
return taxprice;
}

Бит document.getElementById в 1), очевидно, может обновить скрытое поле или какой-либо другой элемент HTML.

Я знаю, что делать с XXXXX, если это выпадающий список, который пользователь должен выбрать.

Но как получить десятичный налог из массива в функцию TaxPrice на основе кода страны IP-адреса? (т. е. в JavaScript, без обновления элемента HTML).

Счастливого нового года всем.

ОБНОВЛЕНИЕ: просто, чтобы быть ясным, мне не нужно знать, как получить его в раскрывающемся списке, я уже могу это сделать, и в этом случае использования, пользователь не должен иметь права выбирать свою собственную страну налогообложения, это должно быть устанавливается автоматически в зависимости от IP-адреса. Таким образом, формулировка без кода будет выглядеть примерно так:

taxprice EQUALS tax_rate.value ACCORDING TO ip_address_code

0
Matthew Bennett 7 Янв 2017 в 01:56

3 ответа

Лучший ответ

Итак, спасибо за ваши предложения. Не уверен, что я понимаю, как это работает точно, но после некоторого возни, теперь это так. По сравнению с кодом в исходном вопросе мне пришлось:

1) Добавьте глобальную переменную вверху, помимо всего прочего, не связанную с поисковым кодом IP (то есть теперь нет ссылки на country_tax в переменной IP onSuccess):

var country_tax;

2) Замените XXXXX в функции TaxPrice на:

var country_tax = document.getElementById("ip_country_code").value;
var taxprice = taxes_from_database[country_tax];

Таким образом, полная функция TaxPrice заканчивается как:

function TaxPrice() 
{
var taxprice = 0;
var country_tax = document.getElementById("ip_country_code").value;
var taxprice = tax_rates[country_tax];
return taxprice;
}

Кажется, нет необходимости во вложенных функциях, замыканиях или в чем-то очень сложном. Не имеет значения (для кода), если tax_rate настроены как массив или объект, результат тот же, хотя я хотел бы понять, почему вы рекомендуете объект над массивом в этом случае.

И, учитывая, что TaxPrice получает значение из поля формы, а не из функции IP onSuccess, я не знаю, зачем мне нужно объявление глобальной переменной вверху, если кто-то хочет объяснить, что…

0
Matthew Bennett 7 Янв 2017 в 10:23

Один из способов сделать это - установить глобальную переменную selectedCountryCode внутри вашего успешного обратного вызова и ссылку tax_rates[selectedCountryCode] в вашем массиве TaxPrice (который должен быть объектом, как указано в nnnnnn)

(function () {
  var selectedCountryCode = "";
  var onSuccess = function(x) {

    var ip = x.traits.ip_address;
    document.getElementById('ip_address').value = ip;

    selectedCountryCode = x.country.iso_code; // <-- Set selectedCountryCode for later use
    document.getElementById('ip_country_code').value = selectedCountryCode; // <-- Set dropdown value

  };

  document.getElementById("ip_country_code").addEventListener("change", function() {
    selectedCountryCode = this.value;
    console.log(TaxPrice());
  });

  // Object of values for tax rates
  var tax_rates = {};
  tax_rates["noteu"] = 0.0;
  tax_rates["ES"] = 21.0;
  tax_rates["AU"] = 20.5;
  tax_rates["BE"] = 21.7;


  function TaxPrice() {
    var taxprice = 0;
    taxprice = tax_rates[selectedCountryCode];
    return taxprice;
  }
})();
Change Me: <select id="ip_country_code">
  <option value="noteu">noteu</option>
  <option value="ES">ES</option>
  <option value="AU">AU</option>
  <option value="BE">BE</option>
</select>
0
mhodges 6 Янв 2017 в 23:41

Вы ищете что-то вроде свойств элемента? Mydiv.tax = taxvalue ; Свойства Элементов - это элегантный способ связи между различными функциями. Вы можете присвоить любое значение любому элементу. Вы можете извлечь значение из любой функции в JavaScript, пока действует элемент Basic.

0
Frank34 6 Янв 2017 в 23:09