我正在使用jQuery v.1.7.1,其中的.live()方法显然已被弃用。 我遇到的问题是,当dynamic加载html元素使用: $('#parent').load("http://…"); 如果之后尝试添加一个点击事件,则不会使用以下任一方法注册事件: $('#parent').click(function() …); 要么 // according to documentation this should be used instead of .live() $('#child').on('click', function() …); 什么是实现这个function的正确方法? 它似乎只为我工作.live(),但我不应该使用该方法。 请注意#child是一个dynamic加载的元素。 谢谢。
我已经调查了几个月的这个问题,提出了不同的解决方案,我不满意,因为他们都是大规模的黑客。 我还是不敢相信一个有设计上的缺陷的人把它变成了框架,没有人在谈论这个框架,所以我想我一定是错过了一些东西。 问题是与AsyncTask 。 根据它的文件 “允许执行后台操作并在UI线程上发布结果,而无需操作线程和/或处理程序。 这个例子继续展示了如何在onPostExecute()调用一些示例showDialog()方法。 然而,这似乎完全是我设计的 ,因为显示一个对话框总是需要对一个有效的Context的引用,并且一个AsyncTask 不能持有对上下文对象的强引用 。 原因是显而易见的:如果活动被破坏触发任务呢? 这可能会一直发生,例如因为您翻转了屏幕。 如果这个任务持有对创建它的上下文的引用,那么你不仅要坚持一个无用的上下文对象(这个窗口已经被销毁了, 任何 UI交互都将失败,并且有异常!),你甚至有可能冒险创建一个内存泄漏。 除非我的逻辑在这里是有缺陷的,这意味着: onPostExecute()是完全没有用的,因为如果你不能访问任何上下文,在UI线程上运行这个方法有什么好处呢? 这里你不能做任何有意义的事情。 一种解决方法是不传递上下文实例到AsyncTask,而是一个Handler实例。 这是有效的:由于处理程序松散地绑定上下文和任务,您可以在它们之间交换消息,而不会冒险泄漏(对吧?)。 但是这意味着AsyncTask的前提,即你不需要打扰处理程序,是错误的。 它也似乎滥用处理程序,因为你是发送和接收消息在同一个线程(你创建它的UI线程,并通过它发送onPostExecute()这也是在UI线程上执行)。 为了解决这个问题,即使采用了这种解决方法,仍然存在这样的问题,即当上下文被破坏时,您不会记录它所触发的任务。 这意味着在重新创建上下文时,例如在屏幕方向更改之后,您必须重新启动任何任务。 这是缓慢和浪费。 我的解决方案( 在Droid-Fu库中实现 )是维护WeakReference从组件名称到当前实例在唯一应用程序对象上的映射。 每当一个AsyncTask被启动时,它就会在该映射中记录调用上下文,并且在每个回调函数中,都会从该映射中获取当前上下文实例。 这可以确保您永远不会引用陈旧的上下文实例, 并且您始终可以访问回调中的有效上下文,以便您可以在那里进行有意义的UI工作。 它也不会泄漏,因为引用很弱,并且在给定组件的实例不再存在时被清除。 尽管如此,这是一个复杂的解决方法,并且需要对Droid-Fu库类进行子类化,这使得它成为一种相当干扰的方法。 现在我只想知道:我只是大量地缺少一些东西或是AsyncTask真的完全有缺陷? 你的经验如何与它合作? 你是怎么解决这些问题的? 感谢您的输入。