当您使用.html() 时,您会替换按钮的全部内容。由于图标是此类内容的一部分,因此已消失。
您应该只替换文本节点。使用
$("#submit").addClass("btn-warning")
.contents().filter(function () {
return this.nodeType == Node.TEXT_NODE;
})[0].nodeValue = "Sending...";
$("#avion").addClass("fas fa-cog fa-spin");
关于vars,当你在没有初始化的情况下声明它们时,它们会得到undefined的值。
替代方案:
您可以将按钮文本包装在<span> 标记中,并调整其文本,而不必选择文本节点。示例:
<button type="button" name="submit" id="submit" class="btn btn-primary">
<i id="avion" class="fas fa-paper-plane"></i>
<span>Submit<span>
</button>
$("#submit").addClass("btn-warning").find('span').text("Sending...");
$("#avion").addClass("fas fa-cog fa-spin");
第一种(文本节点替换)方案说明
这里是解释第一种方案,但我们看一下第二种方案的HTML:
<button type="button" name="submit" id="submit" class="btn btn-primary">
<i id="avion" class="fas fa-paper-plane"></i>
<span>Submit<span>
</button>
如您所见,<button> 元素有两个 child 元素 <i> 和 <span>。
现在让我们看看原始的 HTML:
<button type="button" name="submit" id="submit" class="btn btn-primary">
<i id="avion" class="fas fa-paper-plane"></i>
Submit
</button>
不同之处在于没有 <span> 包装“提交”文本。问题是,当这种情况发生时,DOM 会创建一个称为“文本节点”的东西。就好像这发生在实践中:
<button type="button" name="submit" id="submit" class="btn btn-primary">
<i id="avion" class="fas fa-paper-plane"></i>
<text-node>Submit<text-node>
</button>
但是text-node标签在现实中并不存在。由于它不存在,因此您无法选择它(就像您在替代解决方案中通过`.find("span") 选择<span> 标签一样)。
因为它不是标签,所以“访问”它的方式是获取元素的内容。通过以下方式发生:
var buttonsContents = $("#submit").contents();
然后过滤它,只在集合中保留contents(称为节点)中属于文本类型的部分。
var nodesOfTypeText = $("#submit").contents().filter(function () {
return this.nodeType == Node.TEXT_NODE;
});
有了这个,并且因为我们知道#submit只有一个文本节点,包含字符串Submit的文本节点,我们访问这样的第一个节点:
var textNodeWithSubmitText = nodesOfTypeText[0];
然后我们改变它的值:
textNodeWithSubmitText.nodeValue = "Sending...";
换句话说,代码:
$("#submit").contents().filter(function () {
return this.nodeType == Node.TEXT_NODE;
})[0].nodeValue = "Sending...";
如果扩大的话:
var buttonsContents = $("#submit").contents();
var nodesOfTypeText = buttonsContents.filter(function () {
return this.nodeType == Node.TEXT_NODE;
});
var textNodeWithSubmitText = nodesOfTypeText[0];
textNodeWithSubmitText.nodeValue = "Sending...";
就是这样。附带说明,如果您不熟悉.filter() 功能,我推荐its official docs。