Javascript - 将函数作为字符串传递,然后执行(如果存在)

时间:2012-01-08 15:50:25

标签: javascript

我有一个javascript库,它会将结果列表返回给在keyup事件上触发的div。我想使用Jquery将标准keyup事件应用于具有特定类的所有页面上的所有字段。 那部分我可以做,它工作正常。 我的问题是我使用的参数是动态的,其中最后两个是可选函数。

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

}

2 个答案:

答案 0 :(得分: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
}

如果它是命名空间,你可以做同样类型的事情,只需要进行一些循环。

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
}

答案 1 :(得分:-2)

您可以通过以下方式检查功能是否存在:

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

如果将函数名称作为字符串传递,则将typeof(yourFunctionName)更改为typeof(eval(yourFunctionName))