如何访问行中的每个元素?

Posted

技术标签:

【中文标题】如何访问行中的每个元素?【英文标题】:How do i access each element in the row? 【发布时间】:2017-09-20 23:44:15 【问题描述】:

我目前正在研究 GPA 计算器的大学项目,其中默认科目、科目代码和学分默认填写在表格中并且是可编辑的。学生只需填写每个科目的预期分数,然后只需单击提供的按钮即可查看每个科目的成绩和指针。下面的代码工作得很好,因为我还没有完成它的大部分,但是在运行代码时肯定存在问题。问题是显示每个科目的成绩和指针的按钮只在表格的第一行起作用。这意味着它只在表格的第一行更新一个科目的成绩和指针。我已经为你提供了运行程序的 html 文件和 js 文件,让你更了解我想说的话。

JS Fiddle 示例: https://jsfiddle.net/onyhL6mb/

.html 文件:

<html>
<title> GPA Calculator </title>
<head>

<script src="test_asg3.js">
</script>
</head>

<body>
<form name="gpaCalc">
<table id="myTable" border="1"; width: "100%">
<tr>
    <th>Code
    <th>Subject
    <th>Credit
    <th>Expected Mark
    <th>Grades
    <th>GPA
    <th>
</tr>

<tr>
<td><input type="text" name="code" value="SCJ524"></td>
<td><input type="text" name="subject" value="Object-Oriented Programming"></td>
<td><input type="text" name="credit" value="4"></td>
<td><input type="text" id="marks" oninput="getMarks(this.id)"></td>
<td id = "grade"></td>
<td id = "points"></td>
<td><input type="button" value="Show Grades" onclick="displayGrades()" /></td>
</tr>

<tr>
<td><input type="text" name="code" value="SCJ011"></td>
<td><input type="text" name="subject" value="Software Engineering"></td>
<td><input type="text" name="credit" value="3"></td>
<td><input type="text" id="marks1" oninput="getMarks(this.id)"></td>
<td id = "grade"></td>
<td id = "points"></td>
<td><input type="button" value="Show Grades" onclick="displayGrades()" /></td>
</tr>

<tr>
<td><input type="text" name="code" value="SCR234"></td>
<td><input type="text" name="subject" value="Operating System"></td>
<td><input type="text" name="credit" value="3"></td>
<td><input type="text" id="marks2" oninput="getMarks(this.id)"></td>
<td id = "grade"></td>
<td id = "points"></td>
<td><input type="button" value="Show Grades" onclick="displayGrades()" /></td>
</tr>

<tr>
<td><input type="text" name="code" value="SCV122"></td>
<td><input type="text" name="subject" value="Web Programming"></td>
<td><input type="text" name="credit" value="3"></td>
<td><input type="text" id="marks3" oninput="getMarks(this.id)"></td>
<td id = "grade"></td>
<td id = "points"></td>
<td><input type="button" value="Show Grades" onclick="displayGrades()" /></td>
</tr>

<tr>
<td><input type="text" name="code" value="ENG222"></td>
<td><input type="text" name="subject" value="Advanced Academic English Skills"></td>
<td><input type="text" name="credit" value="2"></td>
<td><input type="text" id="marks4" oninput="getMarks(this.id)"></td>
<td id = "grade"></td>
<td id = "points"></td>
<td><input type="button" value="Show Grades" onclick="displayGrades()" /></td>
</tr>

<tr>
<td><input type="text" name="code" value="BIO683"></td>
<td><input type="text" name="subject" value="Structure and Functions of Proteins"></td>
<td><input type="text" name="credit" value="3"></td>
<td><input type="text" id="marks5" oninput="getMarks(this.id)"></td>
<td id = "grade"></td>
<td id = "points"></td>
<td><input type="button" value="Show Grades" onclick="displayGrades()" /></td>
</tr>
</table>
</form>

<br><input type="button" value="Add Subject" onclick="addRow('myTable')" />
<!--<input type="button" value="Calculate GPA" onclick="gpacalc()" /> -->
<!---<br><input type="submit" value="Calculate GPA" onclick="xxxxxx('yyyy')" />--->
</body>
</html>

.js 文件

function addRow(myTable)

    var table = document.getElementById("myTable");

    var rowCount = table.rows.length;
    var row = table.insertRow(rowCount);

    var cell1 = row.insertCell(0);
    var element1 = document.createElement("input");
    cell1.appendChild(element1);

    var cell2 = row.insertCell(1);
    var element2 = document.createElement("input");
    cell2.appendChild(element2);

    var cell3 = row.insertCell(2);
    var element3 = document.createElement("input");
    cell3.appendChild(element3);

    var cell4 = row.insertCell(3);
    var element4 = document.createElement("input");
    cell4.appendChild(element4);

    var cell5 = row.insertCell(4);
    var element5 = document.createElement("");
    cell5.appendChild(element5);

    var cell6 = row.insertCell(5);
    var element6 = document.createElement("");
    cell6.appendChild(element6);

    var cell7 = row.insertCell(6);
    var element7 = document.createElement("");
    cell7.appendChild(element7);


var x;

function getMarks(id)

    x = document.getElementById(id).value;


function displayGrades()

        var grade;
        var gpaPoint;

        if(x >= 90 && x<=100)
        
            grade = "A+";
            gpaPoint = 4.00;
        

        else if(x >=80 && x< 90)
        
            grade = "A";
            gpaPoint = 4.00;
        

        else if(x >=75 && x< 80)
        
            grade = "A-";
            gpaPoint = 3.67;
        

        else if(x >=70 && x< 75)
        
            grade = "B+";
            gpaPoint = 3.33;
        

        else if(x >=65 && x< 70)
        
            grade = "B";
            gpaPoint = 3.00;
        

        else if(x >=60 && x< 65)
        
            grade = "B-";
            gpaPoint = 2.67;
        

        else if(x >=55 && x< 60)
        
            grade = "C+";
            gpaPoint = 2.33;
        

        else if(x >=50 && x< 55)
        
            grade = "C";
            gpaPoint = 2.00;
        

        else if(x >=45 && x< 50)
        
            grade = "C-";
            gpaPoint = 1.67;
        

        else if(x >=40 && x< 45)
        
            grade = "D";
            gpaPoint = 1.00;
        

        else if(x < 40)
        
            grade = "F";
            gpaPoint = 0.00;
        

        document.getElementById("grade").innerHTML = grade;
        document.getElementById("points").innerHTML = gpaPoint;
    

我在此处的其他帐户上发布了相同的问题,并使用其他用户建议的答案更新了代码。但是,我不允许在该帐户上发布另一个问题,因为我发布的问题收到了其他用户的“差评”,因此达到了我发布另一个问题的限制。希望这次有人能想出一个主意来帮助这个项目。

P/S:当我使用 notepad++ 时它工作得非常好,但它似乎不适用于 js fiddle 示例。

【问题讨论】:

如果您要共享完整代码,请务必创建一个可行的示例。 问题是你的 id 不是唯一的,所以它总是指向第一个 :eq(0) 元素 @JYoThI 是的,我知道这一点。但是我不知道如何将 2 个 id 传递给一个函数,有人说我应该使用 rowindex 检查我正在编辑的行和列,直到今天我仍然无法弄清楚。我已经为此工作了 2 天,不断更改代码。 【参考方案1】:

您不能让 HTMLElements 具有相同的 ID 你的id="grade"id="point" 是错误的。 您应该使用唯一 ID(如行数)或主题 ID(如 id="grade_0"id="grade_SCV122")生成它,并将此变量传递给您的函数,例如。

编辑:

你可以这样做: 将您的按钮 onclick 更改为此

displayGrades(this.parentElement.parentElement)

你的脚本的开头是这样的

function displayGrades( line )

    var grade;
    var gpaPoint;
    if( line && line.children && line.children.length > 0 )
        //Pure javascript
        grade = line.children[0].children[0].value;
        gpaPoint = line.children[3].children[0].value;
        //jQuery
        grade = $(line).find("input[name=code]").val();
        gpaPoint = $(line).find("input[name=marks]").val();//And add the name marks to your input marks
    

更新

//replace the 2 getElementsById lines by that
line.children[4].innerHTML = grade;
line.children[5].innerHTML = gpaPoint;

【讨论】:

是的,我知道这一点。但是我不知道如何将 2 个 id 传递给一个函数,有人说我应该使用 rowindex 检查我正在编辑的行和列,直到今天我仍然无法弄清楚。我已经为此工作了 2 天,不断更改代码。 不使用jQuery还有其他方法吗?因为它不包含在教学大纲中,我无法理解它的作用 我的回答有两种解决方案,纯JS和jQuery,你可以选择你想要的,这两种都可以。 我使用了纯 JS,它可以工作,但成绩和 gpa 只在第一行更新(就像原始代码一样)。这种情况只有在我使用相同的 id 来表示成绩和分数时才有效,但在我使用不同的 id 时不起作用。 我的错,我又更新了帖子,我想你现在会有一个可行的解决方案,不是很漂亮,但可以工作。

以上是关于如何访问行中的每个元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何访问 Rails escape_javascript 行中的 JavaScript 变量?

使用积分图像有效地对矩阵行中的元素求和

如何在R中的数据框的其他行中查找元素

如何在顺风中以自定义高度居中网格行中的元素?

如何有效地计算帕斯卡三角形中的一行?

无法将“每个”中的元素与节点属性结合起来