javascript中的previousSibling和nextSibling的正確用法
我做的時(shí)間的驗(yàn)證,格式是不需要驗(yàn)證的,只需要驗(yàn)證起始日期與結(jié)束日期的大小,但是因?yàn)檩斎腠撁媸桥康?,而且每一行又是自動生成的,這樣就不能用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,卻能夠獲得兩個input的value,即起始時(shí)間和結(jié)束時(shí)間,然后比較兩個時(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)的前一個兄弟節(jié)點(diǎn)的第一個子結(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)的上一個節(jié)點(diǎn)的第一個子結(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之間的差異:
先來看一個例子:
<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>
該對象的結(jié)構(gòu)表面上看,div的nextSibling只有2項(xiàng)——兩個input節(jié)點(diǎn)。但實(shí)際上有5項(xiàng)——/n,input,/n,input,/n。這是因?yàn)閕nput作為創(chuàng)建各種表單輸入控件的標(biāo)簽,無論是生成button、checkbox、radio...等或其他表單控件,IE都會自動在后面創(chuàng)建一個1字節(jié)位的空白。
IE將跳過在節(jié)點(diǎn)之間產(chǎn)生的空格文檔節(jié)點(diǎn)(如:換行字符),而Mozilla不會這樣——FF會把諸如空格換行之類的排版元素視作節(jié)點(diǎn)讀取,因此,在ie 中用nextSibling便可讀取到的下一個節(jié)點(diǎn)元素,在FF中就需要這樣寫:nextSibling.nextSibling了。
previousSibling的作用正好相反,但是用法也是同樣的道理!
nextSibling和previousSibling介紹
在FireFox中包含眾多空格作為文本節(jié)點(diǎn),因此在我們使用nextSibling和previousSibling時(shí)就會出現(xiàn)問題。因?yàn)镕ireFox會把文本節(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ù)尋找,直到找到下一個元素節(jié)點(diǎn)。以下代碼僅供參考,在fireFox中測試通過:
//下一個兄弟節(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; } //前一個兄弟節(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); } //下一個兄弟節(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; } //前一個兄弟節(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)文章
js 獲取頁面高度和寬度兼容 ie firefox chrome等
這篇文章主要介紹了js如何獲取頁面高度和寬度并且兼容ie firefox chrome等主流瀏覽器2014-05-05js實(shí)現(xiàn)數(shù)組轉(zhuǎn)樹示例
這篇文章主要為大家介紹了js實(shí)現(xiàn)數(shù)組轉(zhuǎn)樹示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06textarea不能通過maxlength屬性來限制字?jǐn)?shù)的解決方法
textarea稱文本域,又稱文本區(qū),其不能通過maxlength屬性來限制字?jǐn)?shù),為此必須尋求其他方法來加以限制以達(dá)到預(yù)設(shè)的需求2014-09-09js中關(guān)于new Object時(shí)傳參的一些細(xì)節(jié)分析
這里討論給Object傳參時(shí),其內(nèi)部的處理。參考:ECMA262 V5 15.2.2.12011-03-03js技巧之十幾行的代碼實(shí)現(xiàn)vue.watch代碼
相信很多的用vue的人都知道vue雙向綁定的原理建立在,給屬性綁定了getter和setter,在屬性被改變的同時(shí)觸發(fā)視圖的再渲染。而本期也是借助這兩個內(nèi)置方法實(shí)現(xiàn)vue內(nèi)的watch2018-06-06bootstrap table實(shí)現(xiàn)點(diǎn)擊翻頁功能 可記錄上下頁選中的行
這篇文章主要介紹了bootstrap table實(shí)現(xiàn)點(diǎn)擊翻頁功能,可記錄上下頁選中的行,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09