2010-07-09 76 views
1

我不得不調試在IE8中失敗的基於WYSIWYG JavaScript的HTML編輯器。它只適用於IE,所以應該簡化解決方案。下面是現有的代碼失敗:在IE8中對選擇和範圍功能的更改

function isAllowed() { 
    var sel 
    var obj 

     sel = foo.document.selection 

     if (sel.type != "Control") 
     { 
      obj = sel.createRange().parentElement() 
     } else { 
      obj = sel.createRange()(0) 
     } 

     if (obj.isContentEditable) { 
      foo.focus() 
      return true 
     } else { 
      return false 
     } 
} 

本質上正在發生的事情是,如果你選擇一些文本,然後單擊說插入圖像按鈕,它第一次運行這個isAllowed功能,看是否文本你」已被選中是可編輯的(即在ContentEditable的iframe中)。
這似乎是在IE8分解在document.selectioncreateRange()

的問題是,當你不用鼠標選擇任何文本,並在編輯區單擊某個地方,sel.createRange().parentElement()似乎iframe的外面返回的元素,它因此不CONTENTEDITABLE和函數返回

我想知道是否有人可以對IE8的選擇和範圍的實現中會發生什麼變化有任何見解,會導致這種行爲?

回答

1

好的,答案很簡單!它必須改變IE8通過添加foo.focus()來保持iframe焦點的方式。到下面的代碼,一切都按預期工作。希望這可以幫助別人,但它可能不會如果他們的代碼正確寫在第一位:)

function isAllowed() { 
    var sel; 
    var obj; 

     foo.focus(); 
     sel = foo.document.selection; 

     if (sel.type != "Control") 
     { 
      var rng = sel.createRange(); 
      obj = rng.parentElement(); 
     } else { 
      obj = sel.createRange()(0); 
     } 

     if (obj.isContentEditable) { 
      foo.focus(); 
      return true; 
     } else { 
      return false; 
     } 
} 
0

您是否考慮過使用調試器或將警報放入javscript中,以便您能夠弄清楚發生了什麼。找出哪個元素正在返回,也許你會發現你的問題。它可能會返回一些父元素,而不是iframe(我只是在這裏猜測)。另外,我不確定爲什麼它只會在點擊該區域時運行。也許我誤解了一些東西。

+0

呵呵,一直在搞IE8調試器幾個小時。我可以看到發生了什麼,基本上如果你沒有選擇任何東西,但是在iframe中有光標,'selection'上的getParent()會返回整個頁面的一大塊。就好像它忽略了iframe。也許問題在於iframe(在代碼中用變量foo引用)。我會進一步挖掘。誰在生產代碼中使用foo!真! (我沒有寫代碼:D) – 2010-07-09 04:15:45

+0

希望你弄明白。也許發生的事情是,當你只點擊試圖獲取iframe的父級而不是iframe中的內容時? – qw3n 2010-07-09 04:28:46