javascript中的previousSibling和nextSibling的正確用法
我做的時間的驗證,格式是不需要驗證的,只需要驗證起始日期與結(jié)束日期的大小,但是因為輸入頁面是批量的,而且每一行又是自動生成的,這樣就不能用id來作為參數(shù),只能用節(jié)點。這就給驗證增加了難度。
以下是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,即起始時間和結(jié)束時間,然后比較兩個時間的大小。
function checkDateOne(inputsNode){ var p = inputsNode.parentNode; //取得input節(jié)點的父節(jié)點td var preNode=p.previousSibling.firstChild;//取得td節(jié)點的前一個兄弟節(jié)點的第一個子結(jié)點 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; } } }
首先是取得當前節(jié)點input節(jié)點的父節(jié)點p(即td節(jié)點),然后再取得父節(jié)點的上一個節(jié)點的第一個子結(jié)點input。這樣就達到了目的。
這里想強調(diào)的是,不要忘記td節(jié)點是input節(jié)點的父節(jié)點,不能當成是它的兄弟節(jié)點。
另外還想說: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項——兩個input節(jié)點。但實際上有5項——/n,input,/n,input,/n。這是因為input作為創(chuàng)建各種表單輸入控件的標簽,無論是生成button、checkbox、radio...等或其他表單控件,IE都會自動在后面創(chuàng)建一個1字節(jié)位的空白。
IE將跳過在節(jié)點之間產(chǎn)生的空格文檔節(jié)點(如:換行字符),而Mozilla不會這樣——FF會把諸如空格換行之類的排版元素視作節(jié)點讀取,因此,在ie 中用nextSibling便可讀取到的下一個節(jié)點元素,在FF中就需要這樣寫:nextSibling.nextSibling了。
previousSibling的作用正好相反,但是用法也是同樣的道理!
nextSibling和previousSibling介紹
在FireFox中包含眾多空格作為文本節(jié)點,因此在我們使用nextSibling和previousSibling時就會出現(xiàn)問題。因為FireFox會把文本節(jié)點誤當做元素節(jié)點的兄弟節(jié)點來處理。我們可以添加nodeType來判斷。當上一節(jié)點或者是下一節(jié)點為文本節(jié)點時,就繼續(xù)尋找,直到找到下一個元素節(jié)點。以下代碼僅供參考,在fireFox中測試通過:
//下一個兄弟節(jié)點 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é)點 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é)點 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é)點 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é)點的nodeType值為1
屬性節(jié)點的nodeType值為2
文本節(jié)點的nodeType值為3
相關(guān)文章
js 獲取頁面高度和寬度兼容 ie firefox chrome等
這篇文章主要介紹了js如何獲取頁面高度和寬度并且兼容ie firefox chrome等主流瀏覽器2014-05-05textarea不能通過maxlength屬性來限制字數(shù)的解決方法
textarea稱文本域,又稱文本區(qū),其不能通過maxlength屬性來限制字數(shù),為此必須尋求其他方法來加以限制以達到預設(shè)的需求2014-09-09js中關(guān)于new Object時傳參的一些細節(jié)分析
這里討論給Object傳參時,其內(nèi)部的處理。參考:ECMA262 V5 15.2.2.12011-03-03js技巧之十幾行的代碼實現(xiàn)vue.watch代碼
相信很多的用vue的人都知道vue雙向綁定的原理建立在,給屬性綁定了getter和setter,在屬性被改變的同時觸發(fā)視圖的再渲染。而本期也是借助這兩個內(nèi)置方法實現(xiàn)vue內(nèi)的watch2018-06-06bootstrap table實現(xiàn)點擊翻頁功能 可記錄上下頁選中的行
這篇文章主要介紹了bootstrap table實現(xiàn)點擊翻頁功能,可記錄上下頁選中的行,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09