javascript - 用 onclick 替换数组元素

标签 javascript arrays

我试图在 onclick 上显示新的随机排列数组列表,但我的代码只是将新的随机排列数组附加到先前列表的下方。我的代码是:

function shuffleArray() {
        var array = ['1','2','3','4'];
            for (var i = array.length - 1; i > 0; i--) {
                var j = Math.floor(Math.random() * (i + 1));
                var temp = array[i];
                array[i] = array[j];
                array[j] = temp;
                }


    for (i=0;i<array.length;i++) {
            var span = document.createElement('span');
            span.innerHTML = array[i];
            span.onclick = shuffleArray; //calls the same function
            var div = document.createElement('div');
            div.appendChild(span);
            document.body.appendChild(div);
            }
    }

当前输出:

    2
    1
    4 // if I click here then results gets appended below
    3
    3
    2
    4
    1 // if I click here then results gets appended below
    2
    1
    4
    3 // and so on

期望的输出:我希望每次单击某个数组元素时页面内容都更新为新的数组元素。

最佳答案

下面是简单的版本,但这很容易出现内存泄漏,因为您正在使用 .onclick 并且在使用 .innerHTML='' 销毁元素之前没有删除这些引用;

var wrapping_div = document.createElement('div');

document.body.appendChild(wrapping_div);

function shuffleArray() {
  var array = ['1','2','3','4'];
  for (var i = array.length - 1; i > 0; i--) {
    var j = Math.floor(Math.random() * (i + 1));
    var temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
  wrapping_div.innerHTML = '';
  for (i=0;i<array.length;i++) {
    var span = document.createElement('span');
    span.innerHTML = array[i];
    span.onclick = shuffleArray; //calls the same function
    var div = document.createElement('div');
    div.appendChild(span);
    wrapping_div.appendChild(div);
  }
}

shuffleArray();

更好的方法是 http://jsfiddle.net/NCUDv/2/ :

var wrapping_div = document.createElement('div');

document.body.appendChild(wrapping_div);

function shuffleArray() {
  var i, j, temp, span, div,
      c = wrapping_div.childNodes, 
      l = c.length,
      array = ['1','2','3','4'], 
      k = array.length;
  for (i=k-1; i>=0; i--) {
    j = Math.floor(Math.random() * (i + 1));
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
  }
  for (i=l-1; i>=0; i-- ) {
    c[i].firstChild.removeEventListener('click', shuffleArray);
    wrapping_div.removeChild(c[i]);
  }
  for (i=0; i<k; i++) {
    span = document.createElement('span');
    span.innerHTML = array[i];
    span.addEventListener('click', shuffleArray);
    div = document.createElement('div');
    div.appendChild(span);
    wrapping_div.appendChild(div);
  }
}

shuffleArray();

关于javascript - 用 onclick 替换数组元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23603744/

相关文章:

javascript - pagehide 和 pageshow 事件在 ios chrome 上无法正常工作

javascript - 在 JS 中查找与给定模式匹配的所有可能的字符串组合

python - 如何使 __add__ 的 numpy 重载独立于操作数顺序?

javascript - 如何使用javascript读取iframe中的webkitAllowFullScreen属性

javascript - Jquery 日期选择器本地化

javascript - 将函数式 for 循环与非数组迭代器结合使用

javascript - 当用户在输入文本框中键入内容时,绑定(bind)丢失的一种方式

javascript - 如果数组第一个元素中的字符串包含数组第二个元素中字符串的所有字母,则返回 true

javascript - 在 Angularjs 中将输入字段绑定(bind)到数组

c++ - 在读取文本文件 C++ 时转义包含特殊字符的一行