2013-07-02 43 views
2

對於Chrome瀏覽器插件,我試圖滾動到包含給定字符串的DOM元素。但是,在過濾選擇器之後,我在DOM中有點迷路了。滾動到javascript中的文本

$('*', 'body') 
    .andSelf() 
    .contents() 
    .filter(function(){      
     return this.nodeType === 3; 
    }) 
    .filter(function(){ 
     // Only match when contains given string anywhere in the text  

     if(this.nodeValue.indexOf(givenString != -1){ 
      //idArr.push(this.offsetLeft); 

      var ele = $(this); 
         $('html, body').animate({ 
        scrollTop: ele.offset().top 
        }, 2000);        
       return true; 
      } 

      return false; 

    }); 

每當我試圖得到的ele的頂偏,我得到的頂部相對於文檔而不是滾動條的偏移。有任何想法嗎?我認爲這可能是一個範圍問題,我在過濾器裏面使用了$this,但是this裏面的一個過濾器應該引用當前的DOM元素。

編輯:

通過調用

var ele=$(this.parentNode);

我能得到包含文本節點

+0

也許這個幫助你https://developer.mozilla.org/en-US/docs/Web/API/element.scrollIntoView – zloctb

回答

2

試試這個元素:

var matches = $('body, body *'). 
     addBack(). 
     contents(). 
     filter(function(){      
      return this.nodeType === 3; 
     }). 
     filter(function(){ 
     // Only match when contains given string anywhere in the text    
      if(this.nodeValue.indexOf(givenString) != -1) 
       return true; 
     }).first(); 

基本相同過濾你有(我剛剛添加了一個missin g括號)。這將爲您提供與您的字符串匹配的第一個(如果有的話)文本節點。但是,因爲你不能直接獲得DOM中的textnodes位置(參見this question),你可能想嘗試一個簡單的技巧,它包裹span元素裏面,然後檢索偏移滾動頁面:

if(matches.length > 0){ 
    var offset = $(matches).wrap('<span>').parent().offset().top; 
    $('html, body').animate({scrollTop: offset}, 'slow'); 
} 

小提琴例如here

0
el = $(":not(html, body, div, table, tbody, tr):contains('" + givenString + "')") 

這將返回匹配的元素。然後你可以滾動到元素