编程相关
2012 年五月 一 二 三 四 五 六 日 « 二 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
编程相关
常在调用fancybox显示表单前要判断用户是否做了先决的操作,如果没有操作就中止弹出fancybox。在以前的博文中,提到$.fancybox.cancel()。
最近注意了一下代码,才发现方法名写成了cancle,这样会引起脚本报错。代码如下:
$(‘a[name="info"]‘).click(function(){
if(true){
}
else{
$.fancybox.cancle();
}
}).fancybox();
虽然方法名写错了,但是也实现了中止fancybox显示的效果,而且再做了先决操作后,fancybox可以正常工作。而改为正确的cancel方法后,反而导致整个页面中的脚本都不能工作,脚本报错显示是fancybox中的e.onCancel()方法未定义。具体是什么问题还需研究研究。
先撇开上面的问题不说,在保证不出现脚本报错的前提下,我们还可以使用另一个全局方法$.fancybox.close()来实现,代码如下:
$(‘a[name="info"]‘).fancybox().click(function(){
if(true){
}
else{
$.fancybox.close();
}
});
注意比对两段代码,你会发现fancybox和click方法的顺序不同。fancybox是绑定在click事件上的。前一段代码中cancle导致fancybox方法失效;后一段代码实际上就是关闭fancybox,也就是说你得让fancybox打开了才能关闭它,所以它们出现的顺序就这么决定了。
PS Firefox 4发布了,太不错了,你值得拥有!
在Asp.Net中使用fancybox通常遇到的问题,主要是在fancybox中的服务器端控件无法正常工作了,一些网友提出给fancybox中的控件绑定事件,并使用__doPostback(”,”)触发该控件的服务器端实践。当然这是一种解决的办法,但是每一次都要额外写一些代码,确实也挺烦的。
一种较为行之有效的方法就是修改fancybox的主JS文件,搜索其中的body并将其替换为form。因为fancybox的弹出窗口是通过在页面中添加多个层来实现的,默认情况下这些层都使用append方法添加在body的最后,也就是form的外边,当显示fancybox是服务器端控件会被移出form。而添加的服务器端控件是必须包含在form中的,否则无法正常工作。
另外,如果你在项目中使用了updatepanel,可能在updatepanel中的链接无法使用fancybox正常显示。例如,在updatepanel中有一个GridView,其中的一列上添加了链接,用来弹出fancybox显示详细信息,第一次进入页面后,点击链接可以弹出fancybox,当点击查询按钮后,再点击链接fancybox就失效,转而变为页面跳转。
大致分析的原因是,查询使得GridView中链接列的链接上绑定的fancybox丢失了。直接的想法就是,在查询结束后,列表绑定完成后,重新为链接列的每一个链接重新绑定fancybox。这样,我们在调用GridView的绑定方法之后,向页面中写入一段脚本,页面上脚本如下:
jQuery.showInfo = function(){
jQuery(‘a[name="linkInfo"]‘).fancybox();
}
服务器端代码,ScriptManager.RegisterStartupScript(Page,Page.GetType(),”",”jQuery.showInfo();”,true);
目前,在我的试验中,你需要为fancybox指定一些参数,否则可能仍然会出现原来的问题。
PS Firefox 4即将正式发布,等不及了,赶快尝试吧!