JavaScript对象上的动态方法
Dynamic methds on JavaScript Object
我试图在JavaScript中创建一个简单的HTML标签引擎。我们的想法是使用标记名作为函数名,但是为了做到这一点,函数不必被实现。让我们假设它存在于一个名为HTML
的对象中。
应该是这样的:
HTML.h1({class:"uberheadline"}, "Hello World");
HTML.div({id:"megabox"});
到目前为止,我有一个非常基本的实现是:
function create_and_append_html_element(params) {
var attributes = params.attr;
var tag = params.tag;
var target = params.target;
var content = params.content;
var element = document.createElement(tag);
if (attributes) $(element).attr(attributes);
if (content) $(element).html(content);
if (target) $(target).append(element);
return element;
}
本质上,我想这样运行一个函数,只是不需要指定tag
变量。这可能吗?如果是这样,从哪里开始寻找答案呢?
您必须编写逻辑来推断tag
的值,如果它没有传递给您的函数
如果你想通过字符串名动态调用一个方法,你可以这样做:
HTML.h1({class:"uberheadline"}, "Hello World");
HTML.div({id:"megabox"});
var methodToCall = 'h1';
if(typeof(HTML[methodToCall]) === 'function') {
HTML[methodToCall](); // run function
}
如果我理解正确的话,你想让HTML.h1
这样的函数在内部调用create_and_append_html_element
,并自动设置tag
属性。
为此,您可以创建如下函数:
// array of elements separated with space
$.each("h1 div".split(" "), function(i, tag) {
// make the function available as HTML.h1, HTML.div, etc.
HTML[tag] = function(attr, content) {
return create_and_append_html_element({ tag: tag // pass tag through
attr: attr,
content: content });
};
});
我不知道确切的语法和那些HTML.h1
函数的签名是什么(看起来像(attr, content)
),但你当然可以改变它。
好吧,我很无聊,所以我试了一下。最后一行是你想要得到的。
// Using a tag whitelist
var tags = [
'div', 'b', 'a', 'i', 'link', 'script', 'p', 'em', 'span' // ... and so on
]
// HTML constructor
function _HTML() {
}
// Your magic create/append function
function create_append(tagname, params) {
params.target.append (document.createElement(tagname));
};
// Patch prototype with one closure per tag name in whitelist
for (var i=0; i<tags.length; i++) {
var tagname = tags[i];
_HTML.prototype[tagname] = function(tagname) {
return function (params) {
return create_append(tagname, params);
}
}(tagname);
}
// Export user-accessible object
var HTML = new _HTML;
// Now you can do this!
HTML.div({target:$('body')});
完整的jsFiddle在这里。
相关文章:
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- 你能把一个匿名方法(函数)动态地变成一个命名方法吗
- 当用户点击动态创建的链接时,如何调用JS方法.JQuery,ASP.NET MVC
- 有没有一种方法可以用YepNope.js为脚本提供动态名称
- 在extJS 4.2中,有没有一种方法可以将模型值动态绑定到表单
- 当从Chrome扩展动态注入JS时,从onload()内部调用方法
- 有没有一种方法可以基于Angular 2中注册的路线构建动态导航/菜单
- 离子滑块 - 有一种方法可以动态更改间隔
- 如何在jQuery的.on()方法中动态更新按钮的ID选择器
- AngularJS中的动态表单验证 - 是否有更好的解决方案/方法
- jQuery .change() 方法不适用于动态创建的复选框
- 在我的上下文中添加对象的动态方法
- Javascript:添加动态方法
- 使用 javascript/nodejs 创建动态方法
- 从带有参数的字符串进行动态方法调用 - node.js
- Python动态方法
- JavaScript对象上的动态方法
- 如何在data-ng-click中传递调用动态方法而不是静态方法(即想要传递要调用的方法而不是固定的delete()方法
- JS: json,动态方法的创建和闭包
- 来自ES6中的类的动态方法调用