【问题标题】:web2py: how to detect when an LOAD component has loaded via ajax?web2py:如何检测 LOAD 组件何时通过 ajax 加载?
【发布时间】:2017-04-02 19:24:30
【问题描述】:

我正在使用{{=LOAD(...)}} 将组件注入到我的web2py 页面中,如http://web2py.com/books/default/chapter/29/12/components-and-plugins#LOAD 所述,但是一旦加载了组件,我需要触发一些javascript。通常,如果通过 ajax 加载某些内容,则会有一个成功回调。如何在 web2py 中通过 {{=LOAD(...)}} 设置其中之一?

【问题讨论】:

    标签: ajax web2py asynccallback


    【解决方案1】:

    最简单的方法是在组件的控制器中设置response.js

    def mycomponent():
        response.js = 'alert("mycomponent just loaded");'
        return dict()
    

    或者,您可以直接在组件本身中包含一个<script> 标签,该标签将在组件加载时执行。

    最后,只要 web2py Ajax 调用完成,就会触发 ajax:complete 事件。因此,您可以设置一个事件处理程序并检查 Ajax 响应是否是一个组件:

      $(document).on('ajax:complete', function(e, xhr, status) {
        if (xhr.getResponseHeader('web2py-component-content')) {
          alert('A component just loaded.');
        }
      });
    

    请注意,web2py-component-content 标头的存在表明 Ajax 响应是一个组件。

    最后一种方法的唯一缺点是事件处理程序将在组件的内容添加到 DOM 之前被触发,因此如果事件处理程序需要很长时间才能运行,它可能会明显延迟组件内容的出现。

    【讨论】:

    • 我正在尝试在客户端加载后修改 DOM(突出显示一行)。 response.js 工作正常,除非组件视图被缓存。在这种情况下,它不会被发送。 ajax:complete 确实会触发,但正如您所提到的,它在 将内容添加到 DOM 之前运行。这撤消了我的修改。有没有办法在应用之前修改内容?
    猜你喜欢
    • 2010-10-29
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2016-07-29
    • 2018-06-18
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多