首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在循环数组中创建动态对象不起作用。

在循环数组中创建动态对象不起作用。
EN

Stack Overflow用户
提问于 2018-09-10 00:47:10
回答 2查看 54关注 0票数 1

基本上,我有两个完全相同的div,我想添加到他们两个,引导4色调色板。硬编码,它是容易的,但我想要以一种动态的方式,所以理论上说,未来的div可以有调色板,而无需编写新的代码手动。

divs是(只有id不同):

代码语言:javascript
复制
<div id="myContainer">
      <a class="color-picker">Pick color</a>
      <input class="box" type="text" value="Write about yourself here">
  </div>

<div id="myContainer2">
  <a class="color-picker">Pick color</a>
  <input class="box" type="text" value="Write about yourself here">

如果我编写了这段代码,一切都会很好:

代码语言:javascript
复制
var colorPickerArray = [];

$(function(){
    colorPickerArray[0] = $('#myContainer .color-picker');
    colorPickerArray[0].colorpicker();
    colorPickerArray[0].on('changeColor', function(e){
      $('#myContainer .color-picker').empty();
      $('#myContainer .color-picker').append('&nbsp;&nbsp;&nbsp;&nbsp;');
      if(e.color==null)
        $(this).val('transparent').css('background-color', '#fff');//tranparent
      else
        $('#myContainer .box').css('color', e.color.toHex())
    });
  });

$(function(){
    colorPickerArray[1] = $('#myContainer2 .color-picker');
    colorPickerArray[1].colorpicker();
    colorPickerArray[1].on('changeColor', function(e){
      $('#myContainer2 .color-picker').empty();
      $('#myContainer2 .color-picker').append('&nbsp;&nbsp;&nbsp;&nbsp;');
      if(e.color==null)
        $(this).val('transparent').css('background-color', '#fff');//tranparent
      else
        $('#myContainer2 .box').css('color', e.color.toHex())
    });
  });

它只是重复使用不同的键(0和1)和不同的div(“#myContainer”和“myContainer2”)。但是,当我将这些代码转换为一个循环时,它不起作用:

代码语言:javascript
复制
var resizeArr = ['#myContainer', '#myContainer2'];

$(function(){
    for (var i = 0; i < resizeArr.length; i++) {
        colorPickerArray[i] = $(resizeArr[i] + ' .color-picker');
        colorPickerArray[i].colorpicker();
        colorPickerArray[i].on('changeColor', function(e){
        $(resizeArr[i] + ' .color-picker').empty();
        $(resizeArr[i] + ' .color-picker').append('&nbsp;&nbsp;&nbsp;&nbsp;');
        if(e.color==null)
            $(this).val('transparent').css('background-color', '#fff');//tranparent
        else

            $(resizeArr[i] + ' .box').css('color', e.color.toHex())
    });
    }
  });

实际代码完全相同,这次只是由循环重复。是因为更改i的值会影响事件侦听器吗?我应该做些什么而不是在这里使用数组?

编辑

我确实提出了一个解决方案来创建那些动态调色板,我想分享它可能对谁有帮助。但是,我仍然想知道为什么以前的方法不能工作,只是为了更深入地理解js。

无论如何,这里有一个解决方案:

代码语言:javascript
复制
$('body > div .color-picker').mousedown(function(e) {
    var target = $(e.target);
    for (var i = 0; i < resizeArr.length; i++) {
        if (target.is($(resizeArr[i] + ' .color-picker i'))) {
          var a = $(resizeArr[i] + ' .color-picker');
                a.colorpicker();
                a.on('changeColor', function(e){
                    var b = (a[0].parentElement);
                    b = '#' + b.id 
                $(b + ' .color-picker').empty();
                $(b + ' .color-picker').append('&nbsp;&nbsp;&nbsp;&nbsp;');
                if(e.color==null)
                    $(this).val('transparent').css('background-color', '#fff');//tranparent
                else
                    $(b + ' .color-picker').val(e.color).css('background-color', e.color);
                    $(b + ' .box').css('color', e.color.toHex())
            });

        }
    }
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-10 01:54:58

我看到的一个问题是,在事件'changeColor‘中使用的是resizeArri,由于作用域的限制,它执行时我是resizeArr.length。

您可以在这里阅读更多关于let https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let的内容。

票数 0
EN

Stack Overflow用户

发布于 2018-09-10 03:09:20

通过为每个colorPickerArrayi创建当前名称变量,您可以使用以下方法

代码语言:javascript
复制
var colorPickerArray = [];
var resizeArr = ['#myContainer', '#myContainer2'];
$(function(){
    for (var i = 0; i < resizeArr.length; i++) {
        colorPickerArray[i] = $(resizeArr[i] + ' .color-picker');
        colorPickerArray[i].colorpicker();
        colorPickerArray[i].on('changeColor', function(e){
            //console.log(resizeArr[i]); //undefined here!
            var current = $(this).parent(); 
            var name = "#" + current[0].id; //console.log(current[0].id);
            $(name + ' .color-picker').empty();
            $(name + ' .color-picker').append('&nbsp;&nbsp;&nbsp;&nbsp;');
            if(e.color==null)
                $(this).val('transparent').css('background-color', '#fff');//tranparent
            else
                $(name + ' .color-picker').val(e.color).css('background-color', e.color);
                $(name + ' .box').css('color', e.color.toHex())
        });
    }
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52249765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档