使用Javascript基于二维属性数组自动生成多个相同类型的html元素会导致浏览器挂起
Using Javascript to automatically generate multiple html elements of the same type based on a 2 dimentional array of attributes causes browser to hang
我创建了2个用于创建DOM元素的函数。第一种方法构建单个元素节点,根据属性/值对数组插入属性,插入文本节点并将元素放入父元素中。除了第二个函数调用它之外,这个函数可以正常工作。
第二个函数调用第一个函数来生成具有相同类型和父元素但具有不同文本和属性的多个元素(用于生成诸如li、option或p元素之类的元素)。该函数的参数是要重复创建的元素的类型、要添加的父元素、包含属性值对的数组的数组,以及用于文本节点的字符串数组(数组的数组和字符串的数组必须具有相同的长度)。创建的元素数量取决于属性数组的数量。
问题是,当第二个函数调用第一个函数时,它似乎挂起了浏览器。
非常感谢您的帮助和建议。
我一直在运行的代码:
function buildElement(type, txt, attr, parent){
element = document.createElement(type);
if(typeof attr != 'undefined' && attr){
for(i=0; i<attr.length; i=i+2){
element.setAttribute(attr[i], attr[i+1]);
}
}
if(typeof txt != 'undefined' && txt){
element.appendChild(document.createTextNode(txt));
}
if(typeof parent != 'undefined' && parent){
parent.appendChild(element);
}
return element;
}
function multiElements(type, parent, attrs, txts){
for(i=0; i<attrs.length; i++){
buildElement(type,txts[i],attrs[i],parent);
}
}
var x=1;
var local = buildElement('select','','name','local'+x,'onchange',
'selectPhUpdate(this.value)'],newCard);
multiElements('option',
local,
[
['value','auck'],
['value','chch'],
['value','dun'],
['value','ham'],
['value','mor'],
['value','nap'],
['value','nply'],
['value','wel']
],
['Auckland','Christchurch','Dunedin','Hamilton','Morrinsville',
'Napier','New Plymouth','Wellington']
);
首先,你的代码中缺少一个[
,
var local = buildElement('select','','name','local'+x,'onchange',
'selectPhUpdate(this.value)'],newCard);
应该var local = buildElement('select','',['name','local'+x,'onchange',
'selectPhUpdate(this.value)'],newCard);
至于问题本身:您正在为所有内容使用全局变量,甚至对于循环计数器—并且您两次都使用了i
作为循环计数器。
有两个条目的二级attrs
数组,你从multiElements
buildElement
,所以i
总是的值为2
当遍历当前2级阵列buildElement
完成——这意味着,在multiElements
从未停止循环,因为2
总是比attrs.length
较小(8
)…所以第三个选项"达尼丁"创建一遍又一遍,一遍…,…。
只要在两个循环中使用for(var i=0; …
,从而使每个i
在各自的函数范围内成为本地变量,它就会按预期工作。
(buildElement
中的element
也应该是本地的)
看看它在这个小提琴中的小修复工作:http://jsfiddle.net/c7Pq3/1/
相关文章:
- 我应该怎么做才能避免在网页上移动元素(html、css、jQuery)
- 更改元素HTML,但忽略最后一个子项
- 增加在选择元素HTML中搜索的时间
- Jquery无法获取元素html
- 从所选元素 html 上方的元素获取属性值
- 在 JS 的单选按钮元素 (HTML) 中使用 title 属性
- 如何在页面上播放每个音频元素(HTML,JQuery,Javascript)
- 我需要一种新的方法来检测元素 HTML 是否有更改
- 获取父元素 html 以及子内容
- AngularJS指令:如何在ng-repeat中动态更改元素html
- html 属性中的引号被标记为 ”来自元素.html()的结果
- 在指令's链接中替换angular元素html
- 如果元素有子元素html元素
- 如何下推表格中的元素- HTML
- 如何在纯javascript中使用变量插入数组值,如元素HTML
- jQuery textilate .js -如何“重置”元素HTML并重新启动动画
- 将元素HTML附加到新附加的textarea中
- 在添加类的情况下,CSS 3的过渡是否不能与模板元素(HTML 5)一起工作?
- jQuery没有更新DOM元素HTML
- 在jQuery中更快地替换元素HTML