97

フォームの値が関数かどうかをテストする必要がonsubmitあります。形式は通常onsubmit="return valid();". これが関数かどうか、呼び出し可能かどうかを判断する方法はありますか? typeof を使用すると、それが文字列であることを返すだけで、あまり役に立ちません。

編集:もちろん、「return valid();」ということは理解しています。は文字列です。私はreplaceそれを「valid();」、さらには「valid()」にまで落とし込みました。それらのいずれかが関数であるかどうかを知りたいです。

編集:これは私の問題を説明するのに役立つかもしれないいくつかのコードです:

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

編集 2 : これが新しいコードです。form.submit() を呼び出しても既存の onsubmits が起動しないため、まだ eval を使用する必要があるようです。

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

おそらくこれをより良くする方法についての提案はありますか?

4

18 に答える 18

69

試す

if (this.onsubmit instanceof Function) {
    // do stuff;
}
于 2009-04-28T14:50:05.210 に答える
13

typeof単純に、演算子を三項演算子と一緒に使用できます。

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

それが関数である場合は、それを呼び出して戻り値を返します。それ以外の場合は単に戻りますtrue

編集:

あなたが本当に何をしたいのかよくわかりませんが、何が起こっているのかを説明しようと思います.

HTML 内でコードを宣言するonsubmitと、関数に変換されるため、JavaScript の「世界」から呼び出すことができます。つまり、これら 2 つの方法は同等です。

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

これら 2 つは両方とも関数になり、どちらも呼び出し可能になります。typeof同じ結果が得られるはずの演算子を使用して、それらのいずれかをテストできます: "function"

JavaScript を介して「onsubmit」プロパティに文字列を割り当てると、文字列のままになるため、呼び出し可能になりません。typeofそれに演算子を適用すると、"string"代わりにが得られることに注意してください"function"

これでいくつかのことが明確になることを願っています。繰り返しになりますが、そのようなプロパティ (または問題の識別子) が関数であり、呼び出し可能かどうかを知りたい場合は、typeofオペレーターがそのトリックを実行する必要があります。複数のフレームで適切に機能するかどうかはわかりませんが。

乾杯

于 2009-04-28T15:17:00.603 に答える
5

どのブラウザを使用していますか?

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

これによりfunction、IE7 と FireFox で " " が表示されます。

于 2009-04-28T14:49:00.483 に答える
4

例として文字列ベースの変数を使用し instanceof Function 、関数を登録します..変数を割り当てます...変数が関数の名前であることを確認します...前処理を行います...関数を新しい変数に割り当てます...次に関数を呼び出します。

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();
}
于 2014-04-26T22:24:55.277 に答える
3

ニーズに合わせてこの手法を変更してみてください。

 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.');
 }
于 2009-04-28T14:49:48.517 に答える
3

文字列リテラルではなく、実際の関数で typeof を呼び出していることを確認してください。

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

typeof "x"; // returns "string"

typeof x; // returns "function"
于 2009-04-28T14:48:51.483 に答える
2

文字列の場合は、常に次の形式であると想定/希望することができます

return SomeFunction(arguments);

関数名を解析し、その関数がを使用して定義されているかどうかを確認します

if (window[functionName]) { 
    // do stuff
}
于 2009-04-28T14:52:45.937 に答える
2

form.onsubmit は、HTML のフォーム要素の属性として定義されている場合、常に関数になります。これは、HTML 要素に関連付けられたある種の匿名関数であり、その FORM 要素にバインドされたthiseventポインターを持ち、送信イベントに関するデータを含むという名前のパラメーターも持っています。

このような状況では、typeof 操作の結果として文字列を取得する方法がわかりません。より詳細なコードを提供する必要があります。

編集(2 回目の編集への応答として):

上記のコードに関係なく、HTML 属性に関連付けられたハンドラーが実行されると思います。さらに、何らかの方法でそれを停止しようとすることもできますが、FF 3、IE 8、Chrome 2、および Opera 9 は、最初に HTML 属性ハンドラーを実行し、次に添付されたハンドラーを実行しているようです (jQuery でテストしていません)。ただし、addEventListener と attachEvent を使用します)。それで...あなたは正確に何を達成しようとしていますか?

ところで、正規表現が文字列 "valid();" を抽出するため、コードは機能しませんが、これは明らかに関数ではありません。

于 2009-04-28T17:32:20.170 に答える
1

ええと、文字列なので、それ"return valid();" 正しいです。

代わりに関数がアタッチされているかどうかを確認したい場合は、次のことを試してみてください。

formId.onsubmit = function (){ /* */ }

if(typeof formId.onsubmit == "function"){
  alert("it's a function!");
}
于 2009-04-28T14:50:22.213 に答える
1
  if ( window.onsubmit ) {
     //
  } else {
     alert("Function does not exist.");
  }
于 2009-04-28T14:53:16.887 に答える
1

ChrisWestのなどのJavaScriptブログではいつでもtypeOf関数の1つを使用できます。関数に次のような定義を使用すると、typeOf()機能します。

function typeOf(o){return {}.toString.call(o).slice(8,-1)}

この関数(グローバル名前空間で宣言されている)は、次のように使用できます。

alert("onsubmit is a " + typeOf(elem.onsubmit));

関数の場合は「関数」が返されます。文字列の場合は「文字列」が返されます。その他の可能な値をここに示します

于 2012-07-03T17:42:28.147 に答える
-3

このような簡単なチェックは、それが存在する/定義されているかどうかを知らせます:

if (this.onsubmit)
{
  // do stuff;
}
于 2009-04-28T14:47:16.823 に答える