.Net代码在Server端处理数据的时候,如果要采用JS脚本,我们一般都会采用Page.ClientScript.RegisterStartupScript这个方法来为页面注册脚本事件,这个代码我也是一直在使用,没有什么问题。可是最近我用IE8测试页面的时候,发现一旦我在服务器端触发这样的代码,浏览器的左下角总是会有错误提示:
打开看下究竟发生了什么
通过这个提示,我们大概可以知道,在Document还没有初始化之前,JS脚本就试图加载DOM才会形成这样的问题,那么我们的代码是怎么写的呢
/// <summary> /// 弹出JavaScript小窗口 /// </summary> /// <param name="js">窗口信息</param> public static void Alert(string message, Page page) { #region string js = @"<script type='text/javascript'> jAlert('" + message + "','提示');</script>"; //HttpContext.Current.Response.Write(js); if (!page.ClientScript.IsStartupScriptRegistered(page.GetType(), "alert")) { page.ClientScript.RegisterStartupScript(page.GetType(), "alert", js); } #endregion }
我们可以看到这是一种和普遍的写法,试试上我也是从网上百度到的,后来又百度了一下,原来需要在这个方法提交前,判断一下浏览器是否已经加载完毕,也就是加一个document.readyState来判断一下,于是代码改为
/// <summary> /// 弹出JavaScript小窗口 /// </summary> /// <param name="js">窗口信息</param> public static void Alert(string message, Page page) { #region string js = @"<script type='text/javascript'> $(document).ready(function(){jAlert('" + message + "','提示');});</script>"; //HttpContext.Current.Response.Write(js); if (!page.ClientScript.IsStartupScriptRegistered(page.GetType(), "alert")) { page.ClientScript.RegisterStartupScript(page.GetType(), "alert", js); } #endregion }
我们再运行一下看这个错误还会不会被抛出来
我这里的jAlert()方法在加载的时候回去操作DOM,所以造成了这样的一个现象,这样的现象还包括IE8中会提示你页面不存在,也是这个原因。
看似简单的代码,其实里面还是有很多东西需要我们去注意的。