как использовать ajax с jquery для получения файла json

#javascript #jquery #json #ajax

#javascript #jquery #json #ajax

Вопрос:

У меня есть файл json, который я хочу добавить в код с помощью ajax. Но я не могу заставить его работать. Я мало что знаю об ajax и jQuery.

В файле json есть массив, который я хочу использовать в разных частях кода js. Кроме того, я создал переменную для выделения и использования файла json из ajax, но я не знаю, как использовать ее в остальной части кода, чтобы получить данные внутри.

Ниже приведен ajax, с которым у меня возникли проблемы.

Это JavaScript

 function Guardar() {
    datosJSON.nombre = document.getElementById('nombre').value;
    datosJSON.edad = document.getElementById('edad').value;
    datosJSON.email = document.getElementById('email').value;
    datosJSON.telefono = document.getElementById('telefono').value;
    localStorage.setItem('datosSolictante', JSON.stringify(datosJSON));
} // Cierre funcion guardar


function checkData() {
    console.log(todaInfo);
    console.log(((nombre.value) amp;amp; (edad.value) amp;amp; (email.value) amp;amp; (telefono.value)));
    if ((nombre.value) amp;amp; (edad.value) amp;amp; (email.value) amp;amp; (telefono.value)) {
    console.log(todaInfo);
    todaInfo.innerHTML = ` ${nombre.value} ${edad.value} ${email.value} ${telefono.value}  `;
}} // Cierre funcion checkData


window.onload = function() {
    let todaInfo = document.getElementById('todaInfo');
    let info = document.getElementById('info');
    console.log(todaInfo);
    console.log(info);
    todaInfo.innerHTML = '';
    var guardado = document.getElementById('guardado');
    guardado.addEventListener("click", function () {
    if (checkData) {
        guardado.innerHTML = "Guardado";
    }
});
};

guardado.addEventListener("click", function() {
    if ((nombre.value.length > 0) amp;amp; (edad.value.length > 0) amp;amp; (email.value.length > 0) amp;amp; (telefono.value.length > 0)) {
        info.innerHTML  = "<th>Informacion del cliente</th><tr><td>Nombre: "   nombre.value   "</tr></td><tr><td>Edad: "   edad.value   "</tr></td><tr><td>Email: "   email.value   "</tr></td><tr><td>Telefono: "   telefono.value   "</td></tr>"; 
    }
    nombre.value = "";
    edad.value = "";
    email.value = "";
    telefono.value = "";
});



var archivoAjax = $.ajax();
  
$.ajax({
      url: 'autos.JSON',
      dataType: 'json',
      success: function (data, status, jqXHR) {
        console.log(data);        
        },
        error: function (jqXHR, status, error) {
          console.log(jqXHR),
          console.log(`Error -> Status: ${status} - Error: ${error}`);
        }  
    });


// Constructor
class Seguro {
    constructor(marca, modelo, year, tipo, precio) {
      this.marca = marca;
      this.modelo = modelo;
      this.year = year;
      this.tipo = tipo;
      this.precio = precio;
    }
  
    // Realiza la cotización con los datos
    cotizarSeguro() {
      const base = 1000;
      let poliza = ((this.precio * 0.05) / 12);
  
      if (poliza < 1000) {
        poliza  = base;
      }
      // Leer el año
      const diferencia = new Date().getFullYear() - this.year;
  
      // Cada año que la diferencia es mayor, el costo va a reducirse un 3%
      poliza -= ((diferencia * 3) * poliza) / 100;
  
      //Si el seguro es completo se multiplica por un 30% más
      if (this.tipo === 'terceros-ampliada') {
        poliza *= 1.30;
      } else if (this.tipo === 'todo-riesgo') {
        poliza *= 1.45;
      }
  
      return poliza;
    }
  }
  
  window.onload = () => {
    //Selecciono los select de Marca y Modelo
    const selectMarca = document.querySelector('#marca');
    const selectModel = document.querySelector('#modelo');
  
    //Selecciono el formulario
    const formulario = document.querySelector('#cotizar-seguro');
  
    //Manejador de evento "submit" del formulario
    formulario.addEventListener('submit', cotizarSeguro);
  
    //Llamo función lista select para armar un arreglo con las distintas marcas
    const marcas = listaSelect(archivoAjax, "marca");
  
    //Cargo las marcas en el Select
    cargarContenido(marcas, selectMarca);
  
    //Cargar fechas
    llenarFecha();
  
    //Manejador de evento "change" del select de marca (Cuando el usuario selecciona una marca)
    selectMarca.addEventListener('change', (e) => {
      //Borro el contenido del select de Modelo
      selectModel.innerHTML = '<option value=""> Seleccionar </option>';
  
      //Filtro el arreglo de autos y me quedo con los que tienen la marca seleccionada
      const modelos = archivoAjax.filter(elem => elem.marca.toLowerCase().replace(' ', '-') == e.target.value);
  
      //Llamo función lista select para armar un arreglo con los distintos modelos
      const listaModelos = listaSelect(modelos, "modelo");
  
      //Cargo los modelos en el select de modelos
      cargarContenido(listaModelos, selectModel);
    });
  } // Cierre de windows.onload
  
  //Función para generar y cargar en el select de Año los distintos años
  function llenarFecha() {
    const max = new Date().getFullYear(),
      min = max - 70;
  
    const selectYear = document.querySelector('#year');
  
    for (let i = max; i > min; i--) {
      let option = document.createElement('option');
      option.value = i;
      option.textContent = i;
      selectYear.appendChild(option);
    }
  } // Cierre funcion llenarFecha
  
  // Cargo contenido en los Select
  function cargarContenido(array, select) {
    array.forEach(element => {
      let option = document.createElement('option');
      option.value = element.toLowerCase().replace(' ', '-');
      option.textContent = element;
      select.appendChild(option);
    })
  } // Cierre funcion cargarContenido
  
  
  // Genero listado (arreglo) para los select
  function listaSelect(array, key) {
    const listado = [];
  
    array.forEach(elem => {
      if (!listado.includes(elem[key])) {
        listado.push(elem[key]);
      }
    })
    return listado.sort();
  } // Cierre funcion listaSelect
  
  //Función manejadora para el evento "submit" del formulario
  function cotizarSeguro(e) {
    e.preventDefault();
  
    // Leer la marca seleccionada
    const marca = document.querySelector('#marca').value;
  
    // Leer la marca seleccionada
    const modelo = document.querySelector('#modelo').value;
  
    // Leer el año seleccionado
    const year = document.querySelector('#year').value;
  
    // Leer el tipo de cobertura
    const tipo = document.querySelector('input[name="tipo"]:checked').value;
  
    //Verifico que no haya campos vacíos
    if (marca === '' || modelo === '' || year === '' || tipo === '') {
      mostrarMensaje('Todos los campos son obligatorios', 'error');
      return;
    }
  
    mostrarMensaje('Cotizando...', 'exito');
  
    // Ocultar las cotizaciones previas 
    const resultados = document.querySelector('#resultado div');
    if (resultados != null) {
      resultados.remove();
    }
  
    //Busco el precio del modelo seleccionado
    price = archivoAjax.find(elem => (elem.marca.toLowerCase().replace(' ', '-') == marca.toLowerCase() amp;amp; elem.modelo.toLowerCase().replace(' ', '-') == modelo.toLowerCase()));
  
    // Instanciar el seguro
    const seguro = new Seguro(marca, modelo, year, tipo, price.precio);
  
    //Llamo al método cotizarSeguro de la clase Seguro
    const valorPoliza = seguro.cotizarSeguro();
  
    // Muestro resultado de la cotización
    mostrarResultado(valorPoliza, seguro);
  } // Cierre funcion cotizarSeguro
  
  //Función para mostrar un mensaje
  function mostrarMensaje(mensaje, tipo) {
    //Creo un div para mostrar el mensaje
    const div = document.createElement('div');
  
    if (tipo === 'error') {
      div.classList.add('error');
    } else {
      div.classList.add('correcto');
    }
  
    //Agrego clases y contenido al div
    div.classList.add('mensaje', 'mt-10');
    div.textContent = mensaje;
  
    // Insertar en el HTML
    const formulario = document.querySelector('#cotizar-seguro');
    formulario.insertBefore(div, document.querySelector('#resultado'));
  
    //Mantener el mensaje por 2 segundos y después borrarlo
    setTimeout(() => {
      div.remove();
    }, 2000);
  } // Cierre funcion mostrarMensaje
  


  //Función para mostrar el resultado del cálculo de la póliza
  function mostrarResultado(valorPoliza, seguro) {
  
    //Destructuring del objeto seguro
    let {marca, modelo, year, tipo, precio } = seguro;
  
    //Configuro un formateador para la poliza y otro para el precio del auto
    const options1 = { style: 'currency', currency: 'ARS', minimumFractionDigits: 0 };
    const options2 = { style: 'currency', currency: 'ARS', minimumFractionDigits: 2 };
    const formatoPrecio = new Intl.NumberFormat('es-AR', options1);
    const formatoPoliza = new Intl.NumberFormat('es-AR', options2);
  
    // Creo div para mostrar resultado
    const div = document.createElement('div');
    div.classList.add('mt-10');
  
    div.innerHTML = `
      <p class="header">Resumen de Cotización para ${datosJSON.nombre}</p>
      <p class="font-italic">Marca: ${marca.toUpperCase().replace('-', ' ')} </p>
      <p class="font-italic">Modelo: ${modelo.toUpperCase().replace('-', ' ')}  </p>
      <p class="font-italic">Año: ${year} </p>
      <p class="font-italic">Suma Asegurada: ${formatoPrecio.format(precio)}  </p>
      <p class="font-italic">Tipo de Cobertura: ${tipo.toUpperCase().replace('-', ' ')}  </p>
      <p class="font-italic">Suma Asegurada: ${formatoPoliza.format(valorPoliza)}  </p>
      `;
  
    //Selecciono el div "#resultado" donde voy a insertar la información
    const resultadoPoliza = document.querySelector('#resultado');
  
    // Mostrar el spinner
    const spinner = document.querySelector('#cargando');
    spinner.style.display = 'block';
  
    setTimeout(() => {
      //Luego de 2 segundos quito el spinner y muestro los resultados
      spinner.style.display = 'none';
      resultadoPoliza.appendChild(div);
    }, 2000);
  } // Cierre funcion mostrarResultado
  

Я не знаю, как получить доступ к этим данным: я пробовал archivoAjax.success или archivoData.ajax и т. Д., Но это не работает.

Массив файла json — это что-то вроде этого:

 [{"marca":"Toyota","modelo":"RAV4","precio":709892},
{"marca":"Mitsubishi","modelo":"Endeavor","precio":606888},
{"marca":"Honda","modelo":"Accord","precio":498929},]
  

Это HTML

 <!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Cotizador de Seguros</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP VmmDGMN5t9UJ0Z" crossorigin="anonymous">
    <link rel="stylesheet" type="text/css" href="Style.css">
    <script src="https://code.jquery.com/jquery-3.5.1.js" integrity="sha256-QWo7LDvxbWT2tbbQ97B53yJnYU3WhH/C8ycbRAkjPDc=" crossorigin="anonymous"></script>    <!-- <script defer src="autos.js"></script> -->
    <script defer src="variables.js"></script>    
    <script defer src="cotizadordeauto.js"></script>
</head>
<body>
  <div class="topnav">
        <!-- <a class="active" href="#home">Home</a> -->
      <h1>Seguros Sunshine</h1>       
  </div>
  <div>
    <h2>En Seguros Sunshine tenemos muchas opciones para vos</h2>
    <p id="intro">Contamos con tres diferentes productos para satisfacer tus necesidades. Seguros contra Terceros, que cubre aquellas terceras personas involucradas en cualquier accidente. A su vez contamos con una oferta un poco mas ampliada con la opcion Terceros Ampliada, que incluye granizo o robo q hayas sufrido. Por ultimo tenemos un seguro contra todo riesgo llamado Riesgo Total donde te garantiza la total cobertura de tu vehiculo. A continuacion los podes ver con mas detalle.</p>
    <div>
      <table class="table table-bordered table-info" id="productos">
        <thead>
          <tr>
            <th scope="col">Tipo de Seguro</th>
            <th scope="col">Responsabilidad civil</th>
            <th scope="col">asistencia en ruta</th>
            <th scope="col">Granizo</th>
            <th scope="col">Robo</th>
            <th scope="col">Incendio</th>
            <th scope="col">Remolque ilimitado</th>
            <th scope="col">Vehiculo de sustitucion</th>
            <th scope="col">Daños propios</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <th scope="row">Terceros</th>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
          </tr>
          <tr>
            <th scope="row">Terceros Ampliada</th>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td></td>
            <td></td>
            <td></td>
          </tr>
          <tr>
            <th scope="row">Todo Riesgo</th>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
            <td>amp;#10003</td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
  <p id="todaInfo"></p>
  <div class="container" id="preguntas">        
      <br>
      <br>
      <h3>Ingresa tus datos para iniciar una cotizacion</h3>
      <table class="table table-striped">    
      <thead>
          <input type="text" id="nombre" class="no-outline" placeholder="Nombre">
          <input type="number" id="edad" class="no-outline" placeholder="Edad">
          <input type="email" id="email" class="no-outline" placeholder="Email">
          <input type="tel" id="telefono" class="no-outline" placeholder="Telefono">
          <div>
            <button onclick="Guardar()" id="guardado">Guardar</button>
          </div>
      </thead>
      <tbody id="info" class="shadow">          
      </tbody>
      </table>
  </div>
  <br> 
  <div class="container shadow col-lg-6">
      <div id="contenido" class="pb-auto" style="display: block">
        <header class="p-3 bg-info text-white text-uppercase rounded">
          <h1 class="text-center">Cotiza tu auto aqui</h1>
        </header>
        <form class="mt-10 max-width mx-auto" action="#" id="cotizar-seguro">
          <div class="d-flex align-items-center mb-5">
            <label class="font-weight-bold text-uppercase mr-3 w-20" for="marca">Marca:</label>
            <select class="d-flex mt-2 p-3 rounded" id="marca">
              <option value="" disabled selected> Seleccionar </option>
            </select>
            <label class="font-weight-bold text-uppercase ml-auto mr-3 w-20" for="marca">Modelo:</label>
            <select class="d-flex mt-2 p-3 rounded" id="modelo">
              <option value="" disabled selected> Seleccionar </option>
            </select>
          </div>
          <div class="d-flex justify-content-around align-items-center mb-5">
            <label class="font-weight-bold text-uppercase mr-3 w-20" for="year">Año:</label>
            <select class="d-flex p-3 rounded" id="year">
              <option value="" disabled selected> Seleccionar </option>
            </select>
            <label class="font-weight-bold text-uppercase ml-auto mr-3" for="color">Color:</label>
            <input type="text" class="d-flex p-3 rounded" id="color" placeholder="El color es opcional">
          </div>
          <fieldset>
            <legend class="font-weight-bold text-uppercase text-center w-full">Tipo Seguro</legend>    
            <div class="d-flex justify-content-around mt-5">
              <div>
                <label class="font-weight-bold text-uppercase mr-2">Terceros</label>
                <input type="radio" name="tipo" value="terceros" checked>
                </label>
              </div>
              <div>
                <label class="font-weight-bold  text-uppercase mr-2">Terceros Ampliada</label>
                <input type="radio" name="tipo" value="terceros-ampliada">
                </label>
              </div>
              <div>
                <label class="font-weight-bold  text-uppercase mr-2">Todo Riesgo</label>
                <input type="radio" name="tipo" value="todo-riesgo">
                </label>
              </div>
            </div>
          </fieldset>
    
          <div id="cargando" style="display: none">
            <div class="spinner">
              <div class="bounce1"></div>
              <div class="bounce2"></div>
              <div class="bounce3"></div>
            </div>
          </div>
          <div id="resultado"></div>
          <div class="d-flex justify-content-center py-4">
            <button type="submit"
                class="mx-auto bg-info hover text-white font-weight-bold py-2 px-20 rounded">Cotizar Seguro
            </button>
          </div>
    
        </form>
      </div>
    </div>
     <!--Cierre del form y container-->
    <br>
  
  <!-- <div class="d-flex">
    <footer class="page-footer">
      <div class="text-center">© 2020 Copyright Seguros Sunshine</div>      
    </footer>
  </div> -->
</body>
</html>
  

Комментарии:

1. Что выводит консоль?

2. Что вы хотите сделать с данными? Просто печатать в консоли?

3. console.log(данные) выводит массив

4. Я хочу использовать данные, чтобы показать их в select

5. Я добавлю, весь код js

Ответ №1:

Я нашел решение, я поместил функцию ajax в windows.onload, и она работает.

 window.onload = () => {
    $.ajax({
      url: 'autos.JSON',
      dataType: 'json',
      success: function (data, status, jqXHR) {
        console.log(data);  
            //Selecciono los select de Marca y Modelo
    const selectMarca = document.querySelector('#marca');
    const selectModel = document.querySelector('#modelo');
  
    //Selecciono el formulario
    const formulario = document.querySelector('#cotizar-seguro');
  
    //Manejador de evento "submit" del formulario
    formulario.addEventListener('submit', cotizarSeguro);
  
    //Llamo función lista select para armar un arreglo con las distintas marcas
    const marcas = listaSelect(data, "marca");
  .......