为了让所开发的项目适应多浏览器,并使展现效果良好,这段时间一直在利用ExtJS提供的JS对项目进行优化调整。
在实行animate、模态窗口模拟以及Alert MessageBox等一系列调整后,对于要实行像IE里的window.confirm函数的效果遇到了一点麻烦,今天终于用笨拙的方式实现了window.confirm这样的功能。
首先,我查找ExtJS提供的MessageBox对象,发现提供了confirm函数,因此决定使用该函数来将window.confirm替换。ExtJS提供的confirm函数是通过show出一个MessageBox对象,该函数返回的是对象,而不是window.confirm的true/false值;
其次,MessageBox的按钮事件是通过function参数来实现,按钮的操作结果不会再返回到confirm函数对象中去。
由于上面这两点,我在实现一个GridView对象的Delete删除确认时,费了一些功夫。
以前在用window.confirm来进行确认时,我只在GridView的Delete ButtonField的OnClientClick事件,设置了if (!DeleteConfirm(this)){return false;}这样的字符内容,这样客户端在confirm对话框选择Ok的时候会进入服务端事件进行数据删除操作。
修改前的DeleteConfirm函数为
function DeleteConfirm(item){
if (confirm(message) == false)
return false;
else
return true;
}
使用ExtJS的MessageBox后,我将DeleteConfirm函数首先修改为
function DeleteConfirm(item){
Ext.MessageBox.confirm(confirmtitle, message, function(btn){
if (btn == 'yes'){
return true;
}
else{
return false;
}
});
}
结果对话框出现一下就自动消失了L
上网查看了一些ExtJS关于confirm MessageBox的内容,很多网友提供的都是全部用ExtJS实现的,通过Grid来进行删除确认的都是用的ExtJS的GridPanel,没有找到和我目前这种情况有关的内容。只好自己来想解决办法了。
既然ExtJS的confirm是在function(btn)里实现按钮控制的,我想可以将GridView的Delete ButtonField的OnClientClick事件修改为DeleteConfirm(this);return false;直接返回暂不执行服务器端事件。现在MessageBox显示出来了,没有闪一下就消失。点击MessageBox的按钮后没有任何反应,看来还得再执行一下Delete ButtonField的OnClientClick事件,执行服务器端的操作。
我想是不是可以将Delete ButtonField对象的onclick修改后再在JS中执行一下click()事件。如是我将上面的函数修改为
function DeleteConfirm(item){
Ext.MessageBox.confirm(confirmtitle, message, function(btn){
if (btn == 'yes'){
var attclick = item.getAttribute('onclick');
attclick = attclick.replace("DeleteConfirm(this);return false;","");
item.setAttribute('onclick',attclick);
item.click();
});
}
上面的修改在Firefox中测试通过,可在IE7里却不能通过,这下有点晕了L
经过反复的跟踪测试和修改,最后我将GridView的Delete ButtonField的OnClientClick事件修改为DeleteConfirm(this,'"+e.row.rowIndex+"');return false;将上面的函数修改为
//Delete confirm dialog function
function DeleteConfirm(item,index){
Ext.MessageBox.confirm(confirmtitle, message, function(btn){
if (btn == 'yes')
{
__doPostBack('ctl00$ContentPlaceHolder1$GridView1','Delete$'+index);
}
});
}
在IE和Firefox上测试都可以通过。confirm使用ExtJS的MessageBox是实现了,看着上面的函数,将__doPostBack的eventTarget和eventArgument都写死了,真是个笨死的方法啊。
上面是我对ExtJS的confirm函数的应用,查看ExtJS的实例以及网上资料,我也知道可以通过其他的途径来达到和服务器端交互的目的,目前就暂时先这样笨一下了。期待大家的更好方式共享。J