在服务端(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 相关文章推荐
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
Jan 13 Javascript
缓动函数requestAnimationFrame 更好的实现浏览器经动画
Dec 07 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
Jan 28 Javascript
js调用iframe实现打印页面内容的方法
Mar 04 Javascript
JSON与String互转的实现方法(Javascript)
Sep 27 Javascript
关于javascript事件响应的基础语法总结(必看篇)
Dec 26 Javascript
Vue input控件通过value绑定动态属性及修饰符的方法
May 03 Javascript
详解vue渲染从后台获取的json数据
Jul 06 Javascript
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
使用weixin-java-tools完成微信授权登录、微信支付的示例
Sep 26 Javascript
4 种滚动吸顶实现方式的比较
Apr 09 Javascript
ES6基础之 Promise 对象用法实例详解
Aug 22 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
PHILIPS AE3805收音机的分析打磨
2021/03/02 无线电
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
linux下为php添加iconv模块的方法
2016/02/28 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
php+lottery.js实现九宫格抽奖功能
2019/07/21 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
我的Node.js学习之路(一)
2014/07/06 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
分享一个原生的JavaScript拖动方法
2016/09/25 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
解决Extjs下拉框不显示的问题
2017/06/21 Javascript
响应式框架Bootstrap栅格系统的实例
2017/12/19 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
layui实现给某一列加点击事件
2019/10/26 Javascript
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
[01:01:52]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第二场 1月9日
2021/03/11 DOTA
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
如何利用python制作时间戳转换工具详解
2018/09/12 Python
python 基于TCP协议的套接字编程详解
2019/06/29 Python
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
毕业生简历自我评价范文
2014/04/09 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
公司股东合作协议书
2014/09/14 职场文书
群众路线教育实践活动批评与自我批评
2014/09/15 职场文书
Python机器学习之基础概述
2021/05/19 Python
Grafana可视化监控系统结合SpringBoot使用
2022/04/19 Redis