Saya mengalami beberapa masalah dengan deklarasi fungsi di IE. Tampaknya, bahkan jika saya menautkan fungsi langsung ke objek jendela. Saya mencoba beralih dengan dokumen alih-alih jendela, tetapi tidak berhasil.

Berikut adalah kode dasar yang saya coba gunakan:

window.addEventListener('load', function () {
    function initChart (id) {...}


    //linking to window object
    window.initChart = initChart;


});

Seperti yang saya katakan, saya bahkan mencoba menautkannya secara langsung: window.initchart(id){...}. Lebih dari itu, saya bahkan menyertakan file js saya mendeklarasikan fungsi di dalam tubuh (karena rumor yang mengatakan bahwa IE tidak melihat fungsi dideklarasikan di bagian kepala)

Setelah itu, di dalam tag skrip saya memanggil initChart() dengan id yang valid dan saya mendapatkan kesalahan ini di dalam konsol IE: 'initChart' is undefined.

<script>
    initChart('chart');
</script>

Anehnya di Chrome, Firefox dan Opera tidak ada masalah seperti itu. Ada ide?

PS: Jika ini duplikat, saya tidak menemukan pertanyaan yang mencakup ini.

0
Andrei Dinu Nechita 28 Januari 2020, 14:59

2 jawaban

Jawaban Terbaik

Anda juga perlu melakukan initChart('chart'); di dalam window load event handler (yang ini atau yang lebih baru ditambahkan). Atau Anda dapat melakukannya di event handler lain yang Anda tahu pasti terjadi setelah window load event handler ini.

Saat kode Anda diproses oleh browser, ia mengetahui untuk melakukan sesuatu pada acara pemuatan jendela, yaitu menyetel window.initChart Anda.

Tetapi kemudian Anda menggunakannya segera, tanpa peristiwa pemuatan jendela terjadi.

Jika itu tidak terjadi di Chrome, saya ingin tahu apakah semuanya dimuat, tetapi meskipun demikian, menurut saya window.initChart Anda diatur dalam siklus peristiwa berikutnya. (biarkan saya mencoba melakukan beberapa eksperimen -- Anda tidak melakukan semua ini di debugger tetapi semua di dalam file HTML?). Tapi itu benar-benar tidak boleh di Chrome, karena load event handler tidak terjadi sebelum tag <script> Anda diuraikan dan dieksekusi, yang sudah initChart('chart');.

Tetapi bagaimanapun juga, yang terbaik adalah mengikuti urutan kejadian: jika Anda menyetel window.initChart pada pengendali peristiwa pemuatan jendela, maka panggil juga window.initChart() di pengendali peristiwa yang sama dan kemudian ditambahkan, atau dalam suatu peristiwa penangan yang terjadi setelahnya.

Anda dapat melihat HERE 02 berikut terjadi sebelum HERE 01:

window.addEventListener('load', function() {
  console.log("HERE 01");
});

console.log("HERE 02");

Saya menjalankan yang berikut di Chrome dan saya mendapatkan kesalahan seperti yang diharapkan:

window.addEventListener('load', function() {
  function foo() {
    console.log("HERE 01");
  }
  window.foo = foo;
});

foo();

Tapi yang ini bekerja seperti yang diharapkan:

window.addEventListener('load', function() {
  function foo() {
    console.log("HERE 01");
  }
  window.foo = foo;
});

window.addEventListener('load', function() {
  foo();
});
1
nonopolarity 28 Januari 2020, 12:38

Masalahnya ternyata bukan hubungan antara fungsi dan objek jendela. Dalam acara pemuatan saya, saya memiliki beberapa interpolasi string ES6 (sesuatu seperti ini: console.log(`#${id}`)) dan IE gagal dalam hal ini. Dia tidak tahu apa yang harus dilakukan dengan itu. Jadi akibatnya, window.initChart() saya bahkan tidak dikompilasi. Setelah saya mengomentari kode dalam masalah, fungsi initChart saya berfungsi dengan baik. Terima kasih atas bantuannya, @nopole!

0
Andrei Dinu Nechita 28 Januari 2020, 17:42