2012-12-09 99 views
4

我是一名初學者開發者。我試圖隱藏一個由第三方JavaScript動態添加到頁面的div,以達到審美目的。如何使用JavaScript來隱藏基於文本的元素?

問題是div沒有id屬性;這甚至有可能嗎? div是否具有基於它們加載順序的任何固有屬性?或者有什麼方法可以搜索一串文本並隱藏該元素?

例如,根據文本happy New year刪除<div>happy New year</div>

+1

不挑剔,但它實際上是一個HTML DOM元素。 CSS沒有元素,可以通過元素名稱,類名或id來選擇它們。選擇像JQuery這樣的引擎使用類似css的語法來選擇你想要的元素。 – Spoike

回答

7

您可以先選擇相關的元素並遍歷它們直到找到想要的。

jQuery中這是可以做到這樣的:

// select relevant elements 
var elements = $('div'); 

// go through the elements and find the one with the value 
elements.each(function(index, domElement) { 
    var $element = $(domElement); 

    // does the element have the text we're looking for? 
    if ($element.text() === "happy New year") { 
     $element.hide(); 
      // hide the element with jQuery 
     return false; 
      // jump out of the each 
    } 
}); 

注意,代碼是有點脆,完全依賴於元素的內容。以下是相關的JQuery的API文檔:

請注意,您可以更具體與您的選擇說你有下面的代碼:

<div class="message"> 
    <div>happy New year<div> 
</div> 

您可以選擇與元素:

var domElement = $('.message div')[0]; // hopefully it only happens once 
+0

嗨Spoike!我試過下面的代碼,它似乎並沒有隱藏div。 – Richard

+0

http://pastebin.com/jZarK0vP – Richard

+0

@Richard哎呀,有一個paren錯字。它在這個jsfiddle中工作:http://jsfiddle.net/vU7Vn/我編輯了答案。 – Spoike

2

我想我會提供一個簡單的JavaScript替代方案中,這可以改善(相當多的),布爾值的特別是通過作爲字符串(這感覺可怕):

function hideByText(text, opts) { 
    if (!text) { 
     return false; 
    } 
    else { 
     var defaults = { 
      // the element we look within, expects: 
      // 1: node reference, eg the result of: document.getElementsByTagName('div')[0] 
      // 2: an element's id, as a string, eg: 'test' 
      'within': document.body, 
      // the element type, eg 'div', 'span', 'p', defaults to *everything* 
      'elemType': '*', 
      // case-sensitivity, as a string: 
      // 'true' : is case sensitive, 'Some' will not match 'some', 
      // 'false' : is case insensitive, 'Some' will match 'some' 
      'sensitive': 'true', 
      // 'absolute' : 'some text' will not match 'some text.' 
      // 'partial' : 'some text' will match 'some text.' 
      'match': 'absolute', 
      // 'true' : removes white-space from beginning, and end, of the text, 
      // 'false' : does not remove white-space 
      'trim': 'true', 
      // the class to add to elements if a match is made, 
      // use CSS to hide, or style, the matched elements 
      'matchedClass': 'hasText' 
     }, 
      opts = opts || {}; 

     for (var setting in defaults) { 
      if (defaults.hasOwnProperty(setting)) { 
       opts[setting] = opts[setting] || defaults[setting]; 
      } 
     } 

     var within = opts.within.nodeType == 1 ? opts.within : document.getElementById(opts.within), 
      elems = within.getElementsByTagName(opts.elemType), 
      flags = opts.sensitive == 'true' ? 'i' : '', 
      needle = opts.trim == 'true' ? text.replace(/^(\s+) || (\s+)$/g, '') : text, 
      haystack, 
      reg = new RegExp(needle, flags); 

     if (opts.match == 'absolute') { 
      for (var i = 0, len = elems.length; i < len; i++) { 
       if ((elems[i].textContent || elems[i].innerText) == text) { 
        elems[i].className = opts.matchedClass; 
       } 
      } 
     } 
     else if (opts.match == 'partial') { 
      for (var i = 0, len = elems.length; i < len; i++) { 
       if ((elems[i].textContent || elems[i].innerText).match(reg)) { 
        elems[i].className = opts.matchedClass; 
       } 
      } 
     } 
    } 
} 

hideByText('some text', { 
    'match': 'partial', 
    'sensitive': 'true', 
    'elemType': 'p', 
    'matchedClass' : 'hasText' 
});​ 

JS Fiddle demo

+0

謝謝大衛 – Richard

+0

你真的很受歡迎!希望這對你和其他人有用。 =) –

+1

這是一個非常酷的答案。我改變了基於字符串的布爾值,並稍微改變了reg正則表達式的構造。 [jsFiddle](http://jsfiddle.net/2KseA/3/) – tiffon

1

A previous answer將根據組合文本內容(see .text() behavior)隱藏節點。下面的測試案例可以說明這一點:

should stay: <div><em>happy New year</em></div><br> 
should stay: <div>happy New years</div><br> 
should stay: <div>happy New <em>year</em></div><br> 
should stay: <div>Something else entirely</div><br> 
should hide: <div>happy New year</div> 

如下所示:jsFiddle

根據你的情況的細節,更一般的行爲可能是你想要的,因爲它會忽略對後代的結構,只有匹配組合文本。但是,如果你需要隱藏明確包含文本的<div>,像下面這樣只會隱藏在測試用例的最後<div>

var tx = 'happy New year'; 
$('div:contains(' + tx + ')').filter(function(){ 
    var $content = $(this).contents(); 
    return $content.length === 1 && 
     $content[0].nodeType === 3 && 
     $content.text() === tx; 
}).hide(); 

如下所示:jsFiddle

最初的選擇可以修改爲隱藏包含特定文本的任何內容。這種更通用的方法將隱藏在第一種情況下<em>元素,並在最後一種情況的<div>元素:

$(':contains(' + tx + ')').filter(// etc... 

你可能會考慮removing the element from the DOM,而不是隻隱藏它。

:contains() jQuery selector

.filter() jQuery method

.contents() jQuery method

nodeType Node property

.remove() jQuery method

0

您可以真正做到這一點使用一個線

$("div").text("happy New year").hide();