2016-11-22 36 views
0

注 - this似乎記錄我遇到的關於「postMessage」未定義的相同問題,但未提供答案。PDF postMessage未定義

我是使用PDF文件的新手。我正在嘗試修復現有應用程序中的錯誤。應用程序在瀏覽器中顯示一個表單,允許用戶編輯,然後使用Adobe的JavaScript postMessage方法將用戶的更改回送到服務器。出於某種原因,PDF對象似乎沒有定義postMessage方法。 pdfObject通過名稱很好找到,它有很多很多屬性(屬性是一個節點映射,baseURL是用戶導航到PDF時使用的URL,設置了childNodes和contentDocument,還有很多onXX方法(例如onBeforeCut, onActivate等),但是myPdfObj.postMessage是未定義的,PDF顯示正常並且可以編輯,但是當應用程序試圖調用未定義的方法postMessage時,屏幕上出現錯誤「ERROR:Target document not revealed」。想法可能會在

注意 - 它看起來像我們的臨時站點確實還甚至工作雖然PostMessage一未定義我不知道爲什麼然而,本地託管的網站無法正常工作

這裏有一個小。每個問題的更多信息發佈在評論:

我認爲它應該有一個postMessage函數,因爲我們的代碼正在調用該方法,並且它沒有在任何地方聲明,並且我從網上的帖子找到證據(例如, herehere)其他人正在PDF對象上調用該方法,所以我認爲這是Adobe提供的。

瀏覽器是IE II。

這是導致錯誤的代碼 - 當這個按鈕被點擊

<button id="useraction_savedraft" onclick="saveDraft();">Save Draft</button> 

這個JavaScript被稱爲:

function saveDraft() { 
    $('#keepAsDraft').val('true'); 
    sendMessage(["submitForm"]); 
} 

var pdfObject = null; 
function sendMessage(aMessage) { 

    if (pdfObject == null) { 
     pdfObject = document.getElementById("pdfForm"); 

     if (typeof(pdfObject) == "undefined" || typeof (pdfObject.postMessage) == "undefined") { 
      statusErrorMessage("ERROR: Unable to initialize pdfForm. Your browser may not be compatible with PDF inline-editing."); 
      return; 
     } 

     pdfObject.messageHandler = { 
      onMessage: function(msg) { 
       if (msg[0]=="saveFdf") { 
        $("#fdf").val(msg[1]); 
        $("#entryForm").submit(); 
       } 

       else if (msg[0]=="saveXFA") { 
        $("#fdf").val(""); 
        $("#xfa").val(msg[1]); 
        $("#entryForm").submit(); 
       } 
      }, 

      onError: function(error, msg) 
      { 
       statusErrorMessage("ERROR: " + error.message); 
       return; 
      } 
     }; 
    } 

    pdfObject.postMessage(aMessage); 
} 

運行時的onMessage和onError的被稱爲是JS功能的腳本嵌入PDF文件本身(我們使用第三方庫來嵌入腳本)。這些函數被稱爲myOnMessage和myOnError。我們還同一個JavaScript定義myOnDisclose方法,並在嵌入腳本的末尾,它使用這種邏輯的方式分配到容器的的MessageHandler:

var msgHandlerObject = new Object(); 
msgHandlerObject.onMessage = myOnMessage; 
msgHandlerObject.onError = myOnError; 
msgHandlerObject.onDisclose = myOnDisclose; 
msgHandlerObject.myDoc = this; 

this.hostContainer.messageHandler = msgHandlerObject; 

非常感謝!

+1

你爲什麼認爲PDF應該有一個'postMessage'函數?你能否發佈導致錯誤的代碼? –

+0

PDFs是他們自己的沙箱 –

+0

「在瀏覽器中顯示錶單」是它在應用程序或外部瀏覽器中的嵌入式瀏覽器。它是什麼瀏覽器?鉻?鉻? IE瀏覽器?火狐? – Bigman

回答

0

那麼,我不知道如何解釋它,但似乎沒有什麼方法「postMessage」是未定義的。事實證明,回調不起作用的原因是我正在改變它調用的腳本嵌入到PDF服務器端的方式,而不是再將它們嵌入它們。當我解決這個問題時,它一切正常,儘管postMessage仍然未定義,所以我不確定它爲什麼/如何工作。