As I could not find the proper solution for buffering text input and execute a delayed javascript snippet, I came up with my solution:
widget class:
class BufferedTextField extends CWidget
{
var $name;
var $value = '';
var $htmlOptions = array();
var $onExecuteRequest;
public function run()
{
$data['name'] = $this->name;
$data['value'] = $this->value;
$data['htmlOptions'] = $this->htmlOptions;
$data['onExecuteRequest'] = $this->onExecuteRequest;
$this->render("bufferedTextField", $data);
}
}
View:
<?php
Yii::app()->clientScript->registerScript('bufferedTextFieldBuffer','
var onKeyRequestBuffer = {
bufferText: false,
bufferTime: 1000,
elem : null,
modified : function(elem) {
this.elem = elem;
setTimeout(\'onKeyRequestBuffer.compareBuffer("\'+ this.elem.val() +\'");\', this.bufferTime);
},
compareBuffer : function(strText) {
if (strText == this.elem.val() && strText != this.bufferText) {
this.bufferText = strText;
onKeyRequestBuffer.makeRequest();
}
},
makeRequest : function() {
'.$onExecuteRequest.'
}
};
',CClientScript::POS_HEAD);
Yii::app()->clientScript->registerScript('bufferedTextField','
$("#'.$name.'").keyup(function(event) {
onKeyRequestBuffer.modified($(this));
});
',CClientScript::POS_READY);
echo CHtml::textField($name, $value, $htmlOptions);
Example (with ajax):
$this->widget('BufferedTextField', array(
'name' => "fieldName",
'onExecuteRequest' => 'jQuery.ajax({
url: "'.$this->createUrl("yourController/yourAction").'",
type: "POST",
cache : false,
data: {"fieldInput" : this.elem.val()},
success: function(){alert("success");},
});',
));
The javascript part is adapted from here. The textField fires 1000 ms after the last key up event.