我知道計數文檔中的標籤的數量可以用的東西做類似下面的JQuery的伯爵錶行
var tableCount = $('body table tr').length;
現在我相信,這隻能算作標籤的數量。我想知道的是,我擁有相同數量的結束標籤。所以如果上面的代碼顯示有72個標籤,我現在想告訴我有72個關閉tr標籤。
這可能嗎?
感謝
我知道計數文檔中的標籤的數量可以用的東西做類似下面的JQuery的伯爵錶行
var tableCount = $('body table tr').length;
現在我相信,這隻能算作標籤的數量。我想知道的是,我擁有相同數量的結束標籤。所以如果上面的代碼顯示有72個標籤,我現在想告訴我有72個關閉tr標籤。
這可能嗎?
感謝
理想情況下,你可以使用這樣的功能:
function checkTable(tableElement) {
// Get inner HTML
var html = tableElement.innerHTML;
// Count <tr>
var count1 = html.match(/<tr/g).length;
// Count </tr>
var count2 = html.match(/<\/tr/g).length;
// Equals?
return count1 === count2;
}
然而,由於瀏覽器的天書,不匹配的標籤得到自動修正(即自動關閉)。因此,對於正在運行的頁面來驗證自己,它是不可能。這是一個概念證明:JS Bin。
說明:第二個表格有拼寫錯誤(打開標記而不是結束標記),但在兩種情況下該函數都返回true
。如果檢查生成的HTML(可通過DOM訪問的HTML),可以看到瀏覽器自動更正了不匹配的標籤(還有一個空的表格行)。
幸運的是,還有另外一種方法。要獲得純瀏覽器(即未由瀏覽器修改)的HTML代碼,可以向當前頁面URL發出AJAX請求。是的,你閱讀正確 - 頁面再次加載。但不用擔心,這裏沒有遞歸和可能的堆棧溢出,因爲您不處理抓取的頁面。
以下JS代碼是:
var selfUrl = document.location.href;
function checkHTML(html) {
// Count <tr>
var count1 = html.match(/<tr/g).length;
console.log(count1);
// Count </tr>
var count2 = html.match(/<\/tr/g).length; // </tr (do not remove this comment!)
console.log(count2);
// Equals?
return count1 === count2;
}
$.get(selfUrl, function(html) {
console.log(checkHTML(html));
});
但一個陷阱要小心處理。如果你在HTML中包含這個代碼(通常不鼓勵),那麼你不能刪除那個評論。原因如下:一個正則表達式包含<tr
,而另一個正斜槓轉義並因此不包含</tr
。而且,由於您獲取了整個HTML代碼(包括JS代碼),因此計數不匹配。即使如此,我在評論中增加了一個額外的</tr
。
您的問題讓我想起了SAX Parser的想法,因爲HTML代碼顯然是XML的一種。只要元素屬性和內容一樣,SAX解析器通常會查看開始和結束標記。
前一段時間,我用從簡單SAX解析器庫:http://ejohn.org/blog/pure-javascript-html-parser/ 請訪問:http://ejohn.org/files/htmlparser.js
使用這個庫,你可以做到以下幾點:
$(document).ready(function(){
var htmlString = $('#myTable').html(),
countStart = 0,
countEnd = 0;
HTMLParser(htmlString, {
start: function(tag, attrs, unary) {
countStart += 1; // you may add the if tag === 'tr' or else
console.log("start: " + tag);
},
end: function(tag) {
countEnd += 1; // you may add the if tag === 'tr' or else
console.log("end: " + tag);
},
chars: function(text) {},
comment: function(text) {}
});
});
也有現代的節點 - 例如:https://github.com/isaacs/sax-js/blob/master/examples/example.js這可以用於相同的任務。
解析器是可以的,但這不適用於實時頁面,因爲您通過'.html()'看到的HTML與在文檔源中找到的HTML不同。查看我的答案瞭解更多詳情。 (我也提供了這個場景的概念驗證) – alesc
感謝@alesc,但在我的回答中,我沒有考慮可能發生的所有問題,以及我使用的庫可能並未涵蓋所有可能的標記解析問題。也許如果我們連接我們的想法,這將是一個完美的答案:) –
你的代碼是確定的,圖書館也可以。問題是瀏覽器會自動關閉不匹配的標籤。因此,當你調用'.html()'時,你不會得到可以在源代碼中找到的* real * HTML。這就是爲什麼我通過在頁面URL上發出AJAX請求來解決這個問題。 – alesc
爲了什麼目的,如果你不介意我的問題? – Luke
您可以讀取表格的innerHTML,然後使用正則表達式來計算開始和結束'tr'標籤。但是如果HTML結構不合適(即缺少結束標籤),沒有人知道會發生什麼。 – alesc
結束標籤?如果你寫有效的代碼,你的.length是真的,如果你將tr匹配成對標記 – daremachine