2012-02-18 110 views
0

注入我有嵌入在加載的HTML頁面中時,下面的代碼工作順利工作時:JavaScript代碼中的HTML包含但不是在加載/單獨

<HEAD> 
<script language="javascript" type="text/javascript"> 
document.addEventListener('DOMContentLoaded', function() 
{ 
    document.documentElement.addEventListener("touchstart", function (e) 
    { 
      if (['A', 'BUTTON'].indexOf(e.target.tagName) === -1) 
      { 
       e.preventDefault(); 
       e.stopPropagation(); 
       invokeObjectiveC("ontouchstart:"); 
      } 
      else 
      { 
       e.preventDefault(); 
       e.stopPropagation(); 
       invokeObjectiveC(e.target); 
      } 
    }, true); 
}, false); 


function invokeObjectiveC(action) { 
    ... 
} 

但是如果我把它在html之外並且嘗試分開地加載它然後它不工作。 當單獨加載它,它看起來是這樣的:

alert('test'); 

function addListener() 
{ 
    alert('adding listener'); 

    document.addEventListener('DOMContentLoaded', function() 
      { 
      document.documentElement.addEventListener("touchstart", function (e) 
         { 
         alert('touchstart'); 
         if (['A', 'BUTTON'].indexOf(e.target.tagName) === -1) 
         { 
         e.preventDefault(); 
         e.stopPropagation(); 
         invokeObjectiveC("ontouchstart:"); 
         } 
         else 
         { 
         e.preventDefault(); 
         e.stopPropagation(); 
         invokeObjectiveC(e.target); 
         } 
         }, true); 
      }, false); 


} 

addListener(); 


function invokeObjectiveC(action) { 
    ... 
} 

添加的情況下,「測試」和「添加監聽器」的警告對話框顯示,所以我知道這部分工作。 但是,代碼不起作用 - 它應該在屏幕的某些部分檢測觸摸(這是在iOS上)。 隨着HTML內的代碼一切正常,它會在屏幕被觸摸時執行,當它被單獨加載時,屏幕被觸摸時什麼都不會發生。 任何想法可能是什麼問題?

====== UPDATE 我試圖運行在生命週期的不同階段以下,其中甚至載荷已經發出尋呼請求之前,但「大教堂加載內容」永遠不會出現:

var script = document.createElement('script'); 
script.type = 'text/javascript'; 
script.text = 
var Test = 
{ 
f: function() 
    { 
     if (!event.originalTarget.defaultView.frameElement) 
     { 
      alert('DOM content loaded'); 
     } 
    } 
} 

function addTestListener() 
{ 
    alert('adding listener'); 
    window.addEventListener("DOMContentLoaded", function(e) { Test.f(); }, false); 
} 



document.getElementsByTagName('head')[0].appendChild(script); 
+0

當你說「分開載入」時,你是什麼意思?你是否在DOM加載後手動加載它?如果是這樣,那麼'DOMContentLoaded'事件可能已經被觸發,所以你的處理程序永遠不會被調用。 – jfriend00 2012-02-18 22:59:31

+0

我正在使用名爲stringByEvaluatingJavaScriptFromString的iOS函數來執行腳本。我試過在頁面加載前後執行它。 – Gruntcakes 2012-02-18 23:42:23

回答

1

我改了行

功能的addListener()

窗口:您可以通過檢查,看看是否該文件已經被更改代碼這個加載修復.onload = function addListener()

它似乎已經伎倆

1

從您對iOS功能的評論中,我懷疑當您嘗試執行您的JavaScript時文檔已經加載。如果是這樣,那麼DOMContentLoaded事件已經發生,所以你的代碼將永遠不會被初始化。

function addListener() { 
    alert('adding listener'); 

    function init() { 
     document.documentElement.addEventListener("touchstart", function (e) { 
      alert('touchstart'); 
      if (['A', 'BUTTON'].indexOf(e.target.tagName) === -1) { 
       e.preventDefault(); 
       e.stopPropagation(); 
       invokeObjectiveC("ims-ontouchstart:"); 
      } else { 
       e.preventDefault(); 
       e.stopPropagation(); 
       invokeObjectiveC(e.target); 
      } 
     }, true); 
    } 

    if (document.readyState === "complete") { 
     init(); 
    } else { 
     document.addEventListener('DOMContentLoaded', init, false); 
    } 
} 

addListener(); 

function invokeObjectiveC(action) { 
    ... 
} 
+0

感謝您的回覆。在視圖的各種加載階段中,有幾個機會來運行JavaScript,這些階段包含頁面和頁面本身(提供了諸如viewWillLoad,webViewDidAppear,webViewDidStartLoad等的回調)。我已經嘗試了我的原始代碼,您的代碼和一些新代碼,我已經在每個階段添加了上面的更新,但沒有運氣。 – Gruntcakes 2012-02-19 00:48:47

+0

@Wofofbeans - 你能檢查任何javascript錯誤嗎?你能夠在代碼中設置一個斷點並通過它來追蹤發生了什麼?對於更高級的調試來說,這可能是一種實際發生的事情,而不僅僅是嘗試。 – jfriend00 2012-02-19 00:54:24

+0

它不可能afaik設置斷點,有什麼我可以使用警報來顯示相關信息嗎? – Gruntcakes 2012-02-19 01:14:50