【问题标题】:Calling a function from a ajax response content从 ajax 响应内容调用函数
【发布时间】:2011-02-25 14:08:19
【问题描述】:

当页面准备好时我有一个函数。

<script> 
$(function(){
  function do_ajax(){
  do some stuff
  }
});....

这在该页面上效果很好。然后我进行 .post 调用并将响应加载到 div 中。响应有一个

<script>$(selector).click(function(){ do_ajax(); });</script>

结果。我收到一个错误“do_ajax() 未定义”。如何从 ajax 内容中的事件调用 do_ajax()?

另一个。

我正在使用 jquery ui datepicker。因此,当页面加载时,我调用

$(".datepicker").datepicker();

这在该页面上效果很好。然后我进行 .post 调用并将响应加载到 div 中。响应有几个 .datepicker 字段。问题是新加载的日期选择器字段没有得到日历,除非我返回

<script>$(".datepicker").datepicker();</script>

结果。你们是这样的还是有别的办法?

谢谢!

【问题讨论】:

    标签: jquery ajax datepicker


    【解决方案1】:

    当您在函数范围内创建函数/变量时,您无法从外部访问它们(除非您在全局命名空间中定义它们)。

    $(function(){
        // I'm inside a function
    
        var a = function() {...} // Defined locally
    
        b  = function() {...}    // Defined globally
    });
    
    // I can't call a()
    
    // I am able to call b() because it is defined in global namespace.
    

    编辑:

    另外,请记住里面的代码:

    $(function() {
         ...
         b  = function() {...}    // Defined globally
    });
    
    b(); // Fails, because the document hasn't fully loaded, so 'b' has not been initialized
    

    ...等待运行,直到加载文档。因此,需要访问内部定义的全局变量的外部代码可能会在全局定义的代码初始化之前执行。

    【讨论】:

    • 谢谢!读到“范围”这个词,然后扇了自己一巴掌。
    • @aSeptik - 感谢您的 + :)
    • @pistolshrimp - 很高兴它有帮助! :)
    【解决方案2】:

    问题与范围有关。您的 do_ajax 函数是在页面加载时运行的函数范围内声明的 - 因此您不能随意在页面的其他位置调用它。

    有几种方法可以尝试解决这个问题,最简单的方法是将 do_ajax 函数定义移到 onLoad 代码之外,但这也会污染全局命名空间并且通常不太理想。

    更好的方法是在 onLoad 代码期间,将选择器上的 click 方法绑定到调用 do_ajax() 的函数。它将围绕它创建一个闭包,随后的点击事件将知道如何正确触发。

    $(function(){
      function do_ajax(){
        // do some stuff
      }
      // bind the click handler
      $(selector).click(function(){ do_ajax(); });
    });
    

    然后……

    $(selector).click(); // fire the click event, which will call do_ajax()
    

    另外请注意,您可能应该从单击处理函数返回 true 或 false,因为这将控制事件的冒泡。

    我对日期选择器控件不够熟悉。您还应该真正将您的问题分开。

    【讨论】:

      【解决方案3】:

      我认为您在 jQuery 库中寻找 Ready() 方法。

      变化:

      $(selector).click(function(){ do_ajax(); });
      

      收件人:

      $(document).ready(function(){$(selector).click(function(){ do_ajax(); }}));
      

      这只会在文档对象模型完全加载时运行您的事件。

      【讨论】:

      • OP 给出的第一个代码示例相当于$(document).ready(function(){ ... });。实际上,是同一事物的较短版本。如果他在单独的.ready() 函数中定义了.click() 事件处理程序,他仍然需要处理范围问题。不过你是对的。他可以将整个事情定义为一个整体,这将解决问题。 :o)
      • 我想我错过了这个问题,我以某种方式假设他在谈论能够访问在他的函数之后设置的变量,这在这些变量可见之前你需要等待 DOM 完成.无论如何,谢谢!
      猜你喜欢
      • 1970-01-01
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2018-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多