2010-09-28 126 views
55

如何獲取HTML頁面中的標籤,如果我知道文本標籤包含哪些內容。 例如:如何通過innerText獲取元素

<a ...>SearchingText</a> 
+0

乾淨,實用方法返回陣列的https://計算器。com/a/45089849/696535 – Pawel 2017-08-09 18:41:51

回答

65

你必須手動遍歷。

var aTags = document.getElementsByTagName("a"); 
var searchText = "SearchingText"; 
var found; 

for (var i = 0; i < aTags.length; i++) { 
    if (aTags[i].textContent == searchText) { 
    found = aTags[i]; 
    break; 
    } 
} 

// Use `found`. 
+1

@AutoSponge其實innerHTML是標準的。 innerText在FF中不起作用 – AnaMaria 2013-08-08 09:04:46

+0

更新了示例,在這種情況下,textContent可能是您想要的。謝謝,夥計們:) – 2013-08-08 11:02:32

+1

@八月里拉斯,'我'是怎麼回事?那是幹什麼的? – 2014-02-17 00:02:25

0

雖然有可能通過內部文本得到,但我認爲你的方向是錯誤的。是內部字符串動態生成?如果是這樣,你可以給標籤一個類,或者更好的是當文本進入時標識。如果它是靜態的,那麼它更容易。

0

我認爲你需要對我們更具體些,以幫助你。

  1. 你是怎麼找到這個的? JavaScript的? PHP? Perl的?
  2. 您可以將ID屬性應用於標籤嗎?

如果文本是唯一的(或者真的,如果不是,但您必須運行數組),您可以運行正則表達式來查找它。使用PHP的preg_match()將爲此工作。

如果您使用Javascript並且可以插入ID屬性,那麼您可以使用getElementById('id')。然後可以通過DOM訪問返回的元素的屬性:https://developer.mozilla.org/en/DOM/element.1

14

儘管它已經很長一段時間,並且你已經(長以來)接受一個答案,我想我會提供一個更新的方法:

function findByTextContent(needle, haystack, precise) { 
 
    // needle: String, the string to be found within the elements. 
 
    // haystack: String, a selector to be passed to document.querySelectorAll(), 
 
    //   NodeList, Array - to be iterated over within the function: 
 
    // precise: Boolean, true - searches for that precise string, surrounded by 
 
    //       word-breaks, 
 
    //     false - searches for the string occurring anywhere 
 
    var elems; 
 

 
    // no haystack we quit here, to avoid having to search 
 
    // the entire document: 
 
    if (!haystack) { 
 
    return false; 
 
    } 
 
    // if haystack is a string, we pass it to document.querySelectorAll(), 
 
    // and turn the results into an Array: 
 
    else if ('string' == typeof haystack) { 
 
    elems = [].slice.call(document.querySelectorAll(haystack), 0); 
 
    } 
 
    // if haystack has a length property, we convert it to an Array 
 
    // (if it's already an array, this is pointless, but not harmful): 
 
    else if (haystack.length) { 
 
    elems = [].slice.call(haystack, 0); 
 
    } 
 

 
    // work out whether we're looking at innerText (IE), or textContent 
 
    // (in most other browsers) 
 
    var textProp = 'textContent' in document ? 'textContent' : 'innerText', 
 
    // creating a regex depending on whether we want a precise match, or not: 
 
    reg = precise === true ? new RegExp('\\b' + needle + '\\b') : new RegExp(needle), 
 
    // iterating over the elems array: 
 
    found = elems.filter(function(el) { 
 
     // returning the elements in which the text is, or includes, 
 
     // the needle to be found: 
 
     return reg.test(el[textProp]); 
 
    }); 
 
    return found.length ? found : false;; 
 
} 
 

 

 
findByTextContent('link', document.querySelectorAll('li'), false).forEach(function(elem) { 
 
    elem.style.fontSize = '2em'; 
 
}); 
 

 
findByTextContent('link3', 'a').forEach(function(elem) { 
 
    elem.style.color = '#f90'; 
 
});
<ul> 
 
    <li><a href="#">link1</a> 
 
    </li> 
 
    <li><a href="#">link2</a> 
 
    </li> 
 
    <li><a href="#">link3</a> 
 
    </li> 
 
    <li><a href="#">link4</a> 
 
    </li> 
 
    <li><a href="#">link5</a> 
 
    </li> 
 
</ul>

當然,一個有些簡單的方法仍然是:

var textProp = 'textContent' in document ? 'textContent' : 'innerText'; 
 

 
// directly converting the found 'a' elements into an Array, 
 
// then iterating over that array with Array.prototype.forEach(): 
 
[].slice.call(document.querySelectorAll('a'), 0).forEach(function(aEl) { 
 
    // if the text of the aEl Node contains the text 'link1': 
 
    if (aEl[textProp].indexOf('link1') > -1) { 
 
    // we update its style: 
 
    aEl.style.fontSize = '2em'; 
 
    aEl.style.color = '#f90'; 
 
    } 
 
});
<ul> 
 
    <li><a href="#">link1</a> 
 
    </li> 
 
    <li><a href="#">link2</a> 
 
    </li> 
 
    <li><a href="#">link3</a> 
 
    </li> 
 
    <li><a href="#">link4</a> 
 
    </li> 
 
    <li><a href="#">link5</a> 
 
    </li> 
 
</ul>

參考文獻:

33

您可以使用XPath完成這個

var xpath = "a[text()='SearchingText']"; 
var matchingElement = document.evaluate(xpath, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; 

也可以搜索使用此XPath包含一些文本的元素:

var xpath = "a[contains(text(),'Searching')]"; 
+1

這應該是最好的答案。 XPath可以做的更多,比如按屬性值選擇節點,選擇節點集...簡單介紹:https://www.w3schools.com/xml/xpath_syntax.asp – Timathon 2017-12-02 02:43:21

+0

簡單,優雅和先進。最佳答案。 – 2018-01-21 22:13:33

+0

問題是,這個詭計 – vsync 2018-03-01 09:43:24

9

使用最現代的語法vailable此刻,它可以非常清晰地做過這樣的:

for (const a of document.querySelectorAll("a")) { 
    if (a.textContent.includes("your search term")) { 
    console.log(a.textContent) 
    } 
} 

或者用一個單獨的過濾器:

[...document.querySelectorAll("a")] 
    .filter(a => a.textContent.includes("your search term")) 
    .forEach(a => console.log(a.textContent)) 

當然,傳統的瀏覽器將無法處理這個問題,但你可以使用一個transpiler如果需要傳統支持。

1

與其他答案相比,我發現使用較新的語法稍微短一些。因此,這裏是我的建議:

const callback = element => element.innerHTML == 'My research' 

const elements = Array.from(document.getElementsByTagName('a')) 
// [a, a, a, ...] 

const result = elements.filter(callback) 

console.log(result) 
// [a] 

JSfiddle.net

4

功能的方法。在檢查時返回所有匹配元素的數組並修剪空格。

function getElementsByText(str, tag = 'a') { 
    return Array.prototype.slice.call(document.getElementsByTagName(tag)).filter(el => el.textContent.trim() === str.trim()); 
} 

使用

getElementsByText('Text here'); // second parameter is optional tag (default "a") 

如果你正在尋找通過不同的標籤,即跨度或按鈕

getElementsByText('Text here', 'span'); 
getElementsByText('Text here', 'button'); 

默認值標籤= 'A' 將需要通天舊的瀏覽器

-2

jQuery版本:

 

$('.class_name').each(function(i) { 
    var $element = $(this)[i]; 

    if($element.text() == 'Your Text') { 
     /** Do Something */ 
    } 
}); 

-1

我只是需要一種方法來獲取包含特定文本的元素,這就是我想出的。

使用document.getElementsByInnerText()獲取多個元素(多個元素可能具有相同的確切文本),並使用document.getElementByInnerText()來獲取僅一個元素(第一個匹配項)。

另外,您可以使用元素(例如someElement.getElementByInnerText())而不是document來本地化搜索。

您可能需要調整它以使其跨瀏覽器或滿足您的需求。

我認爲代碼是不言自明的,所以我會保持原樣。

HTMLElement.prototype.getElementsByInnerText = function (text, escape) { 
 
    var nodes = this.querySelectorAll("*"); 
 
    var matches = []; 
 
    for (var i = 0; i < nodes.length; i++) { 
 
     if (nodes[i].innerText == text) { 
 
      matches.push(nodes[i]); 
 
     } 
 
    } 
 
    if (escape) { 
 
     return matches; 
 
    } 
 
    var result = []; 
 
    for (var i = 0; i < matches.length; i++) { 
 
     var filter = matches[i].getElementsByInnerText(text, true); 
 
     if (filter.length == 0) { 
 
      result.push(matches[i]); 
 
     } 
 
    } 
 
    return result; 
 
}; 
 
document.getElementsByInnerText = HTMLElement.prototype.getElementsByInnerText; 
 

 
HTMLElement.prototype.getElementByInnerText = function (text) { 
 
    var result = this.getElementsByInnerText(text); 
 
    if (result.length == 0) return null; 
 
    return result[0]; 
 
} 
 
document.getElementByInnerText = HTMLElement.prototype.getElementByInnerText; 
 

 
console.log(document.getElementsByInnerText("Text1")); 
 
console.log(document.getElementsByInnerText("Text2")); 
 
console.log(document.getElementsByInnerText("Text4")); 
 
console.log(document.getElementsByInnerText("Text6")); 
 

 
console.log(document.getElementByInnerText("Text1")); 
 
console.log(document.getElementByInnerText("Text2")); 
 
console.log(document.getElementByInnerText("Text4")); 
 
console.log(document.getElementByInnerText("Text6"));
<table> 
 
    <tr> 
 
     <td>Text1</td> 
 
    </tr> 
 
    <tr> 
 
     <td>Text2</td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
      <a href="#">Text2</a> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
      <a href="#"><span>Text3</span></a> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
      <a href="#">Special <span>Text4</span></a> 
 
     </td> 
 
    </tr> 
 
    <tr> 
 
     <td> 
 
      Text5 
 
      <a href="#">Text6</a> 
 
      Text7 
 
     </td> 
 
    </tr> 
 
</table>