Heim >Web-Frontend >js-Tutorial >Korrekte Verwendung von previousSibling und nextSibling in javascript_javascript-Tipps
Wenn ich die Zeitüberprüfung durchführe, muss ich nur die Größe des Startdatums und Enddatums überprüfen. Da die Eingabeseite jedoch in Stapeln vorliegt und jede Zeile automatisch generiert wird. Es kann nicht als Parameter verwendet werden, es können nur Knoten verwendet werden. Dies erschwert die Überprüfung.
Das Folgende ist der Teil der JSP-Seite:
<td><input id="warrantyStartDateStr" name="warrantyStartDateStr" class="toolbar_button_input_80" type="Text" onClick="WdatePicker()"></td> <td><input id="warrantyEndDateStr" name="warrantyEndDateStr" class="toolbar_button_input_80" type="Text" onClick="WdatePicker()" onBlur="checkDateOne(this)"></td>
Und meine js-Funktion ist endlich so geschrieben:
Der Zweck der js-Funktion besteht darin, die Werte der beiden Eingaben, nämlich die Startzeit und die Endzeit, ohne Übergabe der ID zu erhalten und dann die beiden Zeiten zu vergleichen.
function checkDateOne(inputsNode){ var p = inputsNode.parentNode; //取得input节点的父节点td var preNode=p.previousSibling.firstChild;//取得td节点的前一个兄弟节点的第一个子结点 var startDate = document.getElementByIdx_x(preNode.id).value; var endDate = document.getElementByIdx_x(inputsNode.id).value; if(startDate.length>0 && endDate.length>0){ var startTmp=startDate.split("-"); var endTmp=endDate.split("-"); var sd=new Date(startTmp[0],startTmp[1],startTmp[2]); var ed=new Date(endTmp[0],endTmp[1],endTmp[2]); if(sd.getDate()>=ed.getDate()){ alert("起始日期不能大于结束日期"); //return false; } } }
Erhalten Sie zuerst den übergeordneten Knoten p (d. h. den td-Knoten) des aktuellen Knoteneingabeknotens und dann die Eingabe des ersten untergeordneten Knotens des vorherigen Knotens des übergeordneten Knotens. Damit ist das Ziel erreicht.
Was ich hier betonen möchte, ist, dass man nicht vergessen sollte, dass der td-Knoten der übergeordnete Knoten des Eingabeknotens ist und nicht als dessen Geschwisterknoten betrachtet werden kann.
Ich möchte auch sagen: Der Unterschied zwischen previousSibling und nextSibling zwischen IE und FF:
Schauen wir uns zunächst ein Beispiel an:
<body> <div> <input id= "a4" type= "button" onclick= "alert(this.nextSibling);" value= "d" /> <input id= "a5" type= "button" onclick= "alert(this.nextSibling);" value= "e" /> </div> </body>
Oberflächlich betrachtet zeigt die Struktur dieses Objekts, dass das nextSibling des div nur zwei Elemente hat – zwei Eingabeknoten. Aber es gibt tatsächlich 5 Elemente -/n,input,/n,input,/n. Dies liegt daran, dass die Eingabe als Beschriftung zum Erstellen verschiedener Formulareingabesteuerelemente verwendet wird. Unabhängig davon, ob es sich um die Generierung von Schaltflächen, Kontrollkästchen, Optionsfeldern oder anderen Formularsteuerelementen handelt, erstellt der IE am Ende automatisch ein 1-Byte-Leerzeichen.
IE überspringt die zwischen Knoten generierten Leerzeichendokumentknoten (z. B. Zeilenvorschubzeichen), Mozilla tut dies jedoch nicht. FF behandelt Layoutelemente wie Leerzeichen und Zeilenvorschübe als Knotenlesungen, also in Das nächste Knotenelement das mit nextSibling im IE gelesen werden kann, muss in FF wie folgt geschrieben werden: nextSibling.nextSibling.
PreviousSibling hat genau den gegenteiligen Effekt, aber die Verwendung ist die gleiche!
Einführung in nextSibling und previousSibling
Enthält viele Leerzeichen als Textknoten in Firefox, daher treten Probleme auf, wenn wir nextSibling und previousSibling verwenden. Weil FireFox Textknoten fälschlicherweise als Geschwisterknoten von Elementknoten behandelt. Wir können nodeType zur Beurteilung hinzufügen. Wenn der vorherige oder nächste Knoten ein Textknoten ist, setzen Sie die Suche fort, bis der nächste Elementknoten gefunden wird. Der folgende Code dient nur als Referenz und hat den Test in Firefox bestanden:
//下一个兄弟节点 function nextSibling(node) { var tempLast = node.parentNode.lastChild; if (node == tempLast) return null; var tempObj = node.nextSibling; while (tempObj.nodeType != 1 && tempObj.nextSibling != null) { tempObj = tempObj.nextSibling; } return (tempObj.nodeType==1)? tempObj:null; } //前一个兄弟节点 function prevSibling(node) { var tempFirst = node.parentNode.firstChild; if (node == tempFirst) return null; var tempObj = node.previousSibling; while (tempObj.nodeType != 1 && tempObj.previousSibling != null) { tempObj = tempObj.previousSibling; } return (tempObj.nodeType==1)? tempObj:null; } <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <script type="text/javascript" language="javascript" > window.onload = function () { var oUl = document.getElementsByTagName("UL"); var nodeLi = oUl[0].childNodes[3]; var nextListItem = nodeLi.nextSibling; var preListItem = nodeLi.previousSibling; alert(nextListItem.tagName + " " + preListItem.tagName); nextListItem = nextSibling(nodeLi); preListItem = prevSibling(nodeLi); alert(nextListItem.tagName + " " + preListItem.tagName); } //下一个兄弟节点 function nextSibling(node) { var tempLast = node.parentNode.lastChild; if (node == tempLast) return null; var tempObj = node.nextSibling; while (tempObj.nodeType != 1 && tempObj.nextSibling != null) { tempObj = tempObj.nextSibling; } return (tempObj.nodeType==1)? tempObj:null; } //前一个兄弟节点 function prevSibling(node) { var tempFirst = node.parentNode.firstChild; if (node == tempFirst) return null; var tempObj = node.previousSibling; while (tempObj.nodeType != 1 && tempObj.previousSibling != null) { tempObj = tempObj.previousSibling; } return (tempObj.nodeType==1)? tempObj:null; } </script> </head> <body> <form id="form1" runat="server"> <div> <ul> <li>HTML</li> <li>CSS</li> <li>JavaScript</li> <li>JQuery</li> <li>Dom</li> </ul> <ul> <li>ASP.NET</li> <li>JSP</li> <li>PHP</li> <li>VB.NET</li> </ul> </div> </form> </body> </html>
Die Hauptwerte von nodeType sind wie folgt:
Der nodeType-Wert des Elementknotens ist 1
Der nodeType-Wert des Attributknotens ist 2
Der nodeType-Wert des Textknotens ist 3