Saya sedang mengerjakan secara dinamis membuat beberapa JavaScript yang akan dimasukkan ke dalam halaman web saat sedang dibuat.
JavaScript akan digunakan untuk mengisi listbox
berdasarkan pilihan di tempat lain listbox
. Ketika pemilihan salah satu listbox
diubah, itu akan memanggil nama metode berdasarkan nilai yang dipilih dari listbox
.
Sebagai contoh:
Listbox1
mengandung:
Colours
Shapes
Jika Colours
dipilih maka itu akan memanggil populate_Colours
metode yang mengisi yang lain listbox
.
Untuk memperjelas pertanyaan saya: Bagaimana cara melakukan populate_Colours
panggilan itu di JavaScript?
javascript
dynamic
methods
Chris B
sumber
sumber
Jawaban:
Dengan asumsi
populate_Colours
metode ini dalam namespace global, Anda dapat menggunakan kode berikut, yang mengeksploitasi bahwa semua properti objek dapat diakses seolah-olah objek adalah array asosiatif, dan bahwa semua objek global sebenarnya adalah propertiwindow
objek host.sumber
$.fn[method_prefix + method_name](arg1, arg2);
try
/catch
blok, mungkin.$(function () {
dan Andawindow.load
:)Seperti yang ditunjukkan Triptych, Anda dapat memanggil fungsi cakupan global apa pun dengan menemukannya di konten objek host.
Metode yang lebih bersih, yang mencemari namespace global jauh lebih sedikit, adalah dengan secara eksplisit meletakkan fungsi ke dalam array secara langsung seperti:
Array ini juga bisa menjadi properti dari beberapa objek selain objek host global yang juga berarti Anda dapat secara efektif membuat namespace Anda sendiri seperti yang dilakukan oleh banyak library JS seperti jQuery. Ini berguna untuk mengurangi konflik jika / saat Anda menyertakan beberapa pustaka utilitas terpisah di halaman yang sama, dan (bagian lain dari desain Anda mengizinkan) dapat mempermudah penggunaan kembali kode di halaman lain.
Anda juga bisa menggunakan objek seperti itu, yang mungkin Anda temukan lebih bersih:
Perhatikan bahwa dengan array atau objek, Anda dapat menggunakan salah satu metode pengaturan atau mengakses fungsi, dan tentu saja dapat menyimpan objek lain di sana juga. Anda selanjutnya dapat mengurangi sintaks dari salah satu metode untuk konten yang tidak terlalu dinamis dengan menggunakan notasi literal JS seperti ini:
Sunting: tentu saja untuk blok fungsionalitas yang lebih besar Anda dapat memperluas di atas ke "pola modul" yang sangat umum yang merupakan cara populer untuk merangkum fitur kode secara terorganisir.
sumber
var dyn_functions = {};
sehingga Anda tidak perlu membuat larik ... ini bukan masalah besar.Saya akan merekomendasikan untuk TIDAK menggunakan
global
/window
/eval
untuk tujuan ini.Sebaliknya, lakukan dengan cara ini:
mendefinisikan semua metode sebagai properti Handler:
Sekarang sebut saja seperti ini
Hasil keluaran: jerigen
sumber
Anda bisa melakukannya seperti ini:
sumber
Di dalam
ServiceWorker
atauWorker
, gantiwindow
denganself
:Pekerja tidak memiliki akses ke DOM, oleh karena
window
itu referensi tidak valid. Pengenal cakupan global yang setara untuk tujuan ini adalahself
.sumber
Saya tidak akan merekomendasikan menggunakan jendela seperti yang disarankan beberapa jawaban lain. Gunakan
this
dan ruang lingkup yang sesuai.Trik rapi lainnya adalah memanggil dalam cakupan yang berbeda dan menggunakannya untuk warisan. Katakanlah Anda telah menumpuk fungsi dan menginginkan akses ke objek jendela global. Anda bisa melakukan ini:
sumber
Hai coba ini,
itu akan menangani parameter itu sendiri.
sumber
functionName
... penjawab membuat asumsi bahwa Anda sudah menetapkannya.Berikut adalah solusi yang berfungsi dan sederhana untuk memeriksa keberadaan suatu fungsi dan triaging fungsi tersebut secara dinamis oleh fungsi lain;
Fungsi pemicu
dan sekarang Anda dapat menghasilkan fungsi secara dinamis mungkin menggunakan php seperti ini
sekarang Anda dapat memanggil fungsi tersebut menggunakan peristiwa yang dibuat secara dinamis
kode HTML yang Anda butuhkan adalah
sumber
Coba dengan ini:
sumber
eval
fungsi tersebut memiliki beberapa efek samping aneh terkait dengan penggunaannya. Saya biasanya mencoba untuk menjauh darinya, kecuali itu adalah pilihan terakhir.