.click() only firing once then no more after that unless i refresh the whole page and doesn't render at all if i call $(document).ready()

后端 未结 2 1315
野趣味
野趣味 2021-01-27 01:50

I am trying to retrieve a quote and its author from a JSON file, the problem I am having is that once I click the button once, then the event is fired but only once and no more

相关标签:
2条回答
  • 2021-01-27 02:23

    You are calling the functions when you attach the handlers, so they are invoked without the appropriate handler being attached, and just once.

    You need just the function definition:

    $('#new-quote').click(renderQuoteToPage);
    ...
    $(document).ready(renderQuoteOnPageLoad);
    

    Edit: You also need to set randomNumber on each getQuote() call

    // https://type.fit/api/quotes //
    // api link for quotes //
    const button = document.getElementById('new-quote');
    const baseUrl = 'https://type.fit/api/quotes';
    let randomNumber
    
    function getQuote() {
      randomNumber = Math.floor(Math.random() * 100);
      fetch(baseUrl)
        .then(response => response.json())
        .then(quote => $('#text-output').text(quote[randomNumber].text))
    };
    
    function getAuthor() {
      fetch(baseUrl)
        .then(response => response.json())
        .then(quote => $('#author').text(quote[randomNumber].author))
    };
    
    function renderQuoteToPage() {
      getQuote();
      getAuthor();
    }
    
    
    $('#new-quote').click(renderQuoteToPage);
    $(document).ready(renderQuoteToPage);
    body {
      width: 100%;
      height: auto;
    }
    
    #outer-wrapper {
      display: flex;
      flex-direction: row;
      justify-content: center;
      align-items: center;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div id="outer-wrapper" class="container-fluid">
    
      <div id="quote-box" class="card w-50">
        <div class="card-body">
    
          <div class="row">
            <div class="col">
              <div id="text">
                <p id="text-output"></p>
              </div>
            </div>
          </div>
    
          <div class="row">
            <div class="col">
              <a href="#" id="tweet-quote">Tweet</a>
            </div>
            <div class="col">
              <div id="author">Author</div>
            </div>
          </div>
    
          <div class="row">
            <div class="col">
              <button id="new-quote">New quote</button>
            </div>
          </div>
    
        </div>
      </div>
    
    </div>

    0 讨论(0)
  • 2021-01-27 02:43

    Few changes in your script and its done.

    <script>
    const button = document.getElementById('new-quote');
    const baseUrl = 'https://type.fit/api/quotes';
    let randomNumber;
    
    function getQuote() {
      fetch(baseUrl)
      .then(response => response.json())
      .then(quote => $('#text-output').text(quote[randomNumber].text))
       };
    
    function getAuthor() {
      fetch(baseUrl)
      .then(response => response.json())
      .then(quote => $('#author').text(quote[randomNumber].author))
    };
    
    function renderQuoteOnPageLoad() {
      randomNumber = Math.floor(Math.random() * 100);
      getQuote();
      getAuthor();
    }
    
    $(document).ready(function(){
        renderQuoteOnPageLoad();
    });
    
     $(document).on("click","#new-quote",function(){
        renderQuoteOnPageLoad()
     })
    </script>
    
    

    Example Fiddle

    0 讨论(0)
提交回复
热议问题