This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tsg-ui-demo/public/resources/scripts/messagecenter.js
chengsir fae7024b9c t
2019-05-14 17:18:16 +08:00

280 lines
10 KiB
JavaScript

if (typeof console == 'undefined') console = {
log: function () { }
};
// sniff chrome
var CHROME_5_LOCAL = false;
var CHROME = false;
var SAFARI = false;
var FIREFOX = false;
var WEBKIT = false;
var OS_MAC = false;
var IOS = false;
var ANDROID = false;
var MOBILE_DEVICE = false;
var IE = false;
var IE_10_AND_BELOW = false; //ie 10 and lower
var IE_11_AND_ABOVE = false; //ie 11 and above
var BROWSER_VERSION = 5000;
(function () {
if(!window.$axure) window.$axure = function() {};
var useragent = window.navigator.userAgent;
var edgeRegex = /Edge\/([0-9]+)/g;
var edgeMatch = edgeRegex.exec(useragent);
$axure.browser = { isEdge: Boolean(edgeMatch) };
if(!$axure.browser.isEdge) {
var chromeRegex = /Chrome\/([0-9]+).([0-9]+)/g;
var chromeMatch = chromeRegex.exec(useragent);
CHROME = Boolean(chromeMatch);
CHROME_5_LOCAL = chromeMatch &&
Number(chromeMatch[1]) >= 5 &&
location.href.indexOf('file://') >= 0;
}
var safariRegex = /Safari\/([0-9]+)/g;
var safariMatch = safariRegex.exec(useragent);
SAFARI = Boolean(safariMatch) && !CHROME; //because chrome also inserts safari string into user agent
var webkitRegex = /WebKit\//g ;
WEBKIT = Boolean(webkitRegex.exec(useragent));
FIREFOX = useragent.toLowerCase().indexOf('firefox') > -1;
var macRegex = /Mac/g ;
OS_MAC = Boolean(macRegex.exec(window.navigator.platform));
IOS = useragent.match(/iPhone/i) || useragent.match(/iPad/i) || useragent.match(/iPod/i);
ANDROID = useragent.match(/Android/i);
MOBILE_DEVICE = ANDROID || IOS
|| navigator.userAgent.match(/webOS/i)
|| navigator.userAgent.match(/BlackBerry/i)
|| navigator.userAgent.match(/Tablet PC/i)
|| navigator.userAgent.match(/Windows Phone/i);
if($.browser) {
if($.browser.msie) IE_10_AND_BELOW = true;
else IE_11_AND_ABOVE = useragent.toLowerCase().indexOf('trident') > -1;
BROWSER_VERSION = $.browser.version;
}
IE = IE_10_AND_BELOW || IE_11_AND_ABOVE;
//Used by sitemap and variables.js getLinkUrl functions so that they know
//whether to embed global variables in URL as query string or hash string
//_shouldSendVars persists the value for sitemap instead of re-checking every time
var _shouldSendVars;
var _shouldSendVarsToServer = function(url) {
if(typeof _shouldSendVars != 'undefined') {
return _shouldSendVars;
}
if(SAFARI || (IE_10_AND_BELOW && BROWSER_VERSION < 10)) {
var urlToCheck = typeof url != 'undefined' ? url : window.location.href;
var serverRegex = /http:\/\/127\.0\.0\.1:[0-9]{5}/g;
var serverMatch = serverRegex.exec(urlToCheck);
var previewRegex = /[0-9]{2}\.[0-9]{2}\.[0-9]{2}/g;
var previewMatch = previewRegex.exec(urlToCheck);
if(Boolean(serverMatch) && Boolean(previewMatch)) {
_shouldSendVars = true;
return _shouldSendVars;
}
}
_shouldSendVars = false;
return _shouldSendVars;
};
$axure.shouldSendVarsToServer = _shouldSendVarsToServer;
})();
(function() {
var _topMessageCenter;
var _messageCenter = {};
var _listeners = [];
var _stateListeners = [];
var _state = {};
var _eventObject = null;
var _queuedMessages = [];
var _initialized = false;
// this is for the non Chrome 5 local scenarios. The "top" message center will dispatch to all the bottom ones
var _childrenMessageCenters = [];
// create $axure if it hasn't been created
if (!window.$axure) window.$axure = function() {};
$axure.messageCenter = _messageCenter;
// isolate scope, and initialize _topMessageCenter.
(function() {
if (!CHROME_5_LOCAL) {
var topAxureWindow = window;
try {
while(topAxureWindow.parent && topAxureWindow.parent !== topAxureWindow
&& topAxureWindow.parent.$axure) topAxureWindow = topAxureWindow.parent;
} catch(e) {}
_topMessageCenter = topAxureWindow.$axure.messageCenter;
}
})();
$(window.document).ready(function() {
if (CHROME_5_LOCAL) {
$('body').append("<div id='axureEventReceiverDiv' style='display:none'></div>" +
"<div id='axureEventSenderDiv' style='display:none'></div>");
_eventObject = window.document.createEvent('Event');
_eventObject.initEvent('axureMessageSenderEvent', true, true);
$('#axureEventReceiverDiv').bind('axureMessageReceiverEvent', function () {
var request = JSON.parse($(this).text());
_handleRequest(request);
});
} else {
if (_topMessageCenter != _messageCenter) {
_topMessageCenter.addChildMessageCenter(_messageCenter);
console.log('adding from ' + window.location.toString());
}
}
});
var _handleRequest = function (request) {
// route the request to all the listeners
for(var i = 0; i < _listeners.length; i++) _listeners[i](request.message, request.data);
// now handle the queued messages if we're initializing
if (request.message == 'initialize') {
_initialized = true;
// send all the queued messages and return
for (var i = 0; i < _queuedMessages.length; i++) {
var qRequest = _queuedMessages[i];
_messageCenter.postMessage(qRequest.message, qRequest.data);
}
_queuedMessages = [];
}
// and then handle the set state messages, if necessary
if (request.message == 'setState') {
_state[request.data.key] = request.data.value;
for (var i = 0; i < _stateListeners.length; i++) {
var keyListener = _stateListeners[i];
// if thep passed a null or empty value, always post the message
if (!keyListener.key || keyListener.key == request.data.key) {
keyListener.listener(request.data.key, request.data.value);
}
}
}
};
// -----------------------------------------------------------------------------------------
// This method allows for dispatching messages in the non-chromelocal scenario.
// Each child calls this on _topMessageCenter
// -----------------------------------------------------------------------------------------
_messageCenter.addChildMessageCenter = function(messageCenter) {
_childrenMessageCenters[_childrenMessageCenters.length] = messageCenter;
};
// -----------------------------------------------------------------------------------------
// This method allows for dispatching messages in the non-chromelocal scenario.
// Each child calls this on _topMessageCenter
// -----------------------------------------------------------------------------------------
_messageCenter.dispatchMessage = function(message, data) {
_handleRequest({
message: message,
data: data
});
};
// -----------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------
_messageCenter.dispatchMessageRecursively = function(message, data) {
console.log("dispatched to " + window.location.toString());
// dispatch to the top center first
_messageCenter.dispatchMessage(message, data);
$('iframe').each(function(index, frame) {
//try,catch to handle permissions error in FF when loading pages from another domain
try {
if (frame.contentWindow.$axure && frame.contentWindow.$axure.messageCenter) {
frame.contentWindow.$axure.messageCenter.dispatchMessageRecursively(message, data);
}
}catch(e) {}
});
};
var _combineEventMessages = false;
var _compositeEventMessageData = [];
_messageCenter.startCombineEventMessages = function() {
_combineEventMessages = true;
}
_messageCenter.endCombineEventMessages = function () {
_messageCenter.sendCompositeEventMessage();
_combineEventMessages = false;
}
_messageCenter.sendCompositeEventMessage = function () {
_messageCenter.postMessage('axCompositeEventMessage', _compositeEventMessageData);
_compositeEventMessageData = [];
}
_messageCenter.postMessage = function (message, data) {
if(_combineEventMessages) {
if(message == 'axEvent' || message == 'axCase' || message == 'axAction' || message == 'axEventComplete') {
_compositeEventMessageData.push({ 'message': message, 'data': data });
if(_compositeEventMessageData.length >= 10) _messageCenter.sendCompositeEventMessage();
return;
}
}
if(!CHROME_5_LOCAL) {
_topMessageCenter.dispatchMessageRecursively(message, data);
} else {
var request = {
message: message,
data: data
};
if(_initialized) {
var senderDiv = window.document.getElementById('axureEventSenderDiv');
var messageText = JSON.stringify(request);
// console.log('sending event: ' + messageText);
senderDiv.innerText = messageText;
senderDiv.dispatchEvent(_eventObject);
// console.log('event sent');
} else {
_queuedMessages[_queuedMessages.length] = request;
}
}
};
_messageCenter.setState = function(key, value) {
var data = {
key: key,
value: value
};
_messageCenter.postMessage('setState', data);
};
_messageCenter.getState = function(key) {
return _state[key];
};
_messageCenter.addMessageListener = function(listener) {
_listeners[_listeners.length] = listener;
};
_messageCenter.addStateListener = function(key, listener) {
_stateListeners[_stateListeners.length] = {
key: key,
listener: listener
};
};
})();