【问题标题】:Ajax-returned elements do not trigger in jQueryAjax 返回的元素不会在 jQuery 中触发
【发布时间】:2012-09-09 23:58:56
【问题描述】:

在 HTML 中,ID="project_pick" 的下拉菜单将触发更改事件,将所选值发送到 getallreports.php 文件。这行得通。 PHP 文件执行 MySQL 查找并在一些 HTML 中返回值。这也有效,并且在页面上看起来很棒。下面是将所选项目发送到 PHP 文件的 jQuery/ajax 代码:

$('#project_pick').change(function(e) {
    $.ajax({
        type: "POST",
        url: "getallreports.php",
        data: "project_id=" + $(this).val(),
        success:function(data){
            $('#reportstable').html(data);
        }
    });
});

返回的数据出现在指定的 div 内,并包含具有特定 ID 的锚标记,这些 ID 应该允许其他 JQuery 事件发生。返回的 HTML 片段:

<table><tr>
    <td>Report 1</td><td><a href="#" id="change_1">click to change</a></td>
    <td>Report 2</td><td><a href="#" id="change_2">click to change</a></td>
</tr></table>

上面点击事件触发的jQuery代码是:

$('#change_1').click(function() {
    alert('Change Report One was clicked');
});

但是,单击上面的锚标记没有任何作用。此外,返回的 HTML 甚至不会出现在源代码中——尽管它显示在屏幕和 firebug 中。

我错过了什么?如何触发该点击事件?

编辑:

我被提醒过 .on('click', etc) 事件(感谢 Michael 和 Zirkms),但是当我尝试将它添加到我的代码中时,下拉列表的 .change 事件停止触发。也许下面的代码需要改头换面?

$('#project_pick').on(change(function(e) {
    $.ajax({
        type: "POST",
        url: "getallreports.php",
        data: "project_id=" + $(this).val(),
        success:function(data){
            $('#reportstable').html(data);
        }
    });
});

【问题讨论】:

  • 动态创建的元素永远不会显示在页面源中,因为该源是原始 http 请求下载的静态标记。它们会并且确实会显示在 Firebug 或其他 DOM 检查工具中。
  • 您的问题并不清楚。您是否定义了 $('#test').click() before 它是在 DOM 中创建的?如果是这样,它将不受约束。您需要使用.on('click') 来绑定未来的元素。
  • @Michael 感谢您的解释。我看过一些关于 .on() 的东西,但是当我添加它时,下拉菜单停止工作。很明显我做错了。我将编辑 OP 以发布代码示例。请注意,返回的 HTML 应该有几个这样的可点击 ID(我正在返回一个报告列表和相应的“点击更改”锚标记。当点击一个时,用户可以选择不同的报告文档。因此,每个必须有自己的 ID .)
  • @FUTURE READERS - 对于那些想知道 Michael 和 zirkms 回复中的#test ref 的人,原始问题显示了一个返回的表格,其中包含一个带有 ID="test" 的可点击锚标记。我重新编辑了问题以显示两个可点击的锚标签,因为我认为这很重要,而且我更好地描述了它们的使用方式。我还将 标记 ID 从“test”重命名为“change_1”和“change_2”。我从 M 和 Z 的回答中不明白的是 .on('click', #element...) 是在这些 change_1 和 change_2 标签上实现的,而不是在 #project_pick 下拉列表中。

标签: php jquery


【解决方案1】:

$('#test').click() 代码执行的那一刻,#test 在 DOM 中不存在,所以你没有将该处理程序绑定到某个地方。

使用

$(document).on('click', '#test', function() { ... });

改为

或者(更好)如果你有一个特定的节点可以插入检索到的html - 使用一些特定的选择器而不是$(document) like

$('#reportstable').on(...)

甚至没有出现在源代码中

在“查看源代码”中,浏览器通常会根据请求显示来自服务器的响应,而不反映 JS DOM 修改。

【讨论】:

  • 感谢 zerkms。不过,我不清楚如果 jQuery 触发器是通过 #project_pick 下拉元素,如何指定 $('#reportstable').on(...) ?你会如何修改我上面的代码?
  • @gibberish:我无法理解你当前的问题。
  • 其实我没有正确理解你的回答。我误解并认为 .on() 应该应用于 #project_pick 下拉列表,而您打算将其应用于每个“点击更改”元素。都修好了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多