eventManager.htc
16557 ワード
<!-- ---------------------------------------------------------------------
//
// Copyright 2001 Chordiant Software. All Rights Reserved.
//
// File: eventmanager.htc
//
// Auther: Ryan Carroll
// Created: 13/11/2001
//
// Description: Implements a manager registering and dispatching events
//
// Changes log:
//-------------------------------------------------------------------- -->
<PUBLIC:COMPONENT tagname="eventmanager" lightWeight="true">
<!-- Public Properties -->
<!-- Public Methods -->
<METHOD NAME="registerEvents" />
<METHOD NAME="dispatch" />
<METHOD NAME="unregisterWindow" />
<METHOD NAME="unregisterEvent" />
<!-- Public Events -->
<EVENT NAME="onError" ID="error" />
<!-- Private Event Listeners -->
<ATTACH EVENT="ondocumentready" HANDLER="setDefaults" />
// { start - performance fix
<ATTACH EVENT="ondetach" HANDLER="cleanUp" />
// } end - performance fix
</PUBLIC:COMPONENT>
<SCRIPT LANGUAGE="jscript">
//+----------------------------------------------------------------------------
//
// Global Variables
//
//-----------------------------------------------------------------------------
var registeredEvents = new Array();
function registeredEventObject(sEventName)
{
this.eventName = sEventName;
this.eventHandlers = new Array();
}
function registeredEventHandlerObject(sEventHandlerFunction, oWindow){
this.eventHandlerFunction = sEventHandlerFunction;
this.window = oWindow;
}
////////////////////////////////////////////////////////////////////////////////
// Methods Section //
////////////////////////////////////////////////////////////////////////////////
//+----------------------------------------------------------------------------
//
// Public Methods
//
//-----------------------------------------------------------------------------
//+----------------------------------------------------------------------------
//
// Function: registerEvents
//
// Description:
//
// Arguments: sMsg - descriptive text message
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function registerEvents(oEventRegistration, oWindow) {
var oEvents;
var oRegisterEventNodeList;
var sEventName;
var sEventHandler;
var sEventHandlerScriptFile;
var oSelectedRegisterEventNode;
var oRegisterEventNodeList;
var oNewEventScriptFile;
try {
oEvents = new ActiveXObject("Msxml.DOMDocument");
if((typeof oEventRegistration) == "string") {
oEvents.loadXML(oEventRegistration);
} else {
oEvents.loadXML(oEventRegistration.xml);
}
oRegisterEventNodeList = oEvents.selectNodes(".//registerevent");
for (var i=0; i < oRegisterEventNodeList.length; i++) {
oSelectedRegisterEventNode = oRegisterEventNodeList.item(i);
if(oSelectedRegisterEventNode.selectSingleNode("eventname") != null){
sEventName = oSelectedRegisterEventNode.selectSingleNode("eventname").text;
}
if(oSelectedRegisterEventNode.selectSingleNode("eventhandlerfunction") != null){
sEventHandler = oSelectedRegisterEventNode.selectSingleNode("eventhandlerfunction").text;
}
if(oSelectedRegisterEventNode.selectSingleNode("eventhandlerscriptfilename") != null){
sEventHandlerScriptFile = oSelectedRegisterEventNode.selectSingleNode("eventhandlerscriptfilename").text;
}
if( sEventHandlerScriptFile != null && sEventHandlerScriptFile != "") {
oNewEventScriptFile = oWindow.document.createElement("<script language=javascript src='"+sEventHandlerScriptFile+"'><\/script>")
oWindow.document.body.appendChild(oNewEventScriptFile);
}
addRegisteredEvent(sEventName, sEventHandler, oWindow);
}
} catch(e) {
returnError(e.toString());
} finally {
oEventRegistration = null;
oWindow = null;
oEvents = null;
oRegisterEventNodeList = null;
sEventName = null;
sEventHandler = null;
sEventHandlerScriptFile = null;
oSelectedRegisterEventNode = null;
oRegisterEventNodeList = null;
oNewEventScriptFile = null;
}
}
//+----------------------------------------------------------------------------
//
// Function: unregisterWindow
//
// Description:
//
// Arguments: sMsg - descriptive text message
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function unregisterWindow( oWindow ) {
var oRegisteredEvent;
try {
for(var i=0; i < registeredEvents.length; i++){
oRegisteredEvent = registeredEvents[i];
for(var j=oRegisteredEvent.eventHandlers.length - 1; j >= 0; j--){
if(oRegisteredEvent.eventHandlers[j].window == oWindow){
oRegisteredEvent.eventHandlers[j]=null;
oRegisteredEvent.eventHandlers.splice(j,1);
}
}
}
} catch(e) {
returnError(e.toString());
} finally {
oRegisteredEvent = null;
oWindow = null;
}
}
//+----------------------------------------------------------------------------
//
// Function: unregisterEvent
//
// Description:
//
// Arguments: sMsg - descriptive text message
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function unregisterEvent( sEventName, oWindow ) {
var oRegisteredEvent;
try {
for(var i=0; i < registeredEvents.length; i++){
if(registeredEvents[i].eventName == sEventName){
oRegisteredEvent = registeredEvents[i];
for(var j=oRegisteredEvent.eventHandlers.length - 1; j >= 0; j--){
if(oRegisteredEvent.eventHandlers[j].window == oWindow){
oRegisteredEvent.eventHandlers.splice(j,1);
}
}
break;
}
}
} catch(e) {
returnError(e.toString());
} finally {
oRegisteredEvent = null;
sEventName = null;
oWindow = null;
}
}
//+----------------------------------------------------------------------------
//
// Function: dispatch
//
// Description:
//
// Arguments: sMsg - descriptive text message
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function dispatch( sEventName, oEventData ) {
var oRegisteredEvent;
var sEventHandlerFunction;
var oEventHandlerWindow;
try {
for(var i=0; i < registeredEvents.length; i++){
if(registeredEvents[i].eventName == sEventName){
oRegisteredEvent = registeredEvents[i];
break;
}
}
if(oRegisteredEvent != null){
for(var i=0; i < oRegisteredEvent.eventHandlers.length; i++){
oEventHandlerWindow = oRegisteredEvent.eventHandlers[i].window;
sEventHandlerFunction = oRegisteredEvent.eventHandlers[i].eventHandlerFunction;
if(oEventHandlerWindow != null && sEventHandlerFunction != null){
try {
oEventHandlerWindow.eval(sEventHandlerFunction)(oEventData);
} catch(ex)
{
//don't do anything, handling windows that no longer exist but were not properly deregistered
}
}
}
}
} catch(e) {
returnError(e.toString());
} finally {
oRegisteredEvent = null;
sEventHandlerFunction = null;
oEventHandlerWindow = null;
sEventName = null;
oEventData = null;
}
}
//+----------------------------------------------------------------------------
//
// Private Methods
//
//-----------------------------------------------------------------------------
//+----------------------------------------------------------------------------
//
// Function: addRegisteredEvent
//
// Description:
//
// Arguments: sMsg - descriptive text message
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function addRegisteredEvent(sEventName, sEventHandlerFunction, oWindow){
var oRegisteredEvent;
var oEventHandler;
try {
//create new event handler object
oEventHandler = new registeredEventHandlerObject(sEventHandlerFunction, oWindow);
//search the registeredEvents collection to see if the event has already been registered
for(var i=0; i < registeredEvents.length; i++){
if(registeredEvents[i].eventName == sEventName){
oRegisteredEvent = registeredEvents[i];
break;
}
}
if(oRegisteredEvent == null){
oRegisteredEvent = new registeredEventObject(sEventName);
registeredEvents[registeredEvents.length] = oRegisteredEvent;
}
for(var i=0; i < oRegisteredEvent.eventHandlers.length; i++){
oSelectedEventHanlder = oRegisteredEvent.eventHandlers[i];
if(oSelectedEventHanlder.eventHandlerFunction == oEventHandler.eventHandlerFunction && oSelectedEventHanlder.window == oEventHandler.window ){
return;
}
}
oRegisteredEvent.eventHandlers[oRegisteredEvent.eventHandlers.length] = oEventHandler;
} catch(e) {
returnError(e.toString());
} finally {
oRegisteredEvent = null;
oEventHandler = null;
sEventName = null;
sEventHandlerFunction = null;
oWindow = null;
}
}
//+----------------------------------------------------------------------------
//
// Function: setDefaults
//
// Description: Called during the initialization of the behavior. Sets
// the required default settings, and attaches the
// onpropertychange event (not done in the header to prevent
// firing the event during initialization).
//
// Arguments: none
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function setDefaults()
{
if(element.document.media != "print") {
// Attach the onpropertychange event
attachEvent("onpropertychange", doPropChange);
}
// { start - performance fix
window.attachEvent("onbeforeunload", cleanUp);
// } end - performance fix
}
// { start - performance fix
function cleanUp() {
try {
if(element.document.media != "print") {
detachEvent("onpropertychange", doPropChange);
}
if (window)
window.detachEvent("onbeforeunload", cleanUp);
} catch(e) {
returnError(e.toString());
} finally {
// Make sure all module variables are freed
registeredEvents = null;
}
}
// } end - performance fix
//+----------------------------------------------------------------------------
//
// Function: doPropChange
//
// Description: Runs on the onpropertychange event and calls the necessary
// functions to correctly handle the property that was just
// changed.
//
// Arguments: none
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function doPropChange()
{
var propertyName;
try {
propertyName = window.event.propertyName;
// Handle CSS property changes by calling necessary functions, setting
// variables, and/or setting styles
//
if (propertyName.substring(0,5) == "style")
{
// Handle Style changes
// switch(propertyName)
// {
// case "style.zIndex" :
// break;
// }
}
else
{
//
// Detach the onpropertychange event to prevent it from firing while
// the changes are handled
//
detachEvent("onpropertychange", doPropChange);
// Handle Property changes
switch(propertyName)
{
//case "leftBoundary" :
// leftBoundary = parseInt(leftBoundary);
// setLeftBoundary(leftBoundary);
// break;
default :
returnError(propertyName + " not a valid property");
break;
}
// Re-attach the onpropertychange event
attachEvent("onpropertychange", doPropChange);
}
} catch(e) {
returnError(e.toString());
} finally {
propertyName = null;
}
}
//+----------------------------------------------------------------------------
//
// Function: returnError
//
// Description: Fires the error event, along with a descriptive text
// message.
//
// Arguments: sMsg - descriptive text message
//
// Returns: nothing
//
//-----------------------------------------------------------------------------
function returnError(sMsg)
{
var oEvent;
try {
oEvent = createEventObject();
oEvent.setAttribute("error", sMsg);
error.fire(oEvent);
//alert(sMsg);
} finally {
oEvent = null;
sMsg = null;
}
}
</SCRIPT>
ページ参照と登録:
<IMPORT namespace="chordiant" implementation="/.../eventManager.htc" />
<xml id="CaseSearchResultListEventHandlers">
<events>
<registerevent>
<eventname>StopDisplayMessageReactivateHandler</eventname>
<eventhandlerfunction>stopDisplayMessageHandlerReactivate</eventhandlerfunction>
</registerevent>
</events>
</xml>
function stopDisplayMessageHandlerReactivate(){
do something here.
}
:
desktop.eventManager.registerEvents(CaseSearchResultListEventHandlers, window );
top.advisorDesktop.eventManager.dispatch("StopDisplayMessageReactivateHandler", obj);