我在组件中有以下网格。
<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)
功能的潜在问题可能是我改变它以避免异常的方式?这种变化有多不安全/安全?
答案 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处理程序传递了从服务器返回的页面的名称,而不转义特殊字符。因此更新区域时出现问题。
在将页面名称发送到浏览器之前转义页面修复了问题。