Jquery,将innerHTML添加到DIV并通过该innerHTML的ID访问元素


Jquery, add innerHTML to a DIV and access elements by ID of that innerHTML?

脚本

$(document).ready(function(){
    $.ajax({   
        type    : "POST",
        url     : "list_controller.php",
        data    : "a=get&list_id=my_list",
        success : function(data){
            $('#list_container').innerHTML = data;
        }
    });                     
});

HTML

<div id="list_container"></div>

从服务器返回的data包含一个带有一些可点击链接的HTML,该链接将触发另一个jQuery函数并再次重新加载#list_container DIV:

<a href="#" value="a=edit&list_id=my_list&user=artur&id=110" id="adminlink">
    <img src="images/edit_user.png" />
</a>

我希望这些链接可以调用其他AJAX函数,例如:

$(document).ready(function(){
    $('#adminlink').click(function () {
        var val = $(this).attr("value");
        $.ajax({       
            type    : "POST",
            url     : "list_controller.php",
            data    : val,
            success : function(data){
                $('#list_container').innerHTML = data;
            }
        });
    });
    return false;
 });

问题是我无法访问触发点击功能的#adminlink锚点元素。

其他一切都在完美地工作,但innerHTML动态data的任何元素都无法再访问。

因为您正在覆盖#list_container的内容,所以您注册处理程序的#adminlink不再是页面上的那个。

最简单的解决方案是事件委派,它依赖于事件冒泡:

$('#list_container').on('click', '#adminlink', function() { 
    ...
});

即,它实际上是接收click事件的静态#list_container元素,但jQuery随后检查在调用所需处理程序之前是否实际单击了ID为adminlink的元素。

在使用事件委派时,请始终尝试使用"最接近"的静态祖先元素。在这种情况下,这将看起来是#list_container。在最坏的情况下,您最终会使用document,但在处理事件之前,必须将所有冒泡到DOM中。