2012-01-08 23 views
3

keyupイベントでトリガーされたdivに結果のリストを返すjavascriptライブラリがあります。 Jqueryを使用して、特定のクラスを持つすべてのページのすべてのフィールドに標準のkeyupイベントを適用したいとします。 私はそれを行うことができ、それは正常に動作します。 私の問題は、私が使用するパラメータは動的で、最後の2つはオプションの機能です。Javascript - 関数を文字列として渡してから実行する

<input type="text" 
class="font8_input" name="wsFromPart" 
value="<%=wsFromPart%>" id="wsFromPart" 
size="20" maxlength="20" 
onfocus="javascript:fncAjaxClear()" 
onkeyup="javascript:fncAjaxSearch('wsDatabase','..\\AjaxBrowses\\PartBrowse.asp','wsFromPart','wsFromPartList','fncPrePartAjax',null);"/> 

現在、私が機能を持たない場合、これを制御するために、私はnullを渡します。

私はこのようなフィールドをすべて定義できる位置に到達しようとしています。

<input type="text" class="PartClass" name="wsFromPart" value="<%=wsFromPart%>" id="wsFromPart" /> 

他のものは、Jqueryによってクラス/イベントを設定することで追加されます。

私のページに関数が存在するかどうかをテストする方法を試しています。私は文字列として関数名を渡そうとしましたが、その作業を行うことはできません。私の最後の試みは、ジェネリック関数を持って、この関数に存在する可能性のある関数の名前を評価し、関数であればそれを実行することです。

<input type="text" class="font8_input" name="wsFrPt" id="wsFrPt" size="20" maxlength="20" value="<%=wsFrPt%>" onfocus="javascript:fncAjaxClear()" onkeyup="javascript:fncAjaxSearch('wsDatabase','..\\AjaxBrowses\\PartBrowse.asp','wsFrPt','wsFrPtList',fncCheckFunction('fncPreAjaxPart1'),'fncPostAjaxPart');"/> 


function fncAjaxSearch(wsDb,wsAsp,wsId,wsTarget,wsPreFunction,wsReturnFunction) { 
var myDate = new Date(); 
var myDate1 = myDate.getTime(); 
if (objXHR.readyState == 4 || objXHR.readyState == 0) { 
    var wsDatabase = escape(document.getElementById(wsDb).value); 
    var wsStr = escape(document.getElementById(wsId).value); 
    var wsParam = ""; 
    if (wsPreFunction !== null) { 
     wsParam = wsPreFunction(); 
    } 
//Only do ajax call if the 'source' field is not empty, otherwise empty target and clear border. 
     if (document.getElementById(wsId).value > '') { 
     objXHR.open("GET", wsAsp + '?qryDatabase=' + wsDatabase + '&qryDummy=' + myDate1 + '&qrySearch=' + wsStr + wsParam, true); 
     objXHR.onreadystatechange = function(){if(objXHR.readyState==4){fncAjaxSearchReturn(objXHR,wsId,wsTarget,wsReturnFunction)}}; 
     objXHR.send(null); 
    } 
    else { 
     document.getElementById(wsTarget).innerHTML = ''; 
     document.getElementById(wsTarget).style.borderWidth = '0px'; 
    } 
}  

}

答えて

9

することは、あなたがこの

var fnc = window["yourFunctionName"]; //Use bracket notation to get a reference 
if(fnc && typeof fnc === "function") { //make sure it exists and it is a function 
    fnc(); //execute it 
} 
を行うことができます210

名前空間であれば、同じ種類のことを行うことができます。ループするだけです。

var myFnc = "foo.bar.fun"; 
var nameParts = myFnc.split("."); //split up the string into the different levels 
var fnc = window; //set it to window 
for(var i=0;i<nameParts.length;i++){ //loop through each level of the namespace 
    fnc = fnc[nameParts[i]]; 
    if(!fnc){ //make sure it exists, if not exit loop 
     fnc = null; 
     break; 
    } 
} 
if(fnc && typeof fnc === "function") { //make sure it exists and it is a function 
    fnc(); //execute it 
} 
+0

ありがとうございました。私は最初のソリューションを使用し、それを動作させるために使用しました。私はしなければならなかった:var wsFnc = window [wsPreFunction]; if(wsFnc && typeof wsFnc === "function"){//それが存在し、関数であることを確認するwsParam = wsFnc(wsId); }(これを「コード」としてどのように記述するかはわかりません)。ごめんなさい。 – Keith

+0

これを関数にラップして、引数を渡すことはできますか? fx execute(function、arg1、arg2、arg3)? –

+0

'function test(){ var args = Array.prototype.slice.call(arguments)、 fnc = window [args.shift()]; fnc.apply(this、args); } test( "alert"、 "Hello"); ' – epascarello

-2

関数がで存在するかどうかをチェックすることができます:あなたがtypeof演算(yourFunctionName)はtypeof演算するように変更、文字列として関数名を渡す場合

if(typeof(yourFunctionName) == "function") 
//...do your code 
else 
//...function not exists 

(evalの(yourFunctionName)それがグローバルである場合)

関連する問題