如何通过字符串连接在运行时创建函数或对象属性名称?

时间:2011-04-20 00:30:23

标签: javascript jsp portlet

我创建了portlet,页面上可能有很多portlet实例,因此必须识别函数和dom元素,AKA必须以特定的命名空间开头。

因此,在某些情况下,我必须将我的JS放在JSP页面中,并且不能将其移动到单独的文件中,这非常不方便且难以维护。

JSP中的javascript

var validator = new A.FormValidator({
        boundingBox: document.orderForm,

        validateOnBlur: true,
        validateOnInput: false,

        rules: {

            <portlet:namespace />significanceLevel: {
                digits: true                
            },

            <portlet:namespace />languageFrom: {
                required: true,
                notEqualTo: '#<portlet:namespace />languageTo'
            },

            <portlet:namespace />languageTo: {
                required: true,
                notEqualTo: '#<portlet:namespace />languageFrom'
            }
}
......

<portlet:namespace />significanceLevel JSP生成_my_namespace_significanceLevel:。 即使我将myNamespace(从JSP中的JS - 在服务器端解析的命名空间)传递给构造函数,我也无法在运行时创建myNamespace +'methodName'

命名空间仅在serverSide上已知。因此,一个JS总是必须在JSP页面中,以便解析<portlet:namespace />,并且所有其他JS对象都可以通过构造函数参数访问它。

这是一种解决方法,但在许多情况下不能使用:

window[instance._method] = function() {
    instance.fileAddError.apply(instance, arguments);
};

其中_method的名称是从字符串文字连接的

1 个答案:

答案 0 :(得分:1)

在运行时很容易向对象添加动态属性:

rules[namespace + 'significanceLevel'] = {digits: true};

所以你可以按照以下方式做点什么:

var namespace = <portlet:namespace />;
var opts = {
    boundingBox: document.orderForm,
    validateOnBlur: true,
    validateOnInput: true,
    rules: {};
};
var addRule = function (name, rule) {
    opts.rules[namespace + name] = rule;
}

addRule('significanceLevel', {digits: true});
addRule('languageFrom', {...});
// etc...

var validator = new A.FormValidator(opts);