Saya perlu menguji apakah nilai formulir onsubmit
adalah fungsi. Formatnya biasanya onsubmit="return valid();"
. Apakah ada cara untuk mengetahui apakah ini suatu fungsi, dan apakah dapat dipanggil? Menggunakan typeof hanya mengembalikan bahwa itu adalah string, yang tidak banyak membantu saya.
EDIT : Tentu saja, saya mengerti bahwa "return valid ();" adalah sebuah string. Saya telah replace
melakukannya ke "valid ();", dan bahkan "valid ()". Saya ingin tahu apakah salah satu dari itu adalah fungsi.
EDIT : Berikut beberapa kode, yang dapat membantu menjelaskan masalah saya:
$("a.button").parents("form").submit(function() {
var submit_function = $("a.button").parents("form").attr("onsubmit");
if ( submit_function && typeof( submit_function.replace(/return /,"") ) == 'function' ) {
return eval(submit_function.replace(/return /,""));
} else {
alert("onSubmit is not a function.\n\nIs the script included?"); return false;
}
} );
EDIT 2 : Ini kode baru. Sepertinya saya masih harus menggunakan eval, karena memanggil form.submit () tidak mengaktifkan onsubmits yang ada.
var formObj = $("a.button").parents("form");
formObj.submit(function() {
if ( formObj[0].onsubmit && typeof( formObj.onsubmit ) == 'function' ) {
return eval(formObj.attr("onsubmit").replace(/return /,""));
} else {
alert("onSubmit is not a function.\n\nIs the script included?");
return false;
}
} );
Saran tentang bagaimana melakukan ini dengan lebih baik?
sumber
f
adalah contoh formulir. Anda meneruskannya ke fungsi testOnsubmitAndSubmit sebagai argumen. (Saya tahu pertanyaan ini cukup lama, tetapi mungkin jawaban saya akan menghemat waktu seseorang :))Mencoba
if (this.onsubmit instanceof Function) { // do stuff; }
sumber
Anda cukup menggunakan
typeof
operator bersama dengan operator terner singkatnya:onsubmit="return typeof valid =='function' ? valid() : true;"
Jika itu adalah fungsi yang kita panggil dan kembalikan nilai kembaliannya, jika tidak kembalikan saja
true
Edit:
Saya tidak begitu yakin apa yang sebenarnya ingin Anda lakukan, tetapi saya akan mencoba menjelaskan apa yang mungkin terjadi.
Ketika Anda mendeklarasikan
onsubmit
kode Anda dalam html Anda, itu akan berubah menjadi fungsi dan dengan demikian dapat dipanggil dari "dunia" JavaScript. Artinya, kedua metode itu setara:HTML: <form onsubmit="return valid();" /> JavaScript: myForm.onsubmit = function() { return valid(); };
Keduanya akan menjadi fungsi dan keduanya dapat dipanggil. Anda dapat menguji salah satu dari mereka menggunakan
typeof
operator yang yang harus yeld hasil yang sama:"function"
.Sekarang jika Anda menetapkan string ke properti "onsubmit" melalui JavaScript, itu akan tetap menjadi string, karenanya tidak dapat dipanggil. Perhatikan bahwa jika Anda menerapkan
typeof
operator terhadapnya, Anda akan mendapatkan"string"
alih-alih"function"
.Saya harap ini dapat menjelaskan beberapa hal. Kemudian lagi, jika Anda ingin mengetahui apakah properti tersebut (atau pengenal apa pun untuk masalah ini) adalah sebuah fungsi dan dapat dipanggil,
typeof
operator harus melakukan triknya. Meskipun saya tidak yakin apakah itu berfungsi dengan baik di banyak bingkai.Bersulang
sumber
Browser apa yang Anda gunakan?
alert(typeof document.getElementById('myform').onsubmit);
Ini memberi saya "
function
" di IE7 dan FireFox.sumber
menggunakan variabel berbasis string sebagai contoh dan memanfaatkan
instanceof Function
Anda mendaftarkan fungsi .. menetapkan variabel ... memeriksa variabel adalah nama fungsi ... melakukan pra-proses ... menetapkan fungsi ke var baru ... lalu panggil fungsinya.function callMe(){ alert('You rang?'); } var value = 'callMe'; if (window[value] instanceof Function) { // do pre-process stuff // FYI the function has not actually been called yet console.log('callable function'); //now call function var fn = window[value]; fn(); }
sumber
Pastikan Anda memanggil typeof pada fungsi sebenarnya, bukan string literal:
function x() { console.log("hi"); } typeof "x"; // returns "string" typeof x; // returns "function"
sumber
Anda dapat mencoba memodifikasi teknik ini agar sesuai dengan kebutuhan Anda:
function isFunction() { var functionName = window.prompt('Function name: '); var isDefined = eval('(typeof ' + functionName + '==\'function\');'); if (isDefined) eval(functionName + '();'); else alert('Function ' + functionName + ' does not exist'); } function anotherFunction() { alert('message from another function.'); }
sumber
form.onsubmit akan selalu menjadi fungsi ketika didefinisikan sebagai atribut HTML elemen formulir. Ini semacam fungsi anonim yang dilampirkan ke elemen HTML, yang memiliki penunjuk ini terikat ke elemen FORM tersebut dan juga memiliki parameter bernama
event
yang akan berisi data tentang peristiwa pengiriman.Dalam keadaan ini, saya tidak mengerti bagaimana Anda mendapatkan string sebagai hasil dari operasi jenis. Anda harus memberikan lebih banyak detail, lebih baik beberapa kode.
Edit (sebagai tanggapan atas suntingan kedua Anda):
Saya yakin penangan yang dilampirkan ke atribut HTML akan dijalankan terlepas dari kode di atas. Lebih jauh lagi, Anda dapat mencoba menghentikannya entah bagaimana, tetapi, tampaknya FF 3, IE 8, Chrome 2 dan Opera 9 menjalankan penangan atribut HTML di tempat pertama dan kemudian yang terpasang (saya tidak menguji dengan jQuery meskipun, tetapi dengan addEventListener dan attachEvent). Jadi ... sebenarnya apa yang ingin kamu capai?
Ngomong-ngomong, kode Anda tidak berfungsi karena ekspresi reguler Anda akan mengekstrak string "valid ();", yang jelas bukan fungsi.
sumber
Jika itu sebuah string, Anda bisa berasumsi / berharap itu selalu dalam bentuknya
return SomeFunction(arguments);
parse untuk nama fungsi, lalu lihat apakah fungsi itu ditentukan menggunakan
if (window[functionName]) { // do stuff }
sumber
Ini
"return valid();"
adalah string, jadi itu benar.Jika Anda ingin memeriksa apakah itu memiliki fungsi yang dilampirkan, Anda dapat mencoba ini:
formId.onsubmit = function (){ /* */ } if(typeof formId.onsubmit == "function"){ alert("it's a function!"); }
sumber
Menurut saya sumber kebingungan adalah perbedaan antara atribut node dan properti terkait .
Anda menggunakan:
$("a.button").parents("form").attr("onsubmit")
Anda langsung membaca nilai
onsubmit
atribut (yang harus berupa string). Sebagai gantinya, Anda harus mengaksesonsubmit
properti node:$("a.button").parents("form").prop("onsubmit")
Berikut tes singkatnya:
<form id="form1" action="foo1.htm" onsubmit="return valid()"></form> <script> window.onload = function () { var form1 = document.getElementById("form1"); function log(s) { document.write("<div>" + s + "</div>"); } function info(v) { return "(" + typeof v + ") " + v; } log("form1 onsubmit property: " + info(form1.onsubmit)); log("form1 onsubmit attribute: " + info(form1.getAttribute("onsubmit"))); }; </script>
Ini menghasilkan:
sumber
if ( window.onsubmit ) { // } else { alert("Function does not exist."); }
sumber
Bukankah
typeof xxx === 'function'
yang terbaik dan tercepat?Saya membuat bangku di mana Anda dapat mencobanya, dibandingkan dengan instanceof dan _underscore
Berikut bangku: https://jsbench.me/qnkf076cqb/1
sumber
Anda selalu dapat menggunakan salah satu fungsi typeOf di blog JavaScript seperti milik Chris West . Menggunakan definisi seperti berikut untuk
typeOf()
fungsi tersebut akan berhasil:function typeOf(o){return {}.toString.call(o).slice(8,-1)}
Fungsi ini (yang dideklarasikan di namespace global, bisa digunakan seperti ini:
alert("onsubmit is a " + typeOf(elem.onsubmit));
Jika itu adalah sebuah fungsi, "Fungsi" akan dikembalikan. Jika itu adalah string, "String" akan dikembalikan. Nilai-nilai lain yang mungkin ditampilkan di sini .
sumber
// This should be a function, because in certain JavaScript engines (V8, for // example, try block kills many optimizations). function isFunction(func) { // For some reason, function constructor doesn't accept anonymous functions. // Also, this check finds callable objects that aren't function (such as, // regular expressions in old WebKit versions), as according to EcmaScript // specification, any callable object should have typeof set to function. if (typeof func === 'function') return true // If the function isn't a string, it's probably good idea to return false, // as eval cannot process values that aren't strings. if (typeof func !== 'string') return false // So, the value is a string. Try creating a function, in order to detect // syntax error. try { // Create a function with string func, in order to detect whatever it's // an actual function. Unlike examples with eval, it should be actually // safe to use with any string (provided you don't call returned value). Function(func) return true } catch (e) { // While usually only SyntaxError could be thrown (unless somebody // modified definition of something used in this function, like // SyntaxError or Function, it's better to prepare for unexpected. if (!(e instanceof SyntaxError)) { throw e } return false } }
sumber
Pemeriksaan sederhana seperti ini akan memberi tahu Anda jika ada / ditentukan:
if (this.onsubmit) { // do stuff; }
sumber