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

js

自从[javascript]自定义MessageBox一文发布以后,很多网友都来信询问,如何在服务端调用ShowInfo方法,周末休息想了个折中的办法来实现。
首先,我们应该可以先明确,为什么我们用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,有兴趣的朋友可以共同研究下。

http://www.cnblogs.com/walkingboy/archive/2006/08/28/autorun_customerfunction.html

时间: 2025-01-02 20:30:23

如何在服务端(Page.Write)调用自定义的JS方法的相关文章

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

首先,我们应该可以先明确,为什么我们用Page.Write把自定义的JS方法输出到页面上为什么IE不能识别,会出现"XXX未定义"的错误.原因很简单,因为我们用Page.Write输出的脚本是出现在页面的最顶端.IE读到是javascript函数的时候,就开始执行,但是此时我们link的js文件并未被IE读入,所以IE无法识别我们定义在js文件里面的方法.那write alert为什么可以呢?因为alert是IE内嵌的脚本功能函数,不管有没有页面,IE都认得它.找到问题所在,自然就好解

informatic 端没有这样的问服务端切换之后调用存储过程一直running状态。

问题描述 informatic 端没有这样的问服务端切换之后调用存储过程一直running状态. informatic 端没有这样的问服务端切换之后调用存储过程一直running状态.切换之前线上一直都是没有问题!很苦恼希望救世主解救一下我把

shiro不执行认证方法 不调用自定义的doGetAuthenticationInfo方法

问题描述 shiro不执行认证方法 不调用自定义的doGetAuthenticationInfo方法 在访问认证路径时 String exceptionClassName = (String) request.getAttribute(""shiroLoginFailure""); 在这直接路过 不去调用自定的realm 解决方案 http://www.oschina.net/question/273295_105031

求指导怎样在一个button按钮里面调用两个js方法,第一个没有执行完,第二个不允许执行。

问题描述 求指导怎样在一个button按钮里面调用两个js方法,第一个没有执行完,第二个不允许执行. function MustWrite(){ var a = document.getElementById("stopReason").value; if(a==""){ alert("必填项,请重新输入"); return false; } function stopProtocol(){ //if(confirm("是否终止协议?&

dedecms首页调用自定义字段的方法

风信网(ithov.com)原创文章:今天在研究dedecms关于自定义字段的使用,由于首页模块index_article.htm文件中需要调用自定义的字段中的数据.在获取附加表内容时,必须符合以下两个条件: 1.指定 channelid 属性 2.指定要获得的字段 addfields='字段1,字段'&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 注意:每个字段用英文半角逗号分开如下示例所示: {dede:ch

使用HTTP/2服务端推送技术加速Node.js应用

四月份,我们宣布了对 HTTP/2 服务端推送技术的支持,我们是通过 HTTP 的 Link 头部来实现这项支持的.我的同事 John 曾经通过一个例子演示了在 PHP 里支持服务端推送功能是多么的简单. 我们想让现今使用 Node.js 构建的网站能够更加轻松的获得性能提升.为此,我们开发了 netjet 中间件,它可以解析应用生成的 HTML 并自动添加 Link 头部.当在一个示例的 Express 应用中使用这个中间件时,我们可以看到应用程序的输出多了如下 HTTP 头: 本博客是使用

使用 HTTP/2 服务端推送技术加速 Node.js 应用

netjet 使用了带有定制插件的 PostHTML 来解析 HTML.目前,netjet 用它来查找图片.脚本和外部 CSS 样式表.你也可以用其它的技术来实现这个. 在响应过程中增加 HTML 解析器有个明显的缺点:这将增加页面加载的延时(到加载第一个字节所花的时间).大多数情况下,所新增的延时被应用里的其他耗时掩盖掉了,比如数据库访问.为了解决这个问题,netjet 包含了一个可调节的 LRU 缓存,该缓存以 HTTP 的 ETag 头部作为索引,这使得 netjet 可以非常快的为已经解

SpringBoot之退出服务(exit)时调用自定义的销毁方法

我们在工作中有时候可能会遇到这样场景,需要在退出容器的时候执行某些操作.SpringBoot中有两种方法可以供我们来选择(其实就是spring中我们常用的方式.只是destory-method是在XML中配置的,SpringBoot是去配置化.所以这里就不提这种方式了),一种是实现DisposableBean接口,一种是使用@PreDestroy注解.OK,下面我写两个例子看一下: DisposableBean接口 我们可以通过实现这个接口来在容器退出的时候执行某些操作.例子如下: packag

asp在IE浏览器中下载服务端上的各类文件的实现方法_应用技巧

即直接提示用户下载而不是由浏览器打开某些文件.注意,下面的代码拷贝到ASP文件中后,不要再添加一些非ASP代码在页面中:如HTML和javascript客户端的代码.  复制代码 代码如下: <% '-------------------------------------------- Response.Buffer = True Dim strFilePath, strFileSize, strFileName Const adTypeBinary = 1 strFilePath = "