JSNI(GWT-GWTP):在准备好事件触发后,jQuery不会在“文档就绪”功能中选择节点

时间:2016-02-14 02:22:31

标签: javascript jquery gwt jsni gwtp

我正在尝试根据其CSS ID选择div节点,并使用jQuery(2.2.0)更改div的文本。我的问题是 jQuery选择似乎永远不会发生?

  • jQuery选择代码(下面,我使用{$ 3}}的'$'简写)在标准的''jquery' fucntion'回调函数中,因此带有CSS ID的div是“据称“在调用回调时确保在DOM中。那个js代码及其标准的JSNI $ wnd语法类似于来自document ready的答案。
  • 所有这些jQuery js都在JSNI GWT jquery本机方法(GWT 2.7.0)中。
  • 我的项目是GWT JSNI(1.5.1)项目。
  • 所有观察结果都在不同的浏览器中以及制作模式和开发模式中重现。

我将从这段代码中解释如何确认调用JSNI本机方法renderTree(),触发'document ready'事件,并且带有CSS ID的div在DOM中 ...

public native void renderTree()/*-{
    $wnd.alert("renderTree");

    $wnd.$($doc).ready(function() {     
        $wnd.alert("DOM ready!");

        $wnd.$('#gramTree').text("text changed from JSNI jQuery");
    });
}-*/;
  1. 我从GWT View类的构造函数中调用renderTree()(更具体地说,它是一个GWTP扩展的GWTP
  2. 当View的页面加载时,“renderTree”会在一个警告窗口中弹出:这证明 renderTree()在我想要的时候调用JSNI方法,因为renderTree的第一行是$ wnd.alert。
  3. 在此之后,“DOM准备就绪!”弹出警报窗口:这证明'文档就绪'事件触发并且其回调被称为。这是因为回调是在renderTree()JSNI中注册到事件的,而回调的第一行是$ wnd.alert
  4. 到目前为止,1.-3。一切都按预期发生... 但是'#gramTree'的jQuery $选择似乎永远不会发生,因为具有该ID的div从未将其文本更改为“从JSNI jQuery更改的文本”(其文本最初从UiBinder加载为“从UiBinder初始化的文本”,并保持这种方式。)

    • 我预计选择应该发生,因为它是'document ready'回调中的第二行,并且3.证明了回调被调用。
    • div与ID #gramTree肯定在DOM中,因为我可以在浏览器检查器中看到它,并且我可以看到它的初始文本(“从UiBinder初始化的文本”)呈现。该初始文本应该从“文档就绪”回调更改为“从JSNI jQuery更改的文本”。 div,它的CSS ID和它的初始文本在我的View的GWT UiBinder中声明。
  5. 我可以手动输入要在此时更改的文本,方法是在浏览器控制台上手动输入jQuery代码行,该代码行似乎无法通过回调($('#gramTree').text("text changed from JSNI jQuery");)运行。同样,我也可以通过编写renderTree()编码来手动工作,也可以从页面上按钮的click事件调用,并在此时手动点击该按钮。

  6. 任何想法在这里出了什么问题?

    似乎是通过有根据的猜测,给出了4.-5。,某些内容无法正常处理'文档就绪'事件,或者我如何处理它?<​​/ strong>

    有什么想法可以进一步检查?

    谢谢!

2 个答案:

答案 0 :(得分:1)

您应该依赖View Lifecycle以确保它附加到DOM。来自GWTP ViewImpl#onAttach doc

  

视图附加到DOM后调用的方法。你应该   覆盖此方法以执行任何与ui相关的初始化   需要在视图附加之后完成   演示者不必知道(附加事件处理程序)   实例)

在你的情况下,当$wnd.$('#gramTree').text("text changed from JSNI jQuery");被调用时#gramTree元素没有附加到DOM并且对jQuery不可见。

答案 1 :(得分:0)

我自己发现这个答案作为思考的食物(它是黑客)我在其他地方找到了:从Deferred ScheduledCommand调用JSNI renderTree()方法。

似乎&#39;文件已准备好&#39;方法I尝试上班将是真正的规范/预期的方式。所以我宁愿把它弄清楚......