在AJAX请求之后重新加载javascript文件

Mic*_*aël 18 javascript ajax jquery

在请求之后,我的jQuery代码中的事件处理程序无法识别创建的新元素.

有没有办法重新加载文件来重新注册这些事件?

Stu*_*ser 22

我假设你的意思是你注册的元素已经被你的ajax请求的结果所取代的事件没有被解雇?

使用.live()(请参阅http://api.jquery.com/live/)针对与选择器匹配的元素(包括从ajax的结果创建的新DOM元素)注册事件,而不是选择器的结果事件处理程序是第一个,当它们被替换时将被销毁.

例如,替换

$('div.someClass').click(function(e){
    //do stuff
});
Run Code Online (Sandbox Code Playgroud)

$('div.someClass').live('click', function(e){
    //do stuff
});
Run Code Online (Sandbox Code Playgroud)

重要:

虽然我建议使用.live()它是为了清晰,因为它的语法类似.bind(),你应该.on()尽可能使用.有关重要信息,请参阅@ jbabey评论中的链接.

  • +1用于调试问题并提出可能正确的答案. (5认同)
  • 虽然live()仍然有效,但您应该使用delegate()用于jQuery 1.4.3 - 1.6.4和on()用于1.7+ http://api.jquery.com/delegate/http://api.jquery. COM /上/ (2认同)

Mic*_*aël 8

这个问题是关于在加载页面后创建的DOM元素上的绑定事件处理程序.例如,如果在请求ajax之后,您创建了一个新的<div>bloc并想要捕获onClick事件.

//This will work for element that are present at the page loading
$('div.someClass').click(function(e){
    //do stuff
});

// This will work for dynamically created element but is deprecated since jquery 1.7
$('div.someClass').live('click', function(e){
    //do stuff
});

// This will work for dynamically created element
$('body').on('click', 'div.someClass', function(e){
    //do stuff
});
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到文档:http://api.jquery.com/on/


小智 5

该代码非常适合我..

$("head script").each(function(){
            var oldScript = this.getAttribute("src");
            $(this).remove();
            var newScript;
            newScript = document.createElement('script');
            newScript.type = 'text/javascript';
            newScript.src = oldScript;
            document.getElementsByTagName("head")[0].appendChild(newScript);
        });
Run Code Online (Sandbox Code Playgroud)

它删除旧的脚本标签并使用相同的 src 创建一个新的脚本标签(重新加载它)。


Ton*_*nov -1

jQuery 无法识别是什么意思?

每次发出请求时,jQuery 都会遍历 DOM,因此它们应该是可见的。然而,附加事件不会。

什么是不完全可见的?

PS:重新加载 JavaScript 是可能的,但强烈建议不要这样做!