Javascript 从字符串绑定函数
我有一个自定义ASP.Net控件,该控件的函数名要附加到javascript对象中:Javascript 从字符串绑定函数,javascript,Javascript,我有一个自定义ASP.Net控件,该控件的函数名要附加到javascript对象中: <custom:myControl runat="server" id="something" OnClientOpened="myFunc" /> 我将函数绑定到slideUp参数,如下所示: // this code is inside an Object // Simplified for clarity $el.slideUp(200, window[state.onClientOpen
<custom:myControl runat="server" id="something" OnClientOpened="myFunc" />
我将函数绑定到slideUp参数,如下所示:
// this code is inside an Object
// Simplified for clarity
$el.slideUp(200, window[state.onClientOpened]);
我无法控制进入OnClientOpened属性的内容,因此我测试了一些不在全局命名空间中的内容:
var MyObject = function() {
var myFunc = function() {
doSomething();
};
return {
myFunc: myFunc
};
}();
状态.onClientOpened
现在将包含:
onClientOpened = "MyObject.myFunc";
这显然打破了它。最好的方法是什么?我正在考虑某种评估,但如果可能的话,我希望有另一种方法
评估解决方案:
$el.slideUp(200, eval("window." + state.onClientOpened));
附加到
窗口
命名空间的变量只是MyObject
,而不是myFunc
。如果要访问该函数,请尝试这样做:
window["MyObject"]["myFunc"];
您可以使用split
拆分来自服务器的字符串
var params = onClientOpened.split(".");
$el.slideUp(200,window[params[0]][params[1]]);
只需将所有代码包装在一个匿名函数中,而不是其中的一部分,那么就不必担心全局命名空间污染。您不需要引用整个
窗口
rigamarole,只需将函数称为回调本身
(function () {
var myFunc = function() {
doSomething();
};
// Simplified for clarity
$el.slideUp(200, myFunc);
})();
方法2
方法3
以下是我目前可以看到的选项 方法1(评估): 方法2(分析它):
var onclientOpened;
var splitArray=state.onclientpened.split(“.”);
对于(var i=0;i
方法2似乎是“最安全”的方法,但希望有其他选择。谢谢,但我需要保留我展示的方法,我已经对许多代码进行了注释,解释了原因。好的,我添加了第二种方法,您可以尝试。这可以用,但字符串来自服务器,这就是为什么我不能使用它;正是我所想的,@itsmejodie实际上,我正在自我实例化MyFunc对象,这样它就可以像这样工作。我明白了,新的解决方案。在Chrome JS控制台中测试。我上次的更新回答了你的问题吗?
(function () {
var myFunc = function() {
doSomething();
};
// Simplified for clarity
$el.slideUp(200, myFunc);
})();
var MyObject = {
myFunc: function() {
doSomething();
}
};
onClientOpened = MyObject.myFunc;
// approach 2, but with this change:
onClientOpened = MyObject["myFunc"];
// or if MyObject also comes from the server,
onClientOpened = window["MyObject"]["myFunc"]
$el.slideUp(200, eval("window." + state.onClientOpened));
var onclientOpened;
var splitArray = state.onclientOpened.split(".");
for (var i = 0; i < splitArray.length; i++) {
if (i == 0) {
onclientOpened = window[splitArray[i]];
} else {
onclientOpened = onclientOpened[splitArray[i]];
}
}
$el.slideUp(200, onclientOpened);