【问题标题】:Reload javascript file after an AJAX requestAJAX 请求后重新加载 javascript 文件
【发布时间】:2011-12-21 18:15:34
【问题描述】:

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

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

【问题讨论】:

  • 请改进您的问题定义。这并不表明任何有用的东西!
  • 当你说“不被 jQuery 识别”时,你是在说事件处理程序没有被调用吗?
  • 既然你有正确的答案,请编辑你的问题以改进它,这样当其他有相同问题的人找到它时,他们就会明白这个问题适用于他们。

标签: javascript jquery ajax


【解决方案1】:

我假设您的意思是您为已被您的 ajax 请求结果替换的元素注册的事件没有触发?

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

例如 替换

$('div.someClass').click(function(e){
    //do stuff
});

$('div.someClass').live('click', function(e){
    //do stuff
});

重要:

虽然我建议使用.live(),这是为了清楚起见,因为它的语法类似于.bind(),但如果可能,您应该使用.on()。有关重要信息,请参阅@jbabey 评论中的链接。

【讨论】:

  • +1 用于调试问题并提出可能正确的答案。
  • 虽然 live() 仍然有效,但您应该对 jQuery 1.4.3 - 1.6.4 使用 delegate() ,对 1.7+ 使用 on() api.jquery.com/delegate api.jquery.com/on
  • 是的,这就是问题所在。在请求之后,我使用 class="result" 创建了新块,但是在 jquery 没有检测到这些新块上的任何事件之后。我会看 .live() 谢谢
  • @jbabey +1 当然,看到bindlive 之间的区别将使OP 更容易理解(潜在的)问题。添加了对您的评论和解释的参考。
【解决方案2】:

这个问题是关于在页面加载后创建的 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
});

您可以在此处找到文档:http://api.jquery.com/on/

【讨论】:

    【解决方案3】:

    这些代码对我来说非常适合..

    $("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);
            });
    

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

    【讨论】:

    • 嗨!!!这很好,也是我需要的,但是在我的 ajax 响应之后我将把它放在哪里执行。
    • 感谢它完美的工作,但需要很长时间来处理请求......建议是否有任何改进的方法以相同的方式重新加载整个 js
    【解决方案4】:

    为了提高网站性能并减少总文件的大小返回,您可以考虑在需要时加载 JavaSript (.js) 文件。在 jQuery 中,您可以使用 $.getScript 函数在运行时或按需加载 JavaScript 文件。

    例如,

    $("#load").click(function(){
        $.getScript('helloworld.js', function() {
            $("#content").html('Javascript is loaded successful!');
        });
    });
    

    当一个ID为“load”的按钮被点击时,它会动态加载“helloworld.js”JavaScript文件。

    自己试试 在这个例子中,当你点击加载按钮时,它会在运行时加载“js-example/helloworld.js”,其中包含一个“sayhello()”函数。

    <html>
    <head>
    
    <script type="text/javascript" src="jquery-1.4.2.min.js"></script>
    
    </head>
    <body>
      <h1>Load Javascript dynamically with jQuery</h1>
    
    <div id="content"></div>
    <br/>
    
    <button id="load">Load JavaScript</button>
    <button id="sayHello">Say Hello</button>
    
    <script type="text/javascript">
    
    $("#load").click(function(){
      $.getScript('js-example/helloworld.js', function() {
         $("#content").html('
              Javascript is loaded successful! sayHello() function is loaded!
         ');
      });
    });
    
    $("#sayHello").click(function(){
      sayHello();
    });
    
    </script>
    </body>
    </html>
    

    【讨论】:

      【解决方案5】:

      解决这个问题的简单方法

      $(document).ready(function(){
      
      $('body').on('click','.someClass',function(){
      
      //do your javascript here..
      
      });
      }); 
      

      【讨论】:

        【解决方案6】:

        您还可以将点击处理程序附加到正文,以便它们从一开始就不会被破坏。

        $('body').on('click', 'a', function(event) {
          event.preventDefault();
          event.stopPropagation();
          // some stuff
        })
        

        【讨论】:

          【解决方案7】:

          在您的请求回调中,调用一个作用于您新添加或创建的块的函数。

          $.ajax({
             success: function(data) {
                  $('body').append(data);
                  //do your javascript here to act on new blocks
             }
          });
          

          【讨论】:

            【解决方案8】:
              var scripts = document.getElementsByTagName("script");
              for (var i=0;i<scripts.length;i++) {
                if (scripts[i].src)
                  if(scripts[i].src.indexOf('nameofyourfile')  > -1 )
                    var yourfile = scripts[i].src;
              }
              jQuery.get(yourfile, function(data){
              if(data){
                 try {
                  eval(data);
                 } catch (e) {
                 alert(e.message);
                }
             }
                });
            

            【讨论】:

              【解决方案9】:

              您可以尝试使用 loadscript 插件来加载 javascript 文件。

              forexample 
              $("#load").click(function(){
                  $.loadScript('path/example.js');
              });
              
              or 
              $.ajax({
                 success: function(data) {
                      $.loadScript('path/example.js');
                 }
              });

              http://marcbuils.github.io/jquery.loadscript/

              【讨论】:

                【解决方案10】:

                不被jQuery识别是什么意思?

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

                什么是不完全可见的?

                P.S.:重新加载 JavaScript 是可能的,但非常不鼓励!

                【讨论】:

                  猜你喜欢
                  • 2015-05-25
                  • 1970-01-01
                  • 2011-11-12
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-05-24
                  • 2018-02-01
                  相关资源
                  最近更新 更多