Dalam javascript murni, saya saat ini menggunakan timer untuk mengubah enam gambar latar belakang. Saya telah mengatur skrip untuk mengulangi perulangan tanpa batas selama jendela terbuka. Namun, setelah loop pertama, saya ingin mengatur ulang nilai kenaikan timer dari 3250 milidetik menjadi 7000 milidetik untuk semua loop setelah yang pertama selesai pada tingkat yang lebih cepat.

<script>
  function shiftbackgrd(interval, frames) {
    var int = 1;

    function IncrementAnswersBkgrnds() {
        document.body.id = "b"+int;
        int++;
        if(int === frames) { int = 1; }
    }

    var swap = window.setInterval(IncrementAnswersBkgrnds, interval);
  }
  shiftbackgrd(3250, 7); //milliseconds, frames
</script>
1
GladHeart 29 Oktober 2019, 22:51

3 jawaban

Jawaban Terbaik

Anda pada dasarnya perlu tahu kapan harus beralih dan kemudian menggunakan clearInterval untuk menghapus yang lama dan mengatur interval baru. Anda dapat menggunakan bendera yang disetel saat pertama kali penghitung Anda mencapai nilainya.

function shiftbackgrd(interval, interval2, frames) {
  var int = 1;
  var allSeen = false

  function IncrementAnswersBkgrnds() {
    // do something
    console.log("call:", int);

    int++;
    if (int === frames) {
      int = 1;
      if (!allSeen) {
        console.log("All seen, changing to new interval")
        allSeen = true
        window.clearInterval(swap)
        swap = window.setInterval(IncrementAnswersBkgrnds, interval2)
      }
    }
  }

  var swap = window.setInterval(IncrementAnswersBkgrnds, interval);
}
shiftbackgrd(500, 1500, 7); //milliseconds, frames
1
Mark M 29 Oktober 2019, 20:03

Jika Anda hanya perlu mengubahnya pada panggilan pertama, Anda cukup menggunakan setTimeout untuk panggilan pertama, dan kemudian fungsi tersebut muncul kembali setelah itu.

setTimeout(function () {
  shiftbackgrd(7000, 7); //milliseconds, frames
}, 3250)

Dengan kode asli Anda, Anda masih harus memiliki fungsi shiftbackgrd yang langsung memanggil IncrementAnswersBkgrnds tepat sebelum memulai setInterval agar ini berfungsi sepenuhnya.

0
Andrew 29 Oktober 2019, 19:55

Lihat jawaban sempurna dan luar biasa @MarkMeyer yang berkaitan dengan pertanyaan. Saya menambahkan informasi yang saya temukan dan saya gunakan mengenai perubahan waktu perubahan latar belakang secara satu kali tanpa menggunakan window.clearInterval(swap). Dengan hanya menentukan bingkai yang diberikan dan menggunakan milidetik shiftbackgrd, seseorang dapat mengatur bingkai yang ditentukan ke banyak kelipatan siklus milidetik yang mereka inginkan tanpa mengganggu jumlah bingkai. Saya tidak mencoba menjawab pertanyaan saya sendiri tetapi perlu menggunakan ruang jawaban untuk mendemonstrasikan kode.

<script>

var int = 0;
var intRepeat = 0; //incrimented to loop background by multiples of shiftbackgrd milliseconds

function shiftbackgrd(interval, frames)
{"use strict";
var swap = window.setInterval(IncrementHubrisBkgrnds, interval);

    function IncrementHubrisBkgrnds()
    {
    if(int === 15 ) {clearInterval(swap);}

        while (int !== 15 )
        {
        // allows all 16 frames to be set [frames b0, through b15] via int++

            int++;
            document.body.id = "b"+int;

            if(int !== 15 ) {break;}
            // kicks out of while loop on each incriment so it doesn't increment from b0 to b15 without a transitioning of backgrounds for frames preceeding b15
        }


        //Below two ifs create loops of specified background frames increasing their display time
        if(int == 1 && intRepeat <= (0 + 0) ) {
        // first number of intRepeat is starting off as it was set as a var = 0
        // second number of intRepeat chosen will reload chosen window x times more [0 + '0' = 1 when intRepeat++ times more making two times when including the initial background load]

            intRepeat++;
            int = 0;
            // 0 here with the int++ becomes document.body.id = "b"+int; of b1 repeating
        }
        if(int == 14 && intRepeat <= (1 + 1) ) {
        // first number of intRepeat is where it left off its count in last loop at intRepeat 1
        // second number of intRepeat chosen will reload frame b14 that many times more [using just '0' would be once; using '1' makes two times more in addition to the initial load]

            intRepeat++;
            int = 13;
            // 13 here with the int++ becomes document.body.id = "b"+int; of b14 repeating
        }


    }
}

shiftbackgrd(2500, 15); //milliseconds, frames
// Only needs fifteen background changes beyound the intial auto load of background 'b0'.

</script>
0
GladHeart 28 September 2020, 21:59