我有一个表,它是使用javascript根据列表中的内容创建的。 这在jQuery3.4中很好用,但是当我升级到3.5时,我看到了这个问题。
HTML
<h5>Questions</h5>
<table id="questionTable" class="table q">
<thead>
</thead>
<tbody id="qTable"></tbody>
</table>
<div id="questionDiv">
<input type="button" value="Add Question" onclick="AddNewQuestion()" class="btn btn-primary"/>
</div>
<hr />
<div id="questionDiv">
<input type="submit" value="Submit" class="btn btn-primary" />
</div>
JavaScript
<script type="text/javascript">
$(document).ready(function () {
$(function () {
AddCurrentQuestions();
});
});
var table = document.getElementById("qTable");
var rowCount = table.rows.length;
var counter = rowCount.length;
function AddCurrentQuestions() {
var status = @Html.Raw(Json.Encode(Model.isNull));
if (status == false) {
@{ Model.QuestionList.Add(new Performance_Planning.ViewModel.QuestionViewModel.Questions());}
var questionItems = JSON.parse('@Html.Raw(Json.Encode(@Model.QuestionList))');
for (var i = 0; i < questionItems.length - 1; i++) {
var qItem = questionItems[i];
var questionDetail = qItem.Question;
//Create fields
var qTextCell = "<td><textarea id='QuestionList_" + i + "_Question' name='QuestionList[" + i + "].Question' class='Questions' /></td>";
var indexCell = "<td style='display:none'> <input name='QuestionList.Index' type='hidden' value='" + i + "' /></td>";
var removeCell = "<td align='center'><input id='btnDelLine'" + i + "type='button' value='Remove' onclick=\"removeRow('" + i + "')\" class='btn btn-primary' /></td>";
var newRow = "<tr id='qLineItem" + i + "'>" + indexCell + qTextCell + removeCell + "</tr>";
//Add row to table
$('#qTable').append(newRow);
//Add Values
$('#QuestionList_' + i + "_Question").val(questionDetail)
counter = i;
};
} else {
counter = 0;
AddNewQuestion();
}
};
function AddNewQuestion() {
@{ Model.QuestionList.Add(new Performance_Planning.ViewModel.QuestionViewModel.Questions());}
counter++;
//Create field
var indexCell = "<td style='display:none'> <input name='QuestionList.Index' type='hidden' value='" + counter + "' /></td>";
var qTextCell = "<td><textarea id='QuestionList_" + counter + "_Question' name='QuestionList[" + counter + "].Question' class='Questions' /></td>";
var removeCell = "<td align='center'><input id='btnDelLine'" + counter + "type='button' value='Remove' onclick=\"removeRow('" + counter + "')\" class='btn btn-primary' /></td>";
var newRow = "<tr id='qLineItem" + counter + "'>" + indexCell + qTextCell + removeCell + "</tr>";
$('#qTable').append(newRow);
};
function removeRow(id) {
var rowId = "qLineItem" + id;
var row = document.getElementById(rowId);
row.parentNode.removeChild(row);
};
</script>
}
我最后看到的是,remove按钮在3.5.1中被视为文本,但在3.4中却没有出现这种情况。 我不确定如何解决这个问题,或者我是否需要找出另一种方式来写这一页。
当我查看网页并检查字段时,我看到它执行以下操作:
<textarea id="QuestionList_0_Question" name="QuestionList[0].Question" class="Questions">
"</td><td align='center'><input id='btnDelLine'0type='button' value='Remove' onclick="removeRow('0')" class='btn btn-primary' /></td></tr></tbody></table>"
textarea
元素应该有一个单独的结束标记。 不允许自关闭。 因此这不是有效的HTML:
但这是:
显然,jQuery3.5在这方面更加严格。 对3.5 changelog的检查表明,这是他们应用的安全修复程序的结果:
这个版本中的主要更改是一个安全修复,您可能需要更改自己的代码来适应。 原因如下:jQuery在其jQuery.HTMLPreFilter
方法中使用了正则表达式,以确保所有结束标记在传递给方法时都是符合XHTML的。 例如,此预筛选器确保类似jQuery(“
的调用实际转换为jQuery(“
jQuery<=3.4.1中的HTML解析器通常是正确的,但也有一些边缘情况,解析会产生意想不到的结果。 jQuery团队同意有必要在一个较小的版本中修复这个问题,尽管有些代码依赖于以前的行为,并且可能会中断。 jQuery.HTMLPreFilter
函数在3.5.0中不使用regex,而是将字符串不加修改地传递出去。
可以看到,在3.5之前,jQuery实际上是如何动态地将更改为
,从而修复您所犯的错误。 但是现在,在版本3.5中,jQuery不再这样做了,因此HTML仍然无效,导致出现意外的呈现,其中
之后的所有内容都作为文本区域元素的内容结束。