一次关于“_doPostBack 未定义”的调试

  今天在调试程序的时候,发现了一个以前未遇到的错误:点击服务端LinkButton报“__doPostBack未定义”。

  LinkButton的定义:<asp:LinkButton ID="lbtnCacncel" target="_top" runat="server" class="logout" onclick="lbtnCacncel_Click">退出</asp:LinkButton>

  生成的html是:<a id="lbtnCacncel" class="logout" target="_top" href="javascript:__doPostBack(&#39;lbtnCacncel&#39;,&#39;&#39;)">退出</a>

  于是google了一下,找到了一些资料:http://blogs.msdn.com/b/scott_hanselman/archive/2011/10/28/asp-net-ie10-dopostback-javascript-ff5.aspx,说原因是:ASP.NET无法检测IE10,导致_doPostBack未定义,可我用的浏览器不是ie10啊,怎么也会出现这个问题呢?

  我尝试加了一个Button,运行,执行同样的代码,结果没有报错!  

  我又加了个一个<a href="javascript:__doPostBack('','')">退出</a>,运行,点击连接,没有报错!啊?这是怎么回事儿?这说明__doPostBack这个方法定义了啊!,难道真是浏览器的原因?

  于是我就尝试了一下上面所说的第二种解决方法:给需要的项目添加浏览器版本文件,安装完之后,浏览,点击,依然报“__doPostBack未定义”。

  好郁闷啊!

  后来我无意间把target="_top"去掉了,然后浏览的时候,意外的发现不再报错了!哎?难道是这句话导致的“__doPostBack未定义”?

  静下心来好好的分析一下:target="_top",意思是在整个窗口中打开被链接文档。照这样的分析,难道_doPostBack这个函数也会在整个窗口中,也就是父窗口中执行!

  为了证实自己的猜测,我在父窗口增加了一个js函数

function xx(){

  alert('123');

}

  然后再当前页面里增加了一个链接<a href="javascript:xx()" target="_top">执行父窗口方法</a>,运行,点击链接,果然弹出了对话框!

  分析到这里,我恍然大悟,原来这个错误的根本原因是我当前页面被嵌套在一个Iframe里面了,当执行这个LinkButton这个按钮的时候,实际上时在父窗口中执行的_PostBack这个函数,而父窗口中又没有生成这个函数,所以会出现错误!

  做开发这么长时间了,我只是知道target="_top",会在整个窗口中打开被链接文档,没想到同样可以在父窗口中执行父窗口中定义的js函数,唉,看来这些细节真是得多关注,多记录啊!

posted @ 2013-04-05 15:10  Geodon  阅读(1398)  评论(1编辑  收藏  举报