2012-09-11 53 views
3

考慮到目標頁面上這個HTML:我的用戶如何根據鏈接的文本獲取鏈接?

<dd class="ddTit"> 
<a href="http://abc.xxx.com/54781.html" target="_blank">special text words</a> 
</dd> 

我怎樣才能基於「特殊文本的話」的網址,並做Greasemonkey的腳本點擊?

我嘗試這樣做:

var textlink = document.querySelector ("dd.ddTit a[textContent*='special']"); 
var clickEvent  = document.createEvent ('MouseEvents'); 
clickEvent.initEvent ('click', true, true); 
textlink.dispatchEvent (clickEvent); 

沒有運氣。

如何根據textContent進行選擇,如textContent包含字特殊

+0

如果超過一個鏈接包含特殊文本的話,那麼如何讓所有這些環節的開放? – user1663601

回答

3

唉,你不能這樣做querySelector(),因爲CSS selectors do not (yet) offer a content/text selector

這裏有3種方法:

  1. 遍歷節點有針對性地選擇:

    var ddTitLinks = document.querySelectorAll ("dd.ddTit a"); 
    
    for (var J = ddTitLinks.length - 1; J >= 0; --J) { 
        var ddTitLink = ddTitLinks[J]; 
        //--- Case-insensitive search. 
        if (/special text words/i.test (ddTitLink.textContent)) { 
         var clickEvent  = document.createEvent ('MouseEvents'); 
         clickEvent.initEvent ('click', true, true); 
         ddTitLink.dispatchEvent (clickEvent); 
         break; 
        } 
    } 
    


  2. 使用jQuery(一個強大的庫,它會爲你節省一噸的悲傷):

    // ==UserScript== 
    // @name  _Click Special link(s) 
    // @include http://YOUR_SERVER.COM/YOUR_PATH/* 
    // @require http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js 
    // ==/UserScript== 
    
    //--- Note that contains() is CASE SENSITIVE. 
    var specLink = $("dd.ddTit a:contains('special text words')"); 
    if (specLink.length) { 
        var clickEvent = document.createEvent ('MouseEvents'); 
        clickEvent.initEvent ('click', true, true); 
        specLink[0].dispatchEvent (clickEvent); 
    } 
    


  3. 使用XPath:

    //--- Note that contains() is CASE SENSITIVE. 
    var specLinks = document.evaluate (
        "//dd[contains(@class, 'ddTit')]/a[contains(text(), 'special text words')]", 
        document, 
        null, 
        XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, 
        null 
    ); 
    
    if (specLinks.snapshotLength) { 
        var specLink = specLinks.snapshotItem (0); 
        var clickEvent = document.createEvent ('MouseEvents'); 
        clickEvent.initEvent ('click', true, true); 
        specLink.dispatchEvent (clickEvent); 
    } 
    
+0

非常感謝,我測試了三種方法,都很好。 但是對於第一種方法,** /特殊文本文字/ **如果特殊文本文字包含**/**符號,則會遇到一些問題。 從我的測試來看,JQurey方法更快更強,是真的嗎?我喜歡。 有時鏈接包含**特殊文本字**在頁面中有多個,以及如何使它們全部正常工作,我的意思是打開所有包含**特殊文本字樣的鏈接**? 謝謝。 – user1663601

+0

這超出了你在這個問題中提出的要求。這個問題根據問題回答。 **標記出來,並提出一個新的問題,並附加要求。**就像你如何開啓所有鏈接?只要你打開一個,新的頁面會替換當前的頁面。你想在新標籤中打開一堆鏈接嗎?在新的問題中陳述所有這些。 –

+0

對不起@BrockAdams,當我測試腳本,我選擇了頁面上的最後一部分,我發現打開的標籤不是我期望的鏈接。所以我檢查並發現該頁面上有多個鏈接符合**特殊文本字樣**的條件。 對不起,再次感謝。我從中學到了很多東西。我會問一個關於這種情況的新問題。 – user1663601

0

如果你真的沒有什麼,但內容識別的鏈接,你可能不得不遍歷所有的鏈接找到您想要的:執行它是什麼使用jQuery Greasemonkey的腳本

var links = document.getElementsByTagName('a'); 

for (var i = 0; i < links.length; i++) { 
    var link = links[i]; 
    if (/special/.test(link.textContent)) { 
     // do something with link 
    } 
} 
+0

感謝您的好意幫助〜已經在學習解決方案。 – user1663601

1

這裏你想:

// ==UserScript== 
// @name  your script 
// @namespace http://foobarfoobar.com/ 
// @version 0.1 
// @description Trigger click with jquery 
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js 
// @match  http://*/* 
// ==/UserScript== 

(function() { 
    $(document).ready(function(){ 
     $('dd.ddTit').find("a:contains('special text words')").bind('click', function() { 
      window.location.href = this.href; 
      return false; 
     }).trigger('click'); 

    }); 
})(); 

,如果你複製一些這個代碼,腳本的確保包括行:

// @require http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js 

所以jquery代碼運行良好,還將@match規則調整到要應用腳本的特定站點。

+0

不知道版權聲明是合法/潔淨堆棧溢出... –

+0

沒問題,我剛剛刪除它。 – Nelson

+0

@Brock,Nelson:版權聲明對我來說似乎很完美。您在本文中保留版權,您只需同意在CC-By-SA(允許其他人複製,重新發布和修改它們,只要它們歸因於您並在同一許可證下發布其修改) 。事實上,有人可能會爭辯說,這樣的通知實際上是有用的,因爲它可以更容易地遵守歸因要求。 –

相關問題