1

我有一个生成 HTML 元素的 PHP 文件,并在页面加载时从 AJAX 调用。我要做的是将 JQuery 应用于动态生成的元素,因此每次单击从 PHP 文件生成的标签时,都会发生一些事情。我尝试将 JQuery 代码放在 PHP 文件中并将其回显,但这不起作用,我还将代码放在调用 AJAX 的 HTML 页面中,但这也不起作用。

在我的 HTML 中,我有:

<body onLoad="javascript:getLabels();">, 

这通过 AJAX 调用 php 文件:

function getComments() { 
    var thePage ='loadLabels.php'; 
    ... 

PHP文件作为行:

echo '<label id="labellink" class="ldClass">Label </label>'; 

一旦加载,页面中的标签可能不止一个,但它们都在一个标签中<form>,所以我需要使用 JQuery,所以一旦加载了标签并单击它们,我就可以做一些事情。

4

6 回答 6

2

.on()(文档)提供了一种为动态元素创建处理程序的方法,在创建处理程序时可能不一定存在。

要使用.on(),您需要将处理程序附加到 DOM 树中更高的非动态对象。点击将从子元素向上传播,此时附加的处理程序(委托).on()将使用提供的过滤器来查看点击是否源自正确的对象(这将是您的动态对象)。

$('body').on('click', '.dynamic_element', function() {
   // Handler code
});

在这种情况下,我使用body了 ,因为它不会消失并随身携带处理程序。您可以将处理程序附加到任何作为其祖先的对象.dynamic_element只要它是静态元素。通常更接近更好,但如果您的页面非常动态,body则可以使用。

背后的整个想法.on()是处理程序必须附加到现有的 DOM 元素。如果对象尚不存在,则无法将处理程序附加到它,并且如果您的元素被删除,则处理程序也会被删除。这就是为什么$('.dynamic_element').click()不起作用,除非.dynamic_element已经存在。因此,使用.on(),我们只是将处理程序附加到我们知道确实存在(并且不会消失)的东西上。此处理程序称为“委托”。它监视来自其子对象的事件,这些事件根据 DOM 元素的性质沿树向上传播。

于 2012-05-10T19:38:56.910 回答
2

你想要的是 jQuery “live” http://api.jquery.com/live/

编辑:您希望 .on() 在较新版本的 jQuery 中,因为 .live() 已被贬值:http ://api.jquery.com/on/

有关更多信息,请参阅下面的评论。

于 2012-05-10T19:30:30.403 回答
2

有两种方法可以实现您想要的。

1:将事件附加到 AJAX 调用的 onSuccess 内的链接以检索内容。这样,当新内容添加到 DOM 时,您会将必要的事件附加到这些特定元素。

2:推荐的解决方案是使用事件委托。基本上,不是将事件附加到特定元素,而是将单个事件附加到父元素容器,并且当事件被触发时,它基于调节单击的目标(如果它本身具有特定的类)执行特定的行动。这是一种用于处理流动/可变内容的技术,无需将事件重新附加到特定元素。jQuery 的 .on() API 方法优雅地提供了这样的解决方案:http: //api.jquery.com/on/

例如:

$("#container").on("a.changeColor", "click", function() {
  $(this).toggleClass("newColor");
});

您将事件委托/附加到 id="container" 的父元素,告诉它您希望所有具有“changeColor”类的子锚元素切换“newColor”类。即使在您更新和更改#container 元素的内部内容之后,具有类“changeColor”的新元素仍将继承单击时的行为。

于 2012-05-10T19:44:46.777 回答
1

编辑谢谢你纠正我。由于它是贬值的,我已经有一段时间没有使用它了。

我确信这更像是一种“破解”而不是解决方案,如有必要,我将公开欢迎反对票,但您可以将后 AJAX 功能放入成功功能中。

此外,旧版本的 jQuery 使用了一个名为的函数,该函数.live()将查找一个元素,无论它是否在 DOM 中。它在最新版本的 jQuery 中已被贬低,但如果你愿意实现这一飞跃,我知道它在 1.5 中有效。(我说的是类似的东西$(a).live('click', function () { });)。

作为记录,我很乐意将其发布为评论而不是答案,但我还没有足够的街头信誉。

于 2012-05-10T19:29:51.603 回答
0

Just an example of dynamic created elements and onload bound events

var a = $("<a>").attr('href','#')
                .attr('class','elem')
                .text('click me')
                .prependTo('body');
$(document).on("click", "a.elem", function(e){ 
    e.preventDefault();
    alert("Goodbye!"); 
});
于 2012-05-10T20:07:54.840 回答
-1

使用 .delegate() 是我用过的最好的方法。

参考 http://api.jquery.com/delegate/

于 2012-05-10T19:35:25.517 回答