【问题标题】:How to change the width of dynamically generated list boxes, based on user input?如何根据用户输入更改动态生成的列表框的宽度?
【发布时间】:2016-06-27 14:42:55
【问题描述】:

我有一个列表框,单击该列表框时,被删除并生成“n”个相同类型的新列表框(n 由用户在单击该列表框时根据提示输入)。这个过程是可重复的。

但是新生成的列表框的宽度应该与原始列表框(被点击生成新列表框的那个)相同。 如果原始列表框的宽度为“200px”,则新生成的项目的宽度应为“(200/n) px”。

我还希望新生成的列表框的位置(目标)与单击的列表框位于 SAME 位置,即不在整个列表之后(附加)或不在整个列表之前列表(前置),但与单击的列表框位于同一位置,一个接一个。 (连同它们的宽度减少了 n 如上所述)。抱歉,由于字数限制,我无法在标题中提及这一点。

我提到了其他建议使用 After()InsertAfter() 等的答案,但由于我是 JavaScript 和 jQuery 的新手,所以我不知道如何在我的情况下实现它们。

HTML:

<h4>Rhythm-Ruler</h4>
<div>
   <ul class="list">
     <li></li>
   </ul>
</div> 

JavaScript:

$("ul").delegate("li", "click", function(){
   var inputNum = prompt("Divide By:"); 
                 // 'n' input by user and stored
   if(inputNum>1){
   $(this).remove();
    }

var i;
for (i=1;i<=inputNum;i++){
   var newList=document.createElement("li");
   $(".list").append($(newList).text(i));
               //this is making them assemble 'after' the entire list 
   $(this).css('width', 200/inputNum + 'px');
               //I am dividing the width by n but its not working
   }
});

CSS:

  li {
      /*position: fixed;*/
      float: left;
      list-style: none;
      width: 200px;
      height: 30px;
      box-shadow:0 -1px 1em hsl(60, 60%, 84%) inset;
      background-color: #FF7F50;
      display: inline;
      text-align: center;
      padding: 2px;
      }

JSFiddle: https://jsfiddle.net/yoshi2095/gwpf42ds/6/

【问题讨论】:

    标签: javascript jquery css list


    【解决方案1】:

    使用工作示例更新小提琴。

    https://jsfiddle.net/z90hg3z5/

    $("ul").delegate("li", "click", function()
    {
       var inputNum = prompt("Divide By:");
       if(inputNum>1){
           var i;
           var w = $(this).width();
           $(this).remove();
           var newW = w/inputNum;
        }
        else 
        {
             newW = w;
        }
        for (i=1;i<=inputNum;i++)
        {
            var newList=document.createElement("li");
            $(".list").append($(newList).text(i));
            $(newList).css('width', newW);
        }
    });
    

    解释。您需要获取单击元素的宽度,以便您可以进行数学运算,将其除以输入数字。然后移除原来的元素。

    更新代码以在正确的位置插入新元素。

    $("ul").delegate("li", "click", function()
    {
        var inputNum = prompt("Divide By:");
        if(inputNum>1)
        {
             var i;
             var w = $(this).width();
             var newW = w/inputNum;
         }
         else 
         {
             newW = w;
         }
         for (i=1;i<=inputNum;i++)
         {
             var newList=document.createElement("li");
             $(newList).text(i).css('width', newW).insertAfter($(this));
         }
    });
    

    修改代码格式

    【讨论】:

    • 这看起来不错,但问题仍然在于“附加”的东西。我希望在同一个地方而不是在列表末尾生成新项目。非常感谢您的帮助:)
    • 在这种情况下你应该先使用 insertAfter 而不是 append,然后删除原始元素,更新我的答案。
    • 我试过了,但我做不到。如果你能用同样的方式更新 JSfiddle,那将是一个很大的帮助。
    • 看起来很棒!非常感谢您的帮助! :)
    • 代码有一些错误,需要在if语句前设置w... var w = $(this).width();
    猜你喜欢
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多