【问题标题】:Modal With Button Add New Row (ONE ROW EVERY CLICK)带按钮的模态添加新行(每次点击一行)
【发布时间】:2018-07-07 00:49:31
【问题描述】:

我在标题中遇到了模态问题。当我单击标题“安全”时,它会打开安全模式并设法在每次单击时添加一个项目,这很棒。当我复制第二个标题的代码时,即“操作”。问题开始了。 在我打开 Safety 的模态,添加新项目并关闭模态后,我打开 Operate 的模态并添加新项目。我添加的新项目不是每次点击一行,而是每次点击增加两行,有时每次点击增加三行。

请帮忙。

// Get the  that opens the Safety NewsFeed
var s_news = document.getElementById('s_news');
var safety = document.getElementById('Safety');
safety.onclick = function() {
  s_news.style.display = "block";
  $('.AddNew').click(function() {
    var row = $(this).closest('tr').clone();
    row.find('input').val('');
    $(this).closest('tr').after(row);
    $('input[type="button"]', row).removeClass('AddNew').addClass('RemoveRow').val('Remove item');
  });

  $('table').on('click', '.RemoveRow', function() {
    $(this).closest('tr').remove();
  });
}

// Get the <span> element that closes the modal
var snews_span = document.getElementsByClassName("s_newsclose")[0];
// When the user clicks on <span> (x), close the modal
snews_span.onclick = function() {
  s_news.style.display = "none";
}
// Close Safety NewsFeed
window.addEventListener("click", function(s_newsevent) {
  if (s_newsevent.target == s_news) {
    s_news.style.display = "none";
  }
});
///
// Get the  that opens the Quality Internal NewsFeed
var qi_news = document.getElementById('qi_news');
var qualityint = document.getElementById('QualityInt');
qualityint.onclick = function() {
  qi_news.style.display = "block";
  $('.AddNew').click(function() {
    var row = $(this).closest('tr').clone();
    row.find('input').val('');
    $(this).closest('tr').after(row);
    $('input[type="button"]', row).removeClass('AddNew').addClass('RemoveRow').val('Remove item');
  });

  $('table').on('click', '.RemoveRow', function() {
    $(this).closest('tr').remove();
  });
}

// Get the <span> element that closes the modal
var qinews_span = document.getElementsByClassName("qi_newsclose")[0];
// When the user clicks on <span> (x), close the modal
qinews_span.onclick = function() {
  qi_news.style.display = "none";
}
// Close Safety NewsFeed
window.addEventListener("click", function(qi_newsevent) {
  if (qi_newsevent.target == qi_news) {
    qi_news.style.display = "none";
  }
});
/* News Feed (background) */

.s_news,
.qi_news {
  display: none;
  /* Hidden by default */
  position: fixed;
  /* Stay in place */
  z-index: 1;
  /* Sit on top */
  left: 0;
  top: 0;
  width: 100%;
  /* Full width */
  height: 100%;
  /* Full height */
  background-color: rgb(0, 0, 0);
  /* Fallback color */
  background-color: rgba(0, 0, 0, 0.9);
  /* Black w/ opacity */
}

.headercolor {
  background-color: rgba(255, 0, 0, 1);
}


/* The Newsfeed Close Button */

.s_newsclose,
.qi_newsclose {
  color: #aaa;
  float: left;
  font-size: 28px;
  font-weight: bold;
}
<html>

<body>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

  <h2 style="font-size:1.5rem" id=Safety>Safety</h2>
  <h2 style="font-size:1.5rem" id=QualityInt>Operate</h2>

  <div id="s_news" class="s_news">
    <table>
      <tr>
        <td class=headercolor>ISSUE</td>
        <td class=headercolor>ACTION</td>
        <td class=headercolor>Add/Remove Item</td>
      </tr> <span class="s_newsclose">&times;</span>
      <tr>
        <td><input type='text' value='Add New'></td>
        <td><input type='text' value='Add New'></td>
        <td><input type='button' class='AddNew' value='Add new item'></td>
      </tr>
    </table>
  </div>

  <div id="qi_news" class="qi_news">
    <table>
      <tr>
        <td class=headercolor>ISSUE</td>
        <td class=headercolor>ACTION</td>
        <td class=headercolor>Add/Remove Item</td>
      </tr> <span class="qi_newsclose">&times;</span>
      <tr>
        <td><input type='text' value='Add New'></td>
        <td><input type='text' value='Add New -->'></td>
        <td><input type='button' class='AddNew' value='Add new item'></td>
      </tr>
    </table>

  </div>

</body>

</html>

【问题讨论】:

  • 我找不到问题,但似乎“添加新项目”操作被执行了不止一次,每次点击一次。

标签: javascript jquery html css


【解决方案1】:

检查嵌套在safety.onclick 代码块中的代码。 每次你点击“安全”,你将一个jQuery click()事件处理程序绑定到所有具有AddNew类属性的元素。您可以在您提供的代码 sn-p 中亲自看到这一点。单击标题,然后立即将其关闭。再重复两次。现在,当您单击“添加项目”按钮时,您将看到 三个 新行显示。

另外,请注意每个 div 想要达到的效果是相同的。我会推荐更多DRY 方法来处理您的代码。考虑一个替代解决方案,其中您的 jQuery 事件绑定利用 .on() 方法,并且不嵌套在 vanilla onclick 处理程序中。

$('#s_news, #qi_news').on('click', '.AddNew', function() {
    var row = $(this).closest('tr').clone();
    row.find('input').val('');
    $(this).closest('tr').after(row);
    $('input[type="button"]', row)
        .removeClass('AddNew')
        .addClass('RemoveRow')
        .val('Remove item');
});

$('#s_news, #qi_news').on('click', '.RemoveRow', function() {
    $(this).closest('tr').remove();
});

这是一个实现添加/删除事件处理代码的示例:https://jsfiddle.net/v5r2f913

对所提供的代码示例的更多一般性评论:由于您使用的是 jQuery,您可以考虑仅使用该库的选择器和事件模型,而不是 jQuery 和 vanilla JavaScript 的混合。

【讨论】:

  • 我不知道如何让你的代码工作,你能帮忙吗?
  • @MarkKho 下面是一个仅实现添加/删除事件处理代码的示例:jsfiddle.net/v5r2f913
【解决方案2】:

问题是您的 .AddNew 类不止一次被调用。只需更改针对两者(安全和操作)上的单击事件的类的名称。示例:将第一个类更改为 ".AddNew1",将第二个类更改为 ".AddNew2"

这是一个可行的解决方案。希望对您有所帮助!

// Get the  that opens the Safety NewsFeed
var s_news = document.getElementById('s_news');
var safety = document.getElementById('Safety');
safety.onclick = function() {
  s_news.style.display = "block";
  $('.AddNew1').click(function() {
    var row = $(this).closest('tr').clone();
    row.find('input').val('');
    $(this).closest('tr').after(row);
    $('input[type="button"]', row).removeClass('AddNew').addClass('RemoveRow').val('Remove item');
  });

  $('table').on('click', '.RemoveRow', function() {
    $(this).closest('tr').remove();
  });
}

// Get the <span> element that closes the modal
var snews_span = document.getElementsByClassName("s_newsclose")[0];
// When the user clicks on <span> (x), close the modal
snews_span.onclick = function() {
  s_news.style.display = "none";
}
// Close Safety NewsFeed
window.addEventListener("click", function(s_newsevent) {
  if (s_newsevent.target == s_news) {
    s_news.style.display = "none";
  }
});
///
// Get the  that opens the Quality Internal NewsFeed
var qi_news = document.getElementById('qi_news');
var qualityint = document.getElementById('QualityInt');
qualityint.onclick = function() {
  qi_news.style.display = "block";
  
  $('.AddNew2').click(function() {
    var row = $(this).closest('tr').clone();
    row.find('input').val('');
    $(this).closest('tr').after(row);
    $('input[type="button"]', row).removeClass('AddNew').addClass('RemoveRow').val('Remove item');
  });

  $('table').on('click', '.RemoveRow', function() {
    $(this).closest('tr').remove();
  });
}

// Get the <span> element that closes the modal
var qinews_span = document.getElementsByClassName("qi_newsclose")[0];
// When the user clicks on <span> (x), close the modal
qinews_span.onclick = function() {
  qi_news.style.display = "none";
}
// Close Safety NewsFeed
window.addEventListener("click", function(qi_newsevent) {
  if (qi_newsevent.target == qi_news) {
    qi_news.style.display = "none";
  }
});
.s_news,
.qi_news {
  display: none;
  /* Hidden by default */
  position: fixed;
  /* Stay in place */
  z-index: 1;
  /* Sit on top */
  left: 0;
  top: 0;
  width: 100%;
  /* Full width */
  height: 100%;
  /* Full height */
  background-color: rgb(0, 0, 0);
  /* Fallback color */
  background-color: rgba(0, 0, 0, 0.9);
  /* Black w/ opacity */
}

.headercolor {
  background-color: rgba(255, 0, 0, 1);
}


/* The Newsfeed Close Button */

.s_newsclose,
.qi_newsclose {
  color: #aaa;
  float: left;
  font-size: 28px;
  font-weight: bold;
}
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h2 style="font-size:1.5rem" id=Safety>Safety</h2>
  <h2 style="font-size:1.5rem" id=QualityInt>Operate</h2>

  <div id="s_news" class="s_news">
    <table>
      <tr>
        <td class=headercolor>ISSUE</td>
        <td class=headercolor>ACTION</td>
        <td class=headercolor>Add/Remove Item</td>
      </tr> <span class="s_newsclose">&times;</span>
      <tr>
        <td><input type='text' value='Add New'></td>
        <td><input type='text' value='Add New'></td>
        <td><input type='button' class='AddNew1' value='Add new item'></td>
      </tr>
    </table>
  </div>

  <div id="qi_news" class="qi_news">
    <table>
      <tr>
        <td class=headercolor>ISSUE</td>
        <td class=headercolor>ACTION</td>
        <td class=headercolor>Add/Remove Item</td>
      </tr> <span class="qi_newsclose">&times;</span>
      <tr>
        <td><input type='text' value='Add New'></td>
        <td><input type='text' value='Add New -->'></td>
        <td><input type='button' class='AddNew2' value='Add new item'></td>
      </tr>
    </table>

  </div>

【讨论】:

  • Henry,它适用于 A 到 B 或 B 到 A 。但它不适用于 A-B-A 或 B-A-B。
  • 假设 A 是安全的,B 是运行的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2021-05-22
  • 2020-10-22
  • 1970-01-01
相关资源
最近更新 更多