Javascript相当于php for loop效率

时间:2016-01-14 20:40:15

标签: javascript php

第一次发帖,所以如果我错过了一些明显的东西,我会道歉。

我想要做的很简单......在php中。我可以在睡梦中做到。但是,我的页面需要集成javascript,我还不是特别擅长。

我对脚本的工作部分有疑问,我希望提高效率。

问题: 我有一系列复选框,用户将“检查”他们是否做了什么。 Javascript工作正常,但我需要使用一个循环,这样我的大脑就不会受到所有不必要的代码行的伤害。

这是笨重的丑陋东西:

$("#M1L1Box").click(function() {
  $("#M1L1BoxFeedback").text(this.checked ? "- completed" : "- mark as complete");
});

$("#M1L2Box").click(function() {
  $("#M1L2BoxFeedback").text(this.checked ? "- completed" : "- mark as complete");
});

$("#M1L3Box").click(function() {
  $("#M1L3BoxFeedback").text(this.checked ? "- completed" : "- mark as complete");
});

$("#M1L4Box").click(function() {
  $("#M1L4BoxFeedback").text(this.checked ? "- completed" : "- mark as complete");
});

$("#M1L5Box").click(function() {
  $("#M1L5BoxFeedback").text(this.checked ? "- completed" : "- mark as complete");
});

$("#M1L6Box").click(function() {
  $("#M1L6BoxFeedback").text(this.checked ? "- completed" : "- mark as complete");
});

$("#M1L7Box").click(function() {
  $("#M1L7BoxFeedback").text(this.checked ? "- completed" : "- mark as complete");
});

$("#M1L8Box").click(function() {
  $("#M1L8BoxFeedback").text(this.checked ? "- completed" : "- mark as complete");
});

这是我在浪费时间来提高效率时所尝试过的一个版本:

  for(i=1; i<=8; i++){

  var checkBoxCode = "#M1L" + i +"Box";
  var feedbackCode = "#M1L" + i + "BoxFeedback";

  $(checkBoxCode).click(function() {
    $(feedbackCode).text(this.checked ? "- completed" : "- mark as complete");
  });
}

对不起,这是html:

<input type="checkbox" id="M1L1Box" class="checkbox1" value="M1L1">
<label for="M1L1Box" id="M1L1Label"> - Module 1 Lesson 1 <span id="M1L1BoxFeedback"></span></label><br>

<input type="checkbox" id="M1L2Box" class="checkbox1" value="M1L2">
<label for="M1L2Box" id="M1L2Label"> - Module 1 Lesson 2 <span id="M1L2BoxFeedback"></span></label><br>

<input type="checkbox" id="M1L3Box" class="checkbox1" value="M1L3">
<label for="M1L3Box" id="M1L3Label"> - Module 1 Lesson 3 <span id="M1L3BoxFeedback"></span></label><br>

<input type="checkbox" id="M1L4Box" class="checkbox1" value="M1L4">
<label for="M1L4Box" id="M1L4Label"> - Module 1 Lesson 4 <span id="M1L4BoxFeedback"></span></label><br>

<input type="checkbox" id="M1L5Box" class="checkbox1" value="M1L5">
<label for="M1L5Box" id="M1L5Label"> - Module 1 Lesson 5 <span id="M1L5BoxFeedback"></span></label><br>

<input type="checkbox" id="M1L6Box" class="checkbox1" value="M1L6">
<label for="M1L6Box" id="M1L6Label"> - Module 1 Lesson 6 <span id="M1L6BoxFeedback"></span></label><br>

<input type="checkbox" id="M1L7Box" class="checkbox1" value="M1L7">
<label for="M1L7Box" id="M1L7Label"> - Module 1 Lesson 7 <span id="M1L7BoxFeedback"></span></label><br>

<input type="checkbox" id="M1L8Box" class="checkbox1" value="M1L8">
<label for="M1L8Box" id="M1L8Label"> - Module 1 Lesson 8 <span id="M1L8BoxFeedback"></span></label><br>

不确定为什么这不起作用,但我相信你们的前额是多么容易拍打你的额头。我尝试过在这里和其他地方找到的多种解决方案,但从来没有能够成功地将示例应用于我的代码。非常感谢你的帮助!!!

3 个答案:

答案 0 :(得分:6)

为什么不直接使用公共类并使用字符串连接来获取第二个元素。

$(".item").on("change", function() {
  $("#" + this.id + "Feedback").text(this.checked ? "- completed" : "- mark as complete");
}).trigger("change");
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="checkbox" id="M1L1Box" class="item" />
<label id="M1L1BoxFeedback"></label>
<br/>
<input type="checkbox" id="M2L2Box" class="item" />
<label id="M2L2BoxFeedback"></label>
<br/>
<input type="checkbox" id="M3L3Box" class="item" />
<label id="M3L3BoxFeedback"></label>
<br/>

根据您的HTML结构,您甚至不需要JavaScript来更改链接到复选框的元素的文本。

.item + label span { display: none }
.item + label span + span { display: inline; }
.item:checked + label span { display: inline; }
.item:checked + label span + span { display: none; }
<input type="checkbox" id="M1L1Box" class="item" />
<label id="M1L1BoxFeedback"> - <span>completed</span><span>mark as complete</span></label>
<br/>
<input type="checkbox" id="M2L2Box" class="item" />
<label id="M2L2BoxFeedback"> - <span>completed</span><span>mark as complete</span></label>
<br/>
<input type="checkbox" id="M3L3Box" class="item" />
<label id="M3L3BoxFeedback"> - <span>completed</span><span>mark as complete</span></label>
<br/>

答案 1 :(得分:3)

为什么你不使用CSS类来代替ID?你可以这样做:

$(".feedbackBox").click(function() {
  $(this).text(this.checked ? "- completed" : "- mark as complete");
});

您可以在此处阅读:http://www.learningjquery.com/2007/08/what-is-this

答案 2 :(得分:1)

您可以向元素添加CSS类,并使用类选择器而不是id选择器。那你甚至不需要循环。

我不是jQuery高手,但我认为你需要使用$(this).checked而不是this.checked