2012-03-10 69 views
1

我使用了一個非常標準的「單頁」模式爲JQueryMobile發展,如:JQueryMobile的addEventListener引起類型錯誤:未定義 - 仍然執行

<div id="page1" data-role="page">Lorem Ipsum</div> 
<div id="page2" data-role="page"> 
    <div id="mycontent" data-role="content"></div> 
</div> 

當我點擊一個鏈接從第1頁第2頁來進行導航,我將內容附加到$(「#mycontent」),其中包含的圖像不總是指定寬度/高度,然後我應用iScroll-4,以便滾動/縮放內容 - 在某些情況下,我需要放大後立即放大它,以便它很好地適應移動屏幕(一般600px寬開始)。問題是,一旦圖像加載,格式化就會崩潰,特別是因爲我需要重新定位元素,因爲CSS縮放喜歡將放大的項目居中,而不是與頂部/左側對齊。

這可能是一個簡單問題的長期解釋(也許有更好的方法來做到上述?),但這裏是我真正的問題:我試圖添加事件監聽器的負載事件DIV,這樣我可以檢查,看看我是否需要重新定位的DIV一旦所有的圖像加載:

$("#mycontent").addEventListener('load', doSomething(), false); 

function doSomething(){ alert("something"); } 

瘋狂的事情是,DoSomething的()DOES被解僱,但隨後的Safari拋出以下錯誤和崩潰JQuery:

TypeError: 'undefined' is not a function (evaluating '$("#mycontent").addEventListener('load', doSomething(), false)')

該元素存在於DOM中,並且在添加事件偵聽器時它肯定會加載 - 我猜這是由它觸發的事實弄清楚的。 JQM在元素轉換時將一些樣式應用於元素,但我不明白這會對其產生什麼影響。

任何幫助,將不勝感激,因爲我一直在敲我的頭這一段時間,我要寫一些非常醜陋的循環的黑客來檢查大小的變化:/

+0

我要補充一點,我打電話pageshow事件中的代碼對addEventListener,但我也嘗試過在pagebeforeshow事件。序列中的任何早期事件都會導致不同的錯誤,並且該函數不會被觸發。我相信這個錯誤是由於該元素尚未存在。它必須在過渡期間暫時移除...? – jstafford 2012-03-10 22:06:19

回答

0

有兩個可能的問題。 addEventListener的第二個參數應該是一個函數,而不是函數調用:element.addEventListener("load", doSomething, false);。在你的代碼中,無論事件名是什麼,doSomething()都會被執行。

此外,$('#mycontent')返回我認爲原因的類型錯誤元素的數組,所以你可能要使用:

var mycontent = document.getElementById('mycontent'); 
mycontent.addEventListener("load", doSomething, false); 

的JQuery也有load()這可能會奏效,如果你聽每一個圖像的加載事件和調整佈局:

$('#mycontent img').load(doSomething); 

這將觸發一次爲每個圖像,所以你可能要保持一個計數,如果你知道圖像的數量,否則創建/重置每個負載超時,而超時後打電話doSomething。

+0

謝謝Oiva,我會給他們一個鏡頭,並在早上跟進。 JQuery加載()不適合我,但其他兩個可能。至於最後一部分,我可以肯定得到一些圖片標籤,所以這可以工作。我希望將裝載事件綁定到移動設備上的50多張圖片不會太多。我想我們會看到! – jstafford 2012-03-12 09:10:16

+0

當我試圖改變做某些回調時,它什麼都沒做。經過一番研究之後,Stack上的許多人說,加載只能在窗口對象和圖像上工作,它最好是粗略的。換句話說,沒有div。我還通過JQuery的網站閱讀了一些內容,他們說調用一個圖像的負載最好不過了。我將這個標記爲答案,因爲它確實幫助我理解$(「#mycontent」)正在返回一個數組,這是造成我的問題的一部分的錯誤。移動過去的錯誤導致我看到一個無關的解決方案,它幫助我繞過了這個問題。謝謝! – jstafford 2012-03-13 07:03:51

0

你的錯誤是你正在使用jQuery和嘗試添加事件繞過JQuery的API的原因。您不能使用addEventListener方法。改爲使用$('#mycontent').load(handler),其中,handler是一個接受參數的函數。例如$('#mycontent').load(function (e) {alert ("loaded")})