javascript中的previousSibling和nextSibling的正確用法
我做的時(shí)間的驗(yàn)證,格式是不需要驗(yàn)證的,只需要驗(yàn)證起始日期與結(jié)束日期的大小,但是因?yàn)檩斎腠撁媸桥康?,而且每一行又是自?dòng)生成的,這樣就不能用id來作為參數(shù),只能用節(jié)點(diǎn)。這就給驗(yàn)證增加了難度。
以下是jsp頁面的部分:
<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>
而我的js函數(shù)最終是這樣寫的:
js函數(shù)的目的就是不通過id,卻能夠獲得兩個(gè)input的value,即起始時(shí)間和結(jié)束時(shí)間,然后比較兩個(gè)時(shí)間的大小。
function checkDateOne(inputsNode){
var p = inputsNode.parentNode; //取得input節(jié)點(diǎn)的父節(jié)點(diǎn)td
var preNode=p.previousSibling.firstChild;//取得td節(jié)點(diǎn)的前一個(gè)兄弟節(jié)點(diǎn)的第一個(gè)子結(jié)點(diǎn)
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("起始日期不能大于結(jié)束日期");
//return false;
}
}
}
首先是取得當(dāng)前節(jié)點(diǎn)input節(jié)點(diǎn)的父節(jié)點(diǎn)p(即td節(jié)點(diǎn)),然后再取得父節(jié)點(diǎn)的上一個(gè)節(jié)點(diǎn)的第一個(gè)子結(jié)點(diǎn)input。這樣就達(dá)到了目的。
這里想強(qiáng)調(diào)的是,不要忘記td節(jié)點(diǎn)是input節(jié)點(diǎn)的父節(jié)點(diǎn),不能當(dāng)成是它的兄弟節(jié)點(diǎn)。
另外還想說:previousSibling和nextSibling在IE和FF之間的差異:
先來看一個(gè)例子:
<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>
該對(duì)象的結(jié)構(gòu)表面上看,div的nextSibling只有2項(xiàng)——兩個(gè)input節(jié)點(diǎn)。但實(shí)際上有5項(xiàng)——/n,input,/n,input,/n。這是因?yàn)閕nput作為創(chuàng)建各種表單輸入控件的標(biāo)簽,無論是生成button、checkbox、radio...等或其他表單控件,IE都會(huì)自動(dòng)在后面創(chuàng)建一個(gè)1字節(jié)位的空白。
IE將跳過在節(jié)點(diǎn)之間產(chǎn)生的空格文檔節(jié)點(diǎn)(如:換行字符),而Mozilla不會(huì)這樣——FF會(huì)把諸如空格換行之類的排版元素視作節(jié)點(diǎn)讀取,因此,在ie 中用nextSibling便可讀取到的下一個(gè)節(jié)點(diǎn)元素,在FF中就需要這樣寫:nextSibling.nextSibling了。
previousSibling的作用正好相反,但是用法也是同樣的道理!
nextSibling和previousSibling介紹
在FireFox中包含眾多空格作為文本節(jié)點(diǎn),因此在我們使用nextSibling和previousSibling時(shí)就會(huì)出現(xiàn)問題。因?yàn)镕ireFox會(huì)把文本節(jié)點(diǎn)誤當(dāng)做元素節(jié)點(diǎn)的兄弟節(jié)點(diǎn)來處理。我們可以添加nodeType來判斷。當(dāng)上一節(jié)點(diǎn)或者是下一節(jié)點(diǎn)為文本節(jié)點(diǎn)時(shí),就繼續(xù)尋找,直到找到下一個(gè)元素節(jié)點(diǎn)。以下代碼僅供參考,在fireFox中測(cè)試通過:
//下一個(gè)兄弟節(jié)點(diǎn)
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;
}
//前一個(gè)兄弟節(jié)點(diǎn)
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);
}
//下一個(gè)兄弟節(jié)點(diǎn)
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;
}
//前一個(gè)兄弟節(jié)點(diǎn)
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>
其中nodeType的值主要有以下幾種:
元素節(jié)點(diǎn)的nodeType值為1
屬性節(jié)點(diǎn)的nodeType值為2
文本節(jié)點(diǎn)的nodeType值為3
相關(guān)文章
JavaScript 存在陷阱 刪除某一區(qū)域所有節(jié)點(diǎn)
實(shí)現(xiàn)功能:刪除某一區(qū)域中所有節(jié)點(diǎn)。2010-05-05
JS一級(jí)數(shù)組和數(shù)組對(duì)象合并去重方法實(shí)例
這篇文章主要為大家介紹了JS一級(jí)數(shù)組和數(shù)組對(duì)象合并去重方法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
按下回車鍵指向下一個(gè)位置的一個(gè)函數(shù)代碼
本篇文章主要是對(duì)按下回車鍵指向下一個(gè)位置的一個(gè)函數(shù)代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對(duì)大家有所幫助2014-03-03
JS使用面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)的tab選項(xiàng)卡效果示例
這篇文章主要介紹了JS使用面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)的tab選項(xiàng)卡效果,結(jié)合具體實(shí)例形式分析了js面向?qū)ο蠹夹g(shù)與tab選項(xiàng)卡功能的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02
javascript實(shí)現(xiàn)動(dòng)態(tài)顯示顏色塊的報(bào)表效果
本文主要介紹了javascript實(shí)現(xiàn)動(dòng)態(tài)顯示顏色塊的報(bào)表效果的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-04-04
Bootstrap 折疊(Collapse)插件用法實(shí)例詳解
這篇文章主要介紹了Bootstrap 折疊(Collapse)插件用法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-06-06

