Seringkali saya akan memiliki file JavaScript yang ingin saya gunakan yang mengharuskan variabel tertentu didefinisikan di halaman web saya.
Jadi kodenya adalah seperti ini:
<script type="text/javascript" src="file.js"></script>
<script type="text/javascript">
var obj1 = "somevalue";
</script>
Tapi yang ingin saya lakukan adalah:
<script type="text/javascript"
src="file.js?obj1=somevalue&obj2=someothervalue"></script>
Saya mencoba berbagai metode dan yang terbaik adalah mengurai string kueri seperti ini:
var scriptSrc = document.getElementById("myscript").src.toLowerCase();
Dan kemudian mencari nilai-nilai saya.
Saya bertanya-tanya apakah ada cara lain untuk melakukan ini tanpa membangun fungsi untuk mengurai string saya.
Apakah Anda semua tahu metode lain?
Jawaban:
Saya akan merekomendasikan tidak menggunakan variabel global jika memungkinkan. Gunakan namespace dan OOP untuk meneruskan argumen Anda ke suatu objek.
Kode ini milik file.js:
Dan di file html Anda:
sumber
var MYLIBRARY = MYLIBRARY || (function(){}());
? Mengapa harusMYLIBRARY
diatur ke nilai boolean?Anda dapat melewatkan parameter dengan atribut arbitrer. Ini berfungsi di semua browser terbaru.
Di dalam somefile.js Anda bisa melewati nilai variabel dengan cara ini:
........
... dll ...
sumber
document.currentScript
, lihat caniuse.com/#feat=document-currentscript untuk kompatibilitas (atau gunakan polyfill)$(..)
sintaks jquery, jangan lupa untuk memasukkannya.Ide lain saya datang di menugaskan sebuah
id
ke<script>
elemen dan melewati argumen sebagaidata-*
atribut.<script>
Tag yang dihasilkan akan terlihat seperti ini:Script kemudian dapat menggunakan id untuk menemukan dan mem-parsing argumen secara terprogram. Diberi
<script>
tag sebelumnya , namanya dapat diambil seperti ini:Kami mendapatkan
name
=helper
sumber
helper.js
loop skrip Anda melalui semuascript
tag pada halaman, mencari yang denganscr="helper.js"
, dan kemudian mengekstrakdata-name
.var this_js_script = $('script[src*=somefile]');
(disalin dari atas )Lihatlah URL ini. Ini berfungsi dengan baik untuk kebutuhan.
http://feather.elektrum.org/book/src.html
Terima kasih banyak kepada penulis. Untuk referensi cepat saya tempelkan logika utama di bawah ini:
sumber
Anda menggunakan variabel Global :-D.
Seperti ini:
Kode JavaScript di 'file.js' dapat mengakses
obj1
danobj2
tanpa masalah.EDIT Hanya ingin menambahkan bahwa jika 'file.js' ingin memeriksa apakah
obj1
danobj2
bahkan telah dinyatakan, Anda dapat menggunakan fungsi berikut.Semoga ini membantu.
sumber
return typeof window[$Name] !== 'undefined';
. Harap dicatat bahwa Anda akan meneruskan fungsi itu string yang berisi nama variabel. Tampaknya lebih mudah untuk memeriksa apakah variabel ada dalam kode panggilan (ini tidak dapat diimplementasikan sebagai fungsi) melaluiif (typeof var !== 'undefined')
.var
.Inilah bukti konsep yang sangat terburu-buru.
Saya yakin setidaknya ada 2 tempat di mana ada perbaikan, dan saya juga yakin bahwa ini tidak akan bertahan lama di alam liar. Setiap umpan balik untuk membuatnya lebih rapi atau dapat digunakan dipersilahkan.
Kuncinya adalah mengatur id untuk elemen skrip Anda. Satu-satunya tangkapan adalah bahwa ini berarti Anda hanya dapat memanggil skrip sekali karena mencari ID untuk menarik string kueri. Ini bisa diperbaiki jika, sebaliknya, skrip loop melalui semua elemen permintaan untuk melihat apakah salah satu dari mereka menunjuk ke sana, dan jika demikian, menggunakan contoh terakhir dari elemen skrip tersebut. Bagaimanapun, lanjutkan dengan kode:
Naskah dipanggil:
Script dipanggil melalui halaman berikut:
sumber
mungkin sangat sederhana
sebagai contoh
Anda kemudian dapat mengubah string kueri menjadi json seperti di bawah ini
dan kemudian bisa menggunakan like
sumber
Ini dapat dengan mudah dilakukan jika Anda menggunakan beberapa kerangka kerja Javascript seperti jQuery. Seperti itu,
Sekarang Anda dapat menggunakan params ini dengan memisahkan sebagai parameter variabel Anda.
Proses yang sama dapat dilakukan tanpa kerangka kerja tetapi akan mengambil beberapa baris kode lagi.
sumber
Nah, Anda bisa membuat file javascript sedang dibangun oleh salah satu bahasa scripting, menyuntikkan variabel Anda ke file pada setiap permintaan. Anda harus memberi tahu server web Anda untuk tidak membagikan file js secara statis (menggunakan mod_rewrite sudah cukup).
Berhati-hatilah karena Anda kehilangan cache apa pun dari file-file js ini karena mereka terus-menerus diubah.
Sampai jumpa.
sumber
<script>
blok Anda dapat menggunakan sesuatu sepertiMyModule.Initialize( '<%: Model.SomeProperty%>', '<%: Model.SomeOtherProperty%>', ...);
yang diberikan di server. Perhatian:<%:
lolos dari nilai, sementara<%=
mengirim nilai tidak terhapus.MyModule
akan menjadi namespace (yaitu variabel di dalam file .js yang dipanggil sendiri, yang mengekspos fungsiInitialize
). Saya membatalkan jawaban Anda, karena ini merupakan kontribusi yang bermanfaat.Pertanyaan yang bagus dan jawaban yang kreatif tetapi suggetion saya adalah untuk membuat metode Anda paramterized dan yang akan menyelesaikan semua masalah Anda tanpa ada trik.
jika Anda memiliki fungsi:
Anda dapat mengubah ini menjadi:
Saya pikir ini adalah pendekatan yang paling alami, Anda tidak perlu membuat dokumentasi tambahan tentang 'parameter file' dan Anda menerima yang sama. Ini berguna khusus jika Anda mengizinkan pengembang lain menggunakan file js Anda.
sumber
Tidak, Anda tidak dapat melakukan ini dengan menambahkan variabel ke bagian querystring dari URL file JS. Jika penulisan bagian kode untuk mem-parsing string yang mengganggu Anda, mungkin cara lain adalah dengan mengkode variabel Anda dan meletakkannya dalam sesuatu seperti atribut rel dari tag? Saya tidak tahu seberapa valid ini dalam hal validasi HTML, jika itu sesuatu yang Anda sangat khawatirkan. Maka Anda hanya perlu menemukan atribut rel dari skrip dan kemudian json_decode itu.
misalnya
sumber
Ini bukan html yang valid (saya rasa tidak) tetapi tampaknya berfungsi jika Anda membuat atribut khusus untuk tag skrip di halaman web Anda :
<script id="myScript" myCustomAttribute="some value" ....>
Kemudian akses atribut khusus di javascript:
var myVar = document.getElementById( "myScript" ).getAttribute( "myCustomAttribute" );
Tidak yakin apakah ini lebih baik atau lebih buruk daripada mem-parsing string sumber skrip.
sumber
Jika Anda memerlukan cara yang melewati pemeriksaan CSP (yang melarang in-line tidak aman) maka Anda harus menggunakan metode nonce untuk menambahkan nilai unik ke skrip dan arahan CSP atau menulis nilai Anda ke dalam html dan membacanya lagi.
Metode Nonce untuk express.js:
atau tulis nilai ke metode html. dalam hal ini menggunakan Jquery:
sumber