Javascript DRY设计模式-函数与对象
Javascript DRY Design Patterns - Functions vs Object
下面是一个创建并附加div HTML对象的函数的代码片段。该函数是从另一个函数调用的,该函数会向其添加附加元素
我发现自己正在编写与下面所示类似的代码。我知道必须有另一种更有效的方式来编写代码。我应该使用什么干式设计图案?像这样的东西,对象表示法更好吗?举个例子就好了。
function create_element_container(){
var newElement = document.createElement('div'); //create container element
newElement.className = 'dropped'; //add classes to container element
var controllerContainer = document.createElement('div');
controllerContainer.className = 'drop-element-controls';
newElement.appendChild(controllerContainer);//Append controller container to main div
var controller_left = document.createElement('div');
controller_left.className = 'drop-move-controller';
controllerContainer.appendChild(controller_left);
var controller_left_move = document.createElement('div');
controller_left_move.className = 'drop-move';
controller_left.appendChild(controller_left_move);
var controller_left_icon = document.createElement('span');
controller_left_icon.className = 'fa fa-question fa-lg';
controller_left_move.appendChild(controller_left_icon);
controllerContainer.appendChild(controller_left); //Append controller Left
var controller_middle = document.createElement('div')
controller_middle.className = 'drop-sortable-controller';
controllerContainer.appendChild(controller_middle);
var controller_middle_sortable = document.createElement('div');
controller_middle_sortable.className = 'drop-sortable';
controller_middle.appendChild(controller_middle_sortable);
var controller_middle_icon = document.createElement('span');
controller_middle_icon.className = 'fa fa-arrows fa-lg';
controller_middle_sortable.appendChild(controller_middle_icon);
controllerContainer.appendChild(controller_middle); //Append controller Left
var controller_right = document.createElement('div')
controller_right.className = 'drop-remove-controller';
controllerContainer.appendChild(controller_right);
var controller_right_move = document.createElement('div');
controller_right_move.className = 'drop-remove';
controller_right.appendChild(controller_right_move);
var controller_right_icon = document.createElement('span');
controller_right_icon.className = 'fa fa-remove fa-lg';
controller_right_move.appendChild(controller_right_icon);
return newElement;
}
首先我要编写一个createElement
函数:
function createElement(tagName, className) {
var element = document.createElement(tagName);
element.className = className;
return element;
}
接下来,我将把你的create_element_container
函数重写如下:
function create_element_container() {
var newElement = createElement("div", "dropped");
var controllerContainer = newElement
.appendChild(createElement("div", "drop-element-controls"));
controllerContainer
.appendChild(createElement("div", "drop-move-controller"))
.appendChild(createElement("div", "drop-move"))
.appendChild(createElement("span", "fa fa-question fa-lg"));
controllerContainer
.appendChild(createElement("div", "drop-sortable-controller"))
.appendChild(createElement("div", "drop_sortable"))
.appendChild(createElement("span", "fa fa-arrows fa-lg"));
controllerContainer
.appendChild(createElement("div", "drop-remove-controller"))
.appendChild(createElement("div", "drop-remove"))
.appendChild(createElement("div", "fa fa-remove fa-lg"));
return newElement;
}
可以这样做是因为parent.appendChild(child)
返回child
元素。
您的代码由以下重复组成:
var controllerContainer = document.createElement('div');
controllerContainer.className = 'drop-element-controls';
newElement.appendChild(controllerContainer);
您可能需要考虑put-selector
。带put
:
var controllerContainer = put(newElement, 'div.drop-element-controls');
这样做会使该函数减少2/3。然后甚至合并呼叫:
put(controllerContainer, 'div.drop-move-controller div.drop-move span.fa.fa-question.fa-lg <<');
替换:
var controller_left = document.createElement('div');
controller_left.className = 'drop-move-controller';
controllerContainer.appendChild(controller_left);
var controller_left_move = document.createElement('div');
controller_left_move.className = '';
controller_left.appendChild(controller_left_move);
var controller_left_icon = document.createElement('span');
controller_left_icon.className = 'fa fa-question fa-lg';
controller_left_move.appendChild(controller_left_icon);
controllerContainer.appendChild(controller_left); //Append controller Left
这将减少15/16。
另一种选择是只创建第一个元素:
var newElement = document.createElement('div'); //create container element
newElement.className = 'dropped'; //add classes to container element
然后做:
newElement.innerHTML = '<div class="drop-move-controller"><div class="drop-move"><span class="fa fa-question fa-lg"></span></div></div>...';
请注意,上面的HTML仅包括具有类drop-move-controller
的div
。
这取决于它将运行多少次。如果不是很多,那么我将准备一个DOM字符串,并使用innerHTML
将所有内容放入某个容器中。这将更具可读性和可维护性。
基本示例:
function create_element_container(){
var elm, template;
elm = document.createElement('div'); //create container element
elm.className = 'dropped';
template = '<div class="something another"> '
<span></span> '
</div> '
<span class="foo"></span>';
// this makes our template text into a real DOM elements
elm.innerHTML = template;
return elm;
}
相关文章:
- 创建对象函数原型和代码是错误的
- JavaScript模块模式-如何在使用对象/函数之前激发构造函数/init函数
- 如何从onclick字符串中引用javascript对象函数
- 更改对象函数仅用于示例
- javascript和jQuery的嵌套对象函数中的变量范围
- 将对象函数传递给请求动画帧时丢失对象引用
- 对象函数返回函数而不是值
- 使用onclick调用属性对象函数
- javascript拉斐尔对象函数传递
- 如何从onClick事件调用对象函数
- 可以't获取具有“t”的对象变量;这个“;由setTimeout()函数调用的对象函数中的属性
- 对象没有't继承父对象函数
- 调用父对象函数
- "这个“;对象函数内部的引用
- 将变量添加到对象函数调用的末尾
- 传单错误:对象函数没有方法'createIcon'在LayerGroup中创建自定义图标标记时
- TypeError:对象函数Object(){〔本机代码〕}没有方法'方法'
- 挖空 - 单击绑定到对象函数 - 范围问题
- 类型错误: 对象函数...没有方法“打开”
- JavaScript 对象函数