带有inPlace区域更新的Tapestry Grid失败,并在网格

时间:2015-05-07 11:43:32

标签: javascript html special-characters tapestry

我在组件中有以下网格。

<t:grid t:id="resultsGrid" id="resultsGrid" inPlace="true" source="results" row="result" rowIndex="rowIndex" rowsPerPage="50" pagerPosition="top" model="model">

InPlace=true在区域内呈现网格,然后每个新页面请求只更新该区域。但在以下情况下,区域更新不会发生。

让我们说第3页,网格数据(行)包含单引号。第3页呈现正常但在此之后如果您单击任何其他页码,则该区域不会更新。浏览器确实从服务器接收新页面的数据,但不会进行区域更新。

仅当网格的数据/文本包含单引号时才会发生这种情况,例如什么时候有&#34;亚当&#34;在一些网格中。如果网格数据不包含单引号,则区域会更新。

在更多调试中,我发现问题始于tapestry.js文件的以下函数。

在更新区域的过程中,跟随函数调用purgeChildren(element)函数。

/**
     * Updates the zone's content, and invokes either the update function (to
     * highlight the change) or the show function (to reveal a hidden element).
     * Lastly, fires the Tapestry.ZONE_UPDATED_EVENT to let listeners know that
     * the zone was updated.
     * 
     * @param content
     */
    show : function(content) {

        Tapestry.purgeChildren(this.updateElement);

        this.updateElement.update(content);

        var func = this.element.visible() ? this.updateFunc : this.showFunc;

        func.call(this, this.element, this.endcolor);

        this.element.fire(Tapestry.ZONE_UPDATED_EVENT);
    },

以下是调用purgeChildren(element)函数的purge(element)函数。

/**
     * Invokes purge() on all the children of the element.
     */
    purgeChildren : function(element) {

        var children = element.childNodes;

        if (children) {
            var l = children.length, i, child;

            for (i = 0; i < l; i++) {
                var child = children[i];

                /* Just purge element nodes, not text, etc. */
                if (child.nodeType == 1)
                    Tapestry.purge(children[i]);
            }
        }
    }

最后,以下是purge(element)函数,这是区域更新过程中断的地方。在此功能 &#39;意外标识符&#39;当网格数据包含单引号时,抛出异常

//this is where the problem is.
/**
     * Purges the element of any event handlers (necessary in IE to ensure that
     * memory leaks do not occur, and harmless in other browsers). The element
     * is purged, then any children of the element are purged.
     */
    purge : function(element) {

        // removes all functions/handlers attached to this element
        /* Adapted from http://javascript.crockford.com/memory/leak.html */
        var attrs = element.attributes;
        if (attrs) {
            var i, name;
            for (i = attrs.length - 1; i >= 0; i--) {
                if (attrs[i]) {
                    name = attrs[i].name;
                    /* Looking for onclick, etc. */
                    if (typeof element[name] == 'function') {
                        element[name] = null;
                    }
                }
            }
        }

        /* Get rid of any Prototype event handlers as well. */
        Event.stopObserving(element);

        Tapestry.purgeChildren(element);
    },

如注释purge(element)中所述,函数会删除元素的所有处理函数,并且在IE中可能需要内存泄漏。

我可以通过以下方式更改purge(element)功能来解决问题。注释掉删除元素处理程序的代码。进行此更改后,即使数据包含单引号,区域也会正常更新。

purge : function(element) {

    // removes all functions/handlers attached to this element
    /* Adapted from http://javascript.crockford.com/memory/leak.html */
//  var attrs = element.attributes;
//  if (attrs) {
//      var i, name;
//      for (i = attrs.length - 1; i >= 0; i--) {
//          if (attrs[i]) {
//              name = attrs[i].name;
//              // Looking for onclick, etc
//              if (typeof element[name] == 'function') {
//                  element[name] = null;
//              }
//          }
//      }
//  }

    /* Get rid of any Prototype event handlers as well. */
    Event.stopObserving(element);

//  Tapestry.purgeChildren(element);
},

但这不是一个好的解决方法。我有以下问题,对它们的任何帮助都会很棒。

1:为什么purge函数中的代码在删除传递元素的处理程序时会破坏数据中的单引号?

2:数据从扩展GridDataSource接口的源类提供给网格。因此,网格数据是由来自该源类的挂毯生成的,因此特殊字符的处理也应该由挂毯完成。如果我在grid的数据容器类中添加toString()方法会有帮助吗?

3:有没有其他方法可以实现清除(元素)功能,这样它就不会破坏数据中的单引号?

4:我使用 tapestry版本5.2.4 ,如果我升级到最新版本,是否可以解决此问题?

5:改变purge(element)功能的潜在问题可能是我改变它以避免异常的方式?这种变化有多不安全/安全?

2 个答案:

答案 0 :(得分:0)

关于你的问题4,看起来它在Tapestry 5.3.7中运行得很好:

http://jumpstart.doublenegative.com.au/jumpstart/examples/ajax/filteredgrid

和Tapestry 5.4-beta-26:

http://jumpstart.doublenegative.com.au/jumpstart7/examples/ajax/filteredgrid

如果在您阅读本文时,数据中没有单引号,则使用众多“CRUD”示例中的一个将单引号放入一个人的姓名中。

答案 1 :(得分:0)

忘记发表回答了。

问题是每个网格行的内容都包含一个图像。对于该映像,onClick处理程序传递了从服务器返回的页面的名称,而不转义特殊字符。因此更新区域时出现问题。

在将页面名称发送到浏览器之前转义页面修复了问题。