在服务端(Page.Write)调用自定义的JS方法详解


Posted in Javascript onAugust 09, 2013

首先,我们应该可以先明确,为什么我们用Page.Write把自定义的JS方法输出到页面上为什么IE不能识别,会出现“XXX未定义”的错误。原因很简单,因为我们用Page.Write输出的脚本是出现在页面的最顶端。IE读到是javascript函数的时候,就开始执行,但是此时我们link的js文件并未被IE读入,所以IE无法识别我们定义在js文件里面的方法。那write alert为什么可以呢?因为alert是IE内嵌的脚本功能函数,不管有没有页面,IE都认得它。
找到问题所在,自然就好解决了:
1、把我们自定义的方法内嵌到IE里面。 ---> 看起来有点异想天开,呵呵
2、等页面载入完成后再触发事件。 --->触发事件,没错。
如何知道页面是否载入完成呢?
1、通过document的状态
2、通过事件触发(windows.onload)
第一种好像比较不保险,有时候明明已经全部载完了,它还是一直显示在传送数据(FF此情况最明显),所以还是用事件比较保险一点。
定义一个简单方法,挂载到windows.onload里面,执行的时候做一个标识

var loadComplete = false;
function LoadCompleted()
{
loadComplete= true;
}
window.attachEvent("onload",LoadCompleted);

呵呵,这样我们只要通过判断loadComplete来取得页面是否载入完毕了。
var mImgdir = "";
var mCaption = "caption";
var mMsg = "Message";
var mOkClick= null;
function ShowMessage(imgdir,caption,msg,OkClick)
{
if(loadComplete)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
}
}

这样子在loadComplete未false的情况下,我们就不会去执行KMessageBox.ShowInfo()方法,只然就不会出现JS错误提示了。
单单这样子,还不行,因为输出的这样的脚本,IE只在输出页面的时候执行了一次,但是此时loadComplete=false,所以,我们需要定时检测页面是否载入完毕。说到定时,只然是祭出setTimeout & setInterval. 我们这里需要不停的检测,故使用setInterval方法。最终代码如下:
var loadComplete = false;
var mImgdir = "";
var mCaption = "caption";
var mMsg = "Message";
var mOkClick= null;
var timerID;
function ShowMessage(imgdir,caption,msg,OkClick)
{
if(loadComplete)
{
KMessageBox.ShowInfo(mImgdir,mCaption,mMsg,mOkClick);
     //卸载此事件     window.detachEvent("onload",function(){LoadCompleted;});     //停止定时触发
     window.clearInterval(timerID); 
    } 
}
function LoadCompleted() { loadComplete=true; }
window.attachEvent("onload",LoadCompleted);
//设置定时检测机制
timerID = window.setInterval(ShowMessage,1);

当然以上代码只兼容IE,因为使用attachEvent 和 detachEvent,至于让他兼容其他浏览器可以参看[JavaScript]自定义Title的显示方式一文中的处理方式:
if(!document.attachEvent)//Not IE
{
document.attachEvent = function(){document.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
}
if(!window.attachEvent)//Not IE
{
window.attachEvent = function(){window.addEventListener(arguments[0].substr(2),arguments[1],arguments[2])}
}
 

在服务端,只要StringBuilder出以上的脚本,然后Write出来就可以了。上面也只是提供了一种思路,当然还会有其他的办法,比如我不适用定时检测,我直接挂载到windows.onload里面,让页面自动监听,自动执行,也未尝不可:),正所谓条条大路通罗马嘛~~~~~
以上思路来自yui,并且yui实现了一个更漂亮的自定义MessageBox,有兴趣的朋友可以共同研究下。
Javascript 相关文章推荐
document.getElementBy("id")与$("#id")有什么区别
Sep 22 Javascript
JS复制内容到剪切板的实例代码(兼容IE与火狐)
Nov 19 Javascript
js使用栈来实现10进制转8进制与取除数及余数
Jun 11 Javascript
jQuery圆形统计图开发实例
Jan 04 Javascript
微信小程序 wx.request(object) API详解及实例代码
Sep 30 Javascript
浅谈jquery采用attr修改form表单enctype不起作用的问题
Nov 25 Javascript
JavaScript函数参数的传递方式详解
Mar 06 Javascript
详解angular如何调用HTML字符串的方法
Jun 30 Javascript
快速搭建Node.js(Express)用户注册、登录以及授权的方法
May 09 Javascript
微信小程序点击滚动到指定位置的实现
May 22 Javascript
vue 在服务器端直接修改请求的接口地址
Dec 19 Vue.js
详解CocosCreator消息分发机制
Apr 16 Javascript
Jquery显示、隐藏元素以及添加删除样式
Aug 09 #Javascript
jquery实现文字由下到上循环滚动的实例代码
Aug 09 #Javascript
jquery 实现上下滚动效果示例代码
Aug 09 #Javascript
15条JavaScript最佳实践小结
Aug 09 #Javascript
web网页按比例显示图片实现原理及js代码
Aug 09 #Javascript
html向js方法传递参数具体实现
Aug 08 #Javascript
js获取控件位置以及不同浏览器中的差别介绍
Aug 08 #Javascript
You might like
PHP用GD库生成高质量的缩略图片
2011/03/09 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
jquery插件 autoComboBox 下拉框
2010/12/22 Javascript
jQuery的attr与prop使用介绍
2013/10/10 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
JS+CSS实现的蓝色table选项卡效果
2015/10/08 Javascript
深入理解ECMAScript的几个关键语句
2016/06/01 Javascript
Bootstrap的fileinput插件实现多文件上传的方法
2016/09/05 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
微信小程序开发之入门实例教程篇
2017/03/07 Javascript
Node.js中的require.resolve方法使用简介
2017/04/23 Javascript
es7学习教程之Decorators(修饰器)详解
2017/07/21 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
2019/12/18 Javascript
python如何读写json数据
2018/03/21 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
python使用smtplib模块发送邮件
2020/12/17 Python
LA MER海蓝之谜美国官网:传奇面霜
2016/08/27 全球购物
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
MYSQL支持事务吗
2013/08/09 面试题
电子信息毕业生自荐信
2013/11/16 职场文书
业务部门经理岗位职责
2014/02/23 职场文书
企业宣传方案
2014/03/04 职场文书
学习优秀共产党员先进事迹思想报告
2014/09/17 职场文书
医院护士党的群众路线教育实践活动对照检查材料思想汇报
2014/10/04 职场文书
2014年街道办事处工作总结
2014/12/11 职场文书
异地恋情人节寄语
2015/02/28 职场文书
离婚被告答辩状
2015/05/22 职场文书
幼儿园大班教学反思
2016/03/02 职场文书
SQL注入的实现以及防范示例详解
2021/06/02 MySQL
分析Python list操作为什么会错误
2021/11/17 Python