我有一个自定义的ASP.Net控件,其函数名称将附加到javascript对象中:
<custom:myControl runat="server" id="something" OnClientOpened="myFunc" />
然后我有一个状态javascript对象,其字符串为“myFunc”:
state.onClientOpened // contains "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
};
}();
state.onClientOpened
现在包含:
onClientOpened = "MyObject.myFunc";
这显然打破了它。这是最好的方法吗?我正在考虑某种评估,但如果可能的话,我希望采用另一种方法。
Eval解决方案:
$el.slideUp(200, eval("window." + state.onClientOpened));
答案 0 :(得分:2)
只需将所有代码包装在匿名函数中,而不是其中的一部分,然后您就不必担心全局命名空间污染。并且您不需要引用整个window
rigamarole,只需将该函数称为回调本身。
(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"]
答案 1 :(得分:0)
附加到window
命名空间的变量只是MyObject
,而不是myFunc
。如果您想访问该功能,请尝试这样做:
window["MyObject"]["myFunc"];
您可以使用split
分割来自服务器的字符串。
var params = onClientOpened.split(".");
$el.slideUp(200,window[params[0]][params[1]]);
答案 2 :(得分:0)
到目前为止,我可以看到以下选项。
方法1(评估):
$el.slideUp(200, eval("window." + state.onClientOpened));
方法2(解析):
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);
方法2似乎是“最安全”的方法,但会欣赏其他选择。