Pertanyaan Menguji apakah nilai adalah fungsi


Saya perlu menguji apakah nilai dari suatu bentuk onsubmit adalah sebuah fungsi. Formatnya biasanya onsubmit="return valid();". Apakah ada cara untuk mengetahui apakah ini adalah fungsi, dan apakah itu bisa 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 sudah replaced itu ke "valid ();", dan bahkan "valid ()". Saya ingin tahu apakah salah satu dari mereka 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 memecat gir 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 kemungkinan bagaimana melakukan ini lebih baik?


76
2018-04-28 14:44


asal


Jawaban:


Saya mengganti tombol kirim dengan   tautan tautan. Sejak menelepon   form.submit () tidak aktif   onsubmit, saya menemukannya, dan   eval () ing sendiri. Tapi saya ingin   periksa apakah fungsi ada sebelumnya   hanya eval () ing apa yang ada di sana. - gms8994

<script type="text/javascript">
function onsubmitHandler() {
    alert('running onsubmit handler');
    return true;
}
function testOnsubmitAndSubmit(f) {
    if (typeof f.onsubmit === 'function') {
        // onsubmit is executable, test the return value
        if (f.onsubmit()) {
            // onsubmit returns true, submit the form
            f.submit();
        }
    }
}
</script>

<form name="theForm" onsubmit="return onsubmitHandler();">
<a href="#" onclick="
    testOnsubmitAndSubmit(document.forms['theForm']);
    return false;
"></a>
</form>

EDIT: tidak ada parameter f dalam fungsi testOnsubmitAndSubmit

Di atas harus bekerja terlepas dari apakah Anda menetapkan onsubmit Atribut HTML atau menetapkannya di JavaScript:

document.forms['theForm'].onsubmit = onsubmitHandler;

74
2018-04-28 18:48



Mencoba

if (this.onsubmit instanceof Function) {
    // do stuff;
}

47
2018-04-28 14:50



Anda cukup menggunakan typeof operator bersama dengan operator terner untuk jangka pendek:

onsubmit="return typeof valid =='function' ? valid() : true;"

Jika itu adalah fungsi yang kami sebut dan kembalikan nilai kembaliannya, jika tidak, kembalikan saja true

Edit:

Saya tidak yakin apa yang sebenarnya ingin Anda lakukan, tetapi saya akan mencoba menjelaskan apa yang mungkin terjadi.

Ketika Anda menyatakan Anda onsubmit kode dalam html Anda, itu akan berubah menjadi fungsi dan dengan demikian yang dapat dipanggil dari "dunia" JavaScript. Itu berarti kedua metode itu setara:

HTML: <form onsubmit="return valid();" />
JavaScript: myForm.onsubmit = function() { return valid(); };

Keduanya akan berfungsi dan keduanya akan dapat dipanggil. Anda dapat menguji salah satu dari mereka menggunakan typeof operator yang seharusnya membuat hasil yang sama: "function".

Sekarang jika Anda menetapkan string ke properti "onsubmit" melalui JavaScript, itu akan tetap string, sehingga tidak dapat dipanggil. Perhatikan bahwa jika Anda menerapkan typeof operator menentangnya, Anda akan mendapatkan "string" dari pada "function".

Saya harap ini bisa memperjelas beberapa hal. Kemudian lagi, jika Anda ingin tahu apakah properti tersebut (atau pengenal apa pun untuk masalah tersebut) adalah fungsi dan dapat dipanggil, typeof operator harus melakukan trik. Meskipun saya tidak yakin apakah itu berfungsi dengan baik di beberapa frame.

Tepuk tangan


12
2018-04-28 15:17



Peramban apa yang Anda gunakan?

alert(typeof document.getElementById('myform').onsubmit);

Ini memberi saya "function"di IE7 dan FireFox.


5
2018-04-28 14:49



Pastikan Anda memanggil typeof pada fungsi sebenarnya, bukan string literal:

function x() { 
    console.log("hi"); 
}

typeof "x"; // returns "string"

typeof x; // returns "function"

3
2018-04-28 14:48



menggunakan variabel berbasis string sebagai contoh dan memanfaatkan instanceof Function  Anda mendaftarkan fungsi..menunjukkan variabel ... periksa variabelnya adalah nama fungsi ... lakukan pra-proses ... tetapkan fungsi ke var baru ... lalu panggil fungsi.

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();
}

3
2018-04-28 14:49



Anda dapat mencoba memodifikasi teknik ini 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.');
 }

3
2018-04-28 17:32



form.onsubmit akan selalu berfungsi ketika didefinisikan sebagai atribut HTML elemen form. Ini semacam fungsi anonim yang melekat pada elemen HTML, yang memiliki ini pointer yang terikat ke elemen FORMULIR dan juga memiliki parameter bernama event yang akan berisi data tentang acara kirim.

Dalam keadaan seperti ini saya tidak mengerti bagaimana Anda mendapat string sebagai akibat dari operasi tipografi. Anda harus memberikan detail lebih banyak, lebih baik beberapa kode.

Edit (sebagai tanggapan atas suntingan kedua Anda):

Saya yakin pawang yang dilampirkan ke atribut HTML akan mengeksekusi terlepas dari kode di atas. Lebih jauh lagi, Anda bisa mencoba untuk menghentikannya entah bagaimana, tetapi, tampak bahwa FF 3, IE 8, Chrome 2 dan Opera 9 mengeksekusi handler atribut HTML di tempat pertama dan kemudian yang terpasang (saya tidak diuji dengan jQuery meskipun, tetapi dengan addEventListener dan attachEvent). Jadi ... apa yang ingin Anda capai sebenarnya?

By the way, kode Anda tidak berfungsi karena ekspresi reguler Anda akan mengekstrak string "valid ();", yang jelas bukan fungsi.


2
2018-04-28 14:52



Jika itu string, Anda bisa berasumsi / berharap itu selalu dari bentuk

return SomeFunction(arguments);

parsing untuk nama fungsi, dan kemudian lihat apakah fungsi tersebut didefinisikan menggunakan

if (window[functionName]) { 
    // do stuff
}

2
2018-04-28 14:50