为每个具有类名的 div 动态创建按钮,并创建显示/隐藏单击功能

Posted

技术标签:

【中文标题】为每个具有类名的 div 动态创建按钮,并创建显示/隐藏单击功能【英文标题】:Dynamically create button for each div with class name, and create show/hide on click function 【发布时间】:2017-11-22 16:47:37 【问题描述】:

我正在尝试想出一个很好的解决方案来轻松添加菜单页面。 每个菜单页面都应该是一个带有“shTab”类的 div,以标识它是一个显示/隐藏元素,我还想给每个 div 一个唯一的名称,这样我就可以创建具有该名称的按钮作为文本。

我正在使用硬编码的 html 创建每个 div,我想要一个 jQuery 函数首先获取所有 div,然后将其放入我的数组选项卡中。

然后我想遍历 tabs 数组,并为每个 div 创建一个按钮,该按钮应附加到 buttonContainer 类,以便所有按钮都像普通菜单一样位于同一区域。

我还希望为每个创建的按钮创建一个单击功能,该功能将 .hide() 所有选项卡,最后 .show() 属于单击按钮的选项卡。

我试图让它在jsFiddle 中工作,但我在尝试迭代它们时遇到了我的 div 元素的问题(我认为这就是问题所在)。

html

<div class='buttonContainer'>

</div>
<div class='container'>
  <div class='shTab' name='home'>
    <p>Homepage! yay</p>
  </div>
  <div class='shTab' name='contact'>
    <p>Contact page! yay</p>
  </div>
  <div class='shTab' name='images'>
    <p>no images yet :(</p>
  </div>
</div>

javaScript

var tabs = [];

$(document).ready(function()

  $('div.shTab').each(function(i, obj) 
        tabs.push(obj);
  );

  for (var div in tabs) 
    div.hide();
    $('.buttonContainer').append(
            $('<button/>', 
          text: div.name,
          click: function () 
            for (var div in tabs) 
              div.hide();
            
            this.show();
          
      )
    );
  

);

我注意到我的 for 循环中的 'div' 对象不能作为 jQuery 对象工作,.hide()、.name .... 等不能按我的意图工作。

我做错了什么?

【问题讨论】:

我创建了一个小提琴(jsfiddle.net/yxg3w9u8)......也许它会有所帮助。但请注意,我不喜欢查询,所以我只使用了 javascript 谢谢,我修改了你的代码,现在它几乎可以满足我的需求。 (jsfiddle.net/yxg3w9u8/2) 仍然更喜欢 jQuery 版本。但是……这总比没有好!谢谢^^ 【参考方案1】:

同样的事情,通过 jQuery 完成。 Here's the fiddle,如果你需要的话。

// Create the tabs collection...
var tabs = $('.shTab');
// create the buttons, based on the tabs themselves
for (var i = 0; i < tabs.length; i++) 
  // wrap the individual tab in the jQuery object.
  var tab = $(tabs[i]);
  // use the tab's name attribute for the button text.
  var btn = $('<button>').html(tab.attr("name"));
  // hide the current tab.
  tab.hide();
  // Add the button to the containing div.
  $('.buttonContainer').append(btn);

/*****
 * event listener for the click
 *   NOTE: Because I've added the buttons dynamically,
 *    I can't simply listen to them as a set. I can
 *    either re-create the listener with each button,
 *    or use EVENT DELEGATION!
 *****/
$(".buttonContainer").on("click", "button", function() 
  // use the index of the clicked button to index the
  //  appropriate tab.
  var buttonIndex = $(this).index();
  var tab = $(tabs[buttonIndex]);

  // Show the current tab...
  tab.show()
    // ... and hide all the siblings!
    .siblings().hide();
)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='buttonContainer'>

</div>
<div class='container'>
  <div class='shTab' name='home'>
    <p>Homepage! yay</p>
  </div>
  <div class='shTab' name='contact'>
    <p>Contact page! yay</p>
  </div>
  <div class='shTab' name='images'>
    <p>no images yet :(</p>
  </div>
</div>

【讨论】:

嘿,谢谢!有趣的解决方案是这样创建的按钮单击操作!永远不会想到这一点,我也不知道 .siblings() 存在。然而,我自己也设法提出了一个解决方案,基于我自己的尝试和@christian 的普通 js 尝试。如果您可以争论我们的哪个解决方案是“最好的”,请告诉我! 真的不知道这是否有“最佳”,这是个人喜好问题。我更喜欢使用单个 jQuery 对象(用于 tabs 变量),并根据需要拉出每个选项卡——但这种方法要求我每次提取它时都将它包装在一个 jQuery 对象中。另外,我不关心在多个地方有相同的监听器——你为每个按钮重新实例化它。相反,我只有一个听众。但同样,个人品味。 是的,只是想知道这两种解决方案如何在性能方面竞争?我不确定拥有大量注册听众是否是不好的做法? 您是否计划使用数十万个标签?如果是这样,那么是的,严重的性能受到打击。但它更多的是内存泄漏的可能性。通过拥有一个监听器,无论有多少可能的元素被监听,我的内存占用都非常小。 好的,谢谢。这回答了我的担忧。我有 10-15 个,所以这将是最小的内存消耗【参考方案2】:

我通过查看所有帮助找到了答案。非常感谢。

$(document).ready(function()
  var tabs = [];

	$('div.shTab').each(function(i, obj) 
        tabs.push($(obj));
  );

  for (var i = 0; i < tabs.length; i++) 
  	tabs[i].hide();
    $('.buttonContainer').append(
		$('<button/>', 
          text: tabs[i].attr('name'),
          click: function (event) 
            for (var i = 0; i < tabs.length; i++) 
              tabs[i].hide();
              if(tabs[i].attr('name') === event.target.innerHTML)
                tabs[i].show();
              
            
          
      )
    );
  
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class='buttonContainer'>

</div>
<div class='container'>
  <div class='shTab' name='home'>
    <p>Homepage! yay</p>
  </div>
  <div class='shTab' name='contact'>
    <p>Contact page! yay</p>
  </div>
  <div class='shTab' name='images'>
    <p>no images yet :(</p>
  </div>
</div>

【讨论】:

以上是关于为每个具有类名的 div 动态创建按钮,并创建显示/隐藏单击功能的主要内容,如果未能解决你的问题,请参考以下文章

创建具有唯一 ID 的动态 div - jQuery

来自具有相同类名的段落的输入或字符串的值总和始终显示“0”

使用 jQuery $('<button>') 语法动态创建的按钮为空

可拖动的 jQuery UI 不适用于动态创建的 div

jQuery循环遍历具有相同类的动态创建的元素

动态创建具有特定值的按钮数量以发挥作用