I'm reopening this discussion again. Solution is perfect, but there is a problem with spaces, diacritics etc.
I have to downgrade to WIDGET solution, because bind method with callbackEvent appends context parameter directly to url. I checked definition of URL object which is passed to callback function and there is only "addContext" method and Url object does not contains any information about request parameters (and if I ?stepped into? the code, only url value of Url object is used while creating request) - so there is no chance to change request to store parameter as RequestParameter. So finally i used widget-like code and it works perfectly. I did this, becouse i can have field with czech interpunction, spaces, enters and other white chars etc. I can encode/decode by hand, but when using RequestParameters, Tapestry encodes/decodes it automatically for me and it is much cleaner, because I'm not doing something which is already done and tested.
But in simple cases i see bind-like solution as very useful.
this is my final code
$.fn.onkeyup = function(params) {
if (!params.delay)
params.delay = 1500;
params.queue = "queue_" + "zone";
this.bind('keyup', function() {
$(this).unbind();
bindKeyUp($(this), params);
valBefore = $(this).val();
$(this).delay(params.delay, params.queue).queue(params.queue, function(){
$(this).onkeyup(params);
valAfter = $(this).val();
if (valBefore != valAfter)
bindKeyUp($(this), params);
}).dequeue(params.queue);
});
};
function bindKeyUp(element, params) {
$("#" + zone).tapestryZone('update' , {
url : url,
params: $.extend( { name: element.val() }, params),
});
}