2011-04-30 102 views
2

解決方案:下面的問題是由覆蓋核心JavaScript函數的Divx JavaScript引起的。感謝aeno發現這一點,並感謝在Divx編碼器上做到這一點的人們!IE8 tinyMCE .NET插入圖像

問題:單擊tinymce工具欄中的插入圖像按鈕不會在IE8中執行任何操作。

描述:忍受我在這裏。我不認爲這個問題與tinymce有關,這可能是IE8的錯,但我需要比我更聰明的人幫助解決最後一塊難題,以找出誰來負責這件事......

所以基本上我在Visual Studio 2010中使用tinyMCE,並且如上所述解決了問題。所以我切換到tinyMCE源代碼來調試。這個問題似乎在這片在inlinepopups/editor_plugin_src.js代碼,行358的發生:

_addAll : function(te, ne) { 
    var i, n, t = this, dom = tinymce.DOM; 

    if (is(ne, 'string')) 
     te.appendChild(dom.doc.createTextNode(ne)); 
    else if (ne.length) { 
     te = te.appendChild(dom.create(ne[0], ne[1])); 

     for (i=2; i<ne.length; i++) 
     t._addAll(te, ne[i]); 
    } 
}, 

的代碼是準確的線,

te = te.appendChild(dom.create(ne[0], ne[1])); 

在IE8 Te爲null,因爲TE .appendChild不返回任何內容。

爲了給出一些關於代碼的背景信息,te是一個DOM.doc.body對象,ne似乎是一個包含需要創建的內聯彈出對象結構的json對象。

所以回到代碼..這適用於所有其他瀏覽器沒有問題。所以我進入函數appendChild,並將其帶入一些「JScript - 腳本塊[動態]」文件,這是不可想象的。它覆蓋doc.body.appendChild功能...您可以在下面看到它,

code cut out 
... 
    var appendChildOriginal = doc.body.appendChild; 
    doc.body.appendChild = function(element) 
    { 
     appendChildOriginal(element); 
     var tag = element.tagName.toLowerCase(); 

     if ("video" == tag) 
     { 
      ProcessVideoElement(element); 
     } 
    } 
... 
code cut out 

在這裏我們可以很明顯的看出什麼地方出了錯。當然,te.appendChild不會返回任何內容......它沒有返回語句!

所以這個難題的最後一塊是wtf是這個動態腳本塊嗎?我不能爲上帝的愛找出這個腳本塊來自哪裏(VS2010不起作用)。我最深的懷疑是,這是IE8內置?任何人都可以對此有所瞭解嗎?下面我提供了一些更多這個神祕的腳本塊,以防萬一任何人都能找出它來自哪裏。我現在可以向你保證一件事,它不屬於我們項目中的任何腳本,因爲我們已經完成搜索,並且沒有任何東西出現。

var doc; 
var objectTag = "embed"; 

// detect browser type here 
var isInternetExplorer = (-1 != navigator.userAgent.indexOf("MSIE")); 
var isMozillaFirefox = (-1 != navigator.userAgent.indexOf("Firefox")); 
var isGoogleChrome = (-1 != navigator.userAgent.indexOf("Chrome")); 
var isAppleSafari = (-1 != navigator.userAgent.indexOf("Safari")); 

// universal cross-browser loader 
if (isInternetExplorer) 
{ 
    // use <object> tag for Internet Explorer 
    objectTag = "object"; 
    // just execute script 
    ReplaceVideoElements(); 
} 
else if (isMozillaFirefox) 
{ 
    // listen for the 'DOMContentLoaded' event and then execute script 
    function OnDOMContentLoadedHandled(e) 
    { 
     ReplaceVideoElements(); 
    } 

    window.addEventListener("DOMContentLoaded", OnDOMContentLoadedHandled, false); 
} 
else if (isGoogleChrome) 
{ 
    // just execute script 
    ReplaceVideoElements(); 
} 
else if (isAppleSafari) 
{ 
    // listen for the 'DOMContentLoaded' event and then execute script 
function OnDOMContentLoadedHandled(e) 
{ 
     ReplaceVideoElements(); 
} 
window.addEventListener("DOMContentLoaded", OnDOMContentLoadedHandled, false); 
} 

function MessageHandler(event) 
{ 
    //window.addEventListener("load", OnLoad, false); 
} 

// replacing script 
function ReplaceVideoElements() 
{ 
    if (isMozillaFirefox) 
    { 
     doc = window.content.document; 
    } 
    else 
    { 
     doc = document; 
    } 

    // set up DOM events for Google Chrome & Mozilla Firefox 
    if (isMozillaFirefox || isGoogleChrome || isAppleSafari) 
    { 
     doc.addEventListener("DOMNodeInserted", onDOMNodeInserted, false); 
     doc.addEventListener("DOMNodeInsertedIntoDocument", onDOMNodeInsertedIntoDocument, false); 
    } 
    // HACK : override appendChild, replaceChild, insertBefore for IE, since it doesn't support DOM events 
    if (isInternetExplorer) 
    { 
     var appendChildOriginal = doc.body.appendChild; 
     doc.body.appendChild = function(element) 
     { 
      appendChildOriginal(element); 
      var tag = element.tagName.toLowerCase(); 

      if ("video" == tag) 
      { 
       ProcessVideoElement(element); 
      } 
     } 

     var replaceChildOriginal = doc.body.replaceChild; 
     doc.body.replaceChild = function(element, reference) 
     { 
      replaceChildOriginal(element, reference); 
      var tag = element.tagName.toLowerCase(); 

      if ("video" == tag) 
      { 
       ProcessVideoElement(element); 
      } 
     } 

     var insertBeforeOriginal = doc.body.insertBefore; 
     doc.body.insertBefore = function(element, reference) 
     { 
      insertBeforeOriginal(element, reference); 
      var tag = element.tagName.toLowerCase(); 

      if ("video" == tag) 
      { 
       ProcessVideoElement(element); 
      } 
     } 
    } 
... 
code cut out 
+0

如果這是使用tinymce的新生產版本發生的,你應該寫一個bug報告(http://tinymce.moxiecode.com/develop/bugtracker_bugs.php) – Thariama 2011-05-02 08:56:22

回答

4

HI,

我處理相同問題打開prettyPhoto畫廊時存在的...... 我不知道在哪裏這個「腳本塊」是從哪裏來的,但它肯定會導致錯誤。

那麼,有沒有人知道這個可疑的腳本塊的任何東西?

感謝, aeno

編輯: 多一點谷歌搜索提供一些線索到它:所提腳本塊來自於瀏覽器安裝在InternetExplorer的DivX的插件。取消激活DivX插件突然解決了問題,prettyPhoto打開相當順利:)

現在我必須弄清楚DivX開發者是否有bug跟蹤器...

+0

好吧,我會被詛咒的!我也嘗試過使用Google搜索。我想知道你用什麼關鍵詞heh:P – Thirlan 2011-05-04 06:15:34

+0

我會試試看看它是否修復它。 – Thirlan 2011-05-04 06:15:52

+0

我剛剛搜索了一段javascript代碼:) – aeno 2011-05-05 11:02:53