2012-03-10 72 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")})