2010-10-27 123 views
1

我的代碼在這裏從iFrame中返回一個JavaScript選擇對象(iFrame頁面在同一個域內,因此沒有xss問題)。JavaScript - 如何在文檔中獲取當前選擇'索引'

我需要知道的是在原始html代碼(不是dom)內選擇的索引。

UPDATE:

例如

如果你有一個HTML文檔:

<html><body>ABC</body></html> 

並在UI,用戶使用他們的鼠標來選擇文字「ABC」,我希望能夠使用JavaScript來確定的在現在的位置在html源文件中選擇文本。在這種情況下,ABC的指數是13

更新2

我用這種瘋狂的堅持的原因是,我需要創建一個工具,可以重新訪問網頁和基於文本上拉用戶在較早時間識別的選定文本。用戶告訴系統文本的位置,系統從這一點開始使用正則表達式來提取文本。現在,如果dom與原始html不一樣,並且沒有辦法確定原始html中的選擇 - 要知道要生成哪個reg ex是非常困難的。我不認爲有另一種解決方法。

// Returns the raw selection object currently 
     // selected in the UI 
     function getCurrentSelection() { 

      var selection = null; 

      var iFrame = document.getElementById('uc_iFrameGetPriceData'); 

      try { 

       if (window.getSelection) { // Gecko 

        selection = iFrame.contentWindow.getSelection(); 
       } 
       else { // IE 

        var iframeDoc = iFrame.contentWindow.document; 

        if (iframeDoc.selection) { 

         selection = iframeDoc.selection; 
        } 
        else { 

         selection = iframeDoc.contentWindow.getSelection(); 
        } 
       } 
      } 
      catch (err) { 

       alert('Error: getCurrentSelection() - ' + err.description) 

      } 

      return selection; 
     } 
+0

不確定你的意思 - z索引或childNode索引?即在父節點中的位置或頁面上的堆棧高度? – Ben 2010-10-27 07:46:37

+0

假設你有一個html文檔 - ABC,ABC的索引是13.希望有幫助,我會盡力澄清我的問題。 – gb2d 2010-10-27 07:50:41

+0

你爲什麼要這個號碼? – 2010-10-27 08:53:13

回答

1

您可以訪問索引,並通過使用selection.anchorOffsetselection.focusOffset選擇的偏移。

看看這個: http://help.dottoro.com/ljjmnrqr.php

而且這裏的另一個好explaned文章: http://www.quirksmode.org/dom/range_intro.html

更新到最新動態:我不知道爲什麼你正在試圖獲得該指數的原始HTML代碼。但是,你可以走,根據該選擇還挺喜歡這個DOM:

selection.anchorNode.nodeValue.replace(selection.anchorNode.nodeValue.substring(selection.anchorOffset, selection.focusOffset), 'replace value') 

需要注意的是,它仍然有可能anchorOffsetfocusOffset之前,根據您是否選擇了文字從左至右或從右到左。

+0

感謝您的鏈接,這是一個很好的範圍對象介紹。但是,我不確定它是否有助於我解決具體問題 - 我需要在整個html文檔的上下文中定位,它必須是原始html,而不是從dom讀取生成的innerHtml。 – gb2d 2010-10-27 08:18:32

+1

查看我更新的更新... :) – koko 2010-10-27 08:38:04

0

如果我理解正確,那麼您正在尋找在DOM中移動。在這種情況下,你可以使用這些方法/屬性:

  • parentNode
  • getChildNodes()
  • firstChildlastChild

...而這些鏈接可能會有所幫助:

http://www.codingforums.com/archive/index.php/t-81035.html

http://www.sitepoint.com/forums/showthread.php?t=586034

最快的方式可能是

var node = document.getElementById('myElement'); alert(node.parentNode.indexOf(node));

(對不起,出於某種原因,格式按鈕都沒有顯示出來在我的「你的答案」區域...)

0

如果有這些信息,我會感到驚訝。

否DOM API是打算讓你區分

之間
<html><body>ABC</body></html> 

<html ><body  >ABC</body></html> 

在原始HTML該指數是在每種情況下不同,但構建DOM是相同的。

0

你不能這麼做:唯一可行的方法是通過Ajax重新下載頁面的HTML,解析HTML並將結果DOM與當前DOM進行匹配,而DOM本身可能已被JavaScript改變。此外,它無論如何都不是一個有用的數字,因爲一旦頁面被加載,原來的HTML字符串就不再存在於DOM中,因此該字符串中的偏移量在JavaScript中沒有意義。根據節點和偏移量進行選擇要明智得多。

+0

您可以使用ajax獲取服務器發送的原始HTML,或者您可以將其發佈到隱藏的現場服務器端,這不是棘手的問題。無論是有用的數字,還是具體的問題。在我個人的情況下,這是一個非常有用的數字。 – gb2d 2010-10-28 14:33:58

+0

是的,你是對的,你可以從服務器上獲得原始的HTML,這是一種我大打折扣的方法。我試圖達到你的確切要求,以便我可以提出一個替代方案,因爲我相信這不是要走的路。 – 2010-10-28 15:27:28

+0

經過一番調整後,我支持這個答案。最近的downvoter會關心解釋他們的downvote嗎? – 2011-10-17 08:19:17

相關問題