Xajax 0.5:Zh: Tutorials: Writing Advanced Plugins
Xajax 0.5:Zh: Tutorials: Writing Advanced Plugins
在编写自己的插件中我们变到了如何简单的扩展xajax来编写插件。在本文中,让我们来研究一些高级技术来加强我们的插件,并体验它如何影响你程序带宽使用的。
Contents |
[edit] 基本插件设计
基本的xajax PHP插件扩展通过添加$objResponse->script(...)响应命令来实现。我想当你在构建越来越大的脚本时,每次都要将其传递给插件进行调用,很容易就看到这个带宽资源是如何被耗尽的。
[edit] 设计一个更“智能”的插件
不象原来你每次想使用JS时都需要将javascript通过连接传递出去,取而代之的是你可以在浏览器端创建函数,然后通过插件进行简单的调用即可:
首先,创建一个.js的文件,写入你的函数:
myFunction = function(arg1) {
alert(arg1);
}
然后,在你的脚本中包含该文件:
<head>
<link type='text/javascript' href='./scripts/myFunction.js'></link>
</head>
最后,设计插件调用你的函数:
class myPlugin extends xajaxResponsePlugin
{
var $sCallName = "myPlugin";
function myFunction($arg1) {
$this->_objResponse->call('myFunction', arg1);
}
}
$pluginManager = &xajaxPluginManager::getInstance();
$pluginManager->registerResponsePlugin(new myPlugin());
[edit] 编写自定义响应命令
现在,你可以编写一个终极插件,在javascript端直接hook(译者注:hook:勾子,不说了吧,win32编程里面的hook api就这个) xajax命令。响应命令可以被缩减到几个参数就可以了,这样将带宽占用降低到最小。
在javascript文件中,可以象这样创建响应命令的处理器:
xajax.commands['myPlug_001'] = function(args) {
args.cmdFullName = 'myPlugin->001';
args.objElement.style.backgroundColor = args.data;
return false;
}
xajax.commands['myPlug_002'] = function(args) {
args.cmdFullName = 'myPlugin->002';
args.objElement.style.disabled = true;
return false;
}
注意:命令处理器返回false值是非常重要的!如果返回了true值,必须设置一个定时器重新启动xajax响应命令处理...否则,页面会显示“锁定(lockup)”消息,并且命令也不会被处理。
另外插件命令的ID值也必须是唯一的。我们推荐在使用此技术构建大型插件之前,您能够将你的命令ID计划帖到xajax论坛上。搜索xajax论坛确保其他人没有使用与你相同的计划,否则你的插件就不会兼容了(译者注:与其它插件ID冲突)。
现在,要调用插件处理器,需要象下面一样编写你的php插件函数:
class myPlugin extends xajaxResponsePlugin
{
var $sCallName = "myPlugin";
function function001($sTarget, $sBackgroundColor) {
$this->_objResponse->addCommand(array('n'=>'myPlug_001','t'=>$sTarget),$sBackgroundColor);
return $this;
}
function function002($sTarget) {
$this->_objResponse->addCommand(array('n'=>'myPlug_002','t'=>$sTarget),'');
return $this;
}
}
$pluginManager = &xajaxPluginManager::getInstance();
$pluginManager->registerResponsePlugin(new myPlugin());
[edit] 即将呈现
在xajax 0.5 beta 3(还没出来)中加入新功能,允许插件编写者即时安装javascript函数(如果需要的话,译者注:使用的时候,即时调用)。不使用的函数不安装,这将有助于减少浏览器端内存使用。当然,你得留意哪些函数已经被安装了...可能要放在$_SESSION变量中。
它大概如下工作:
class myPlugin extends xajaxResponsePlugin
{
var $aInstalledFunctions = array();
var $sCallName = "myPlugin";
function function001($sTarget, $sBackgroundColor) {
if (false === in_array('myPlug_001', $this->aInstalledFunctions)) {
$script = 'args.cmdFullName = "myPlugin->001";';
$script .= 'args.objElement.style.backgroundColor = args.data;';
$script .= 'return false;';
$this->_objResponse->setFunction('xajax.commands["myPlug_001"]', 'args', $script);
$this->aInstalledFunctions[] = 'myPlug_001';
saveState();
}
$this->_objResponse->addCommand(array('n'=>'myPlug_001','t'=>$sTarget),$sBackgroundColor);
return $this;
}
function function002($sTarget) {
if (false === in_array('myPlug_002', $this->aInstalledFunctions)) {
$script = 'args.cmdFullName = "myPlugin->002";';
$script .= 'args.objElement.style.disabled = true;';
$script .= 'return false;';
$this->_objResponse->setFunction('xajax.commands["myPlug_002"]', 'args', $script);
$this->aInstalledFunctions[] = 'myPlug_002';
saveState();
}
$this->_objResponse->addCommand(array('n'=>'myPlug_002','t'=>$sTarget),'');
return $this;
}
function saveState() {
$_SESSION['myPlugin_state'] = $this->aInstalledFunctions;
}
function loadState() {
$this->aInstalledFunctions = $_SESSION['myPlugin_state'];
}
}
$my_plugin = new myPlugin();
$my_plugin->loadState();
$pluginManager = &xajaxPluginManager::getInstance();
$pluginManager->registerResponsePlugin($my_plugin);
在记录了浏览器端安装了哪些函数后,于是你只需要安装你需要的函数即可,这样充分节省了浏览器端的内存使用...也就节省了带宽。
- 作者:CtC - Joseph Woolley - 2007/03/27
- 中文翻译:LiD@moshoo.com - 2007/06/14