Jiong

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  6 随笔 :: 0 文章 :: 8 评论 :: 0 引用

公告

2008年12月24日 #

我最近在做一个项目的时候,需要写一个javascript的类来对一个ActiveX控件进行封装。而ActiveX控件有它自己的事件以及事件参数,我先后用了“attachEvent”和“$addHandler”来订阅事件,但都有不同的问题,“attachEvent”订阅的事件能正常得到参数,但“this”不再是当前类的实例。而用“$addHandler”订阅的事件能“this”能正确的返回当前类的实例,但ActiveX控件传过来的参数丢失了,而只有一个“Sys.UI.DomEvent”实例的参数。

为了满足需求我就把“$addHandler”方法做了如下的修改,让其能实现“this”和ActiveX控件的事件参数都能正确的得到,并且也保留了“Sys.UI.DomEvent”这个实例的参数。

 

 1
 2var $addHandler = Sys.UI.DomEvent.addHandler = function Sys$UI$DomEvent$addHandler(element, eventName, handler) {
 3    /// <summary locid="M:J#Sys.UI.DomEvent.addHandler" />
 4    /// <param name="element"></param>
 5    /// <param name="eventName" type="String"></param>
 6    /// <param name="handler" type="Function"></param>
 7    //    var e = Function._validateParams(arguments, [
 8    //        { name: "element" },
 9    //        { name: "eventName", type: String },
10    //        { name: "handler", type: Function }
11    //    ]);
12    //    if (e) throw e;
13    //    Sys.UI.DomEvent._ensureDomNode(element);
14    if (eventName === "error"throw Error.invalidOperation(Sys.Res.addHandlerCantBeUsedForError);
15    if (!element._events) {
16        element._events = {};
17    }

18    var eventCache = element._events[eventName];
19    if (!eventCache) {
20        element._events[eventName] = eventCache = [];
21    }

22    var browserHandler;
23    if (element.addEventListener) {
24        browserHandler = function(e) {
25            var ev = null;
26            try {
27                ev = new Sys.UI.DomEvent(e);
28            }
 catch (ex) { }
29            var al = "handler.call(element, ev";
30            for (var i = 0; i < arguments.length; i++{
31                al += ", arguments[" + i + "]";
32            }

33            al += ")";
34            return eval(al);
35            //return handler.call(element, ev, arguments);
36        }

37        element.addEventListener(eventName, browserHandler, false);
38    }

39    else if (element.attachEvent) {
40        browserHandler = function() {
41            var e = {};
42            try { e = Sys.UI.DomElement._getWindow(element).event } catch (ex) { }
43            var ev = null;
44            try {
45                ev = new Sys.UI.DomEvent(e);
46            }
 catch (ex) { }
47            var al = "handler.call(element, ev";
48            for (var i = 0; i < arguments.length; i++{
49                al += ", arguments[" + i + "]";
50            }

51            al += ")";
52            return eval(al);
53            //return handler.call(element, ev, arguments);
54        }

55        element.attachEvent('on' + eventName, browserHandler);
56    }

57    eventCache[eventCache.length] = { handler: handler, browserHandler: browserHandler };
58}
posted @ 2008-12-24 10:21 Jiong 阅读(1610) 评论(1) 编辑

2007年4月5日 #

摘要:
使用了应用程序域来加载 COM,本想都采用应用程序域的,但没找到传对象到新域里的方法(如传 DataTable、TcpClient 等主域中的对象),所以 Net 的插件采用了读入内存的方法载入,这样就可以给 Net 的插件传主域中的对象了。
阅读全文
posted @ 2007-04-05 22:59 Jiong 阅读(613) 评论(0) 编辑

2007年3月21日 #

摘要:
在网站集的首页添加“内容查询 Web 部件”部件,并修改其属性如下,其他的保持默认值。

设置完后就能正常显示了,用该部件还能实现其他的信息显示。
有一点需要注意的是,用系统帐户身份浏览时筛选条件“分配对象”将造成查询不到任何信息,但其他用户浏览时一切正常,解决这个问题需要做以下几点修改。
阅读全文
posted @ 2007-03-21 18:28 Jiong 阅读(634) 评论(1) 编辑

2007年3月20日 #

摘要: 加载COM对象:
Type tmpType = Type.GetTypeFromProgID("对象名称");
Object tmpClass = Activator.CreateInstance(tmpType);

加载.Net程序集:
Object tmpClass = Assembly.LoadFile("程序集路径").CreateInstance("程序集名称", true);
Type tmpType = tmpClass.GetType();
阅读全文
posted @ 2007-03-20 18:20 Jiong 阅读(1358) 评论(0) 编辑

摘要:
我在几个月前给客户做报表时,客户提出这样一个要求,要在报表生成后在打印前用户还能对表格进行调整,比如人为根据感官调整字体的大小行间距等,当时在网上找了些报表控件看了一下,都不能满足后期调整的要求,而且购买第三方的控件又增加公司的成本,又需对实施人员和用户管理员进行相关的技术培训。最后决定还是用最常用的报表设计工具 Excel 来完成这件事。

在 Excel 中有一个“XML映射”功能,是把 XML 当成数据源映射到 Excel 中来,我们就可以利用这个功能把我们需要做报表的数据生成成XML然后映射到 Excel 中,让实施人员或用户管理员可以在 Excel 这个熟悉的环境中来进行可视化的报表设计。下边这个“UpdateXmlData”函数就是实现连接到一个数据库并执行一句SQL语句然后用ADO把数据存为XML并用XSLT过滤掉无用信息,返回一个XML的字符串。阅读全文
posted @ 2007-03-20 18:18 Jiong 阅读(1409) 评论(3) 编辑

摘要: 最近在学习MOSS2007的过程中,使用 SharePoint Designer 做流程时感觉到有几个不方便的地方,不知道算不算是 Designer 的BUG呢?

1、添加一个“从用户处收集数据”的操作,在其中添加几个“域”,然后在后边的步骤中“比较任意数据源”,在选择数据源时有时找不到新加的“域”,这时只有“完成”整个工作流后再打开工作流,才能找到该域。这种情况一般不会发生在第1次或第2次使用“从用户处收集数据”的“域”。阅读全文
posted @ 2007-03-20 18:16 Jiong 阅读(867) 评论(3) 编辑

仅列出标题