📄 ajaxtags.js
字号:
setCookie("AjaxJspTag.Portlet."+this.options.source,
AJAX_PORTLET_CLOSE,
this.options.expireDate);
}
},
togglePortlet: function(e) {
Element.toggle(this.options.target);
if (this.options.isMaximized) {
$(this.options.toggle).src = this.options.imageMaximize;
this.stopAutoRefresh();
} else {
$(this.options.toggle).src = this.options.imageMinimize;
this.startAutoRefresh();
}
this.options.isMaximized = !this.options.isMaximized;
// Save state in cookie
if (this.preserveState) {
setCookie("AjaxJspTag.Portlet."+this.options.source,
(this.options.isMaximized == true ? AJAX_PORTLET_MAX : AJAX_PORTLET_MIN),
this.options.expireDate);
}
}
});
/**
* AUTOCOMPLETE TAG
*/
Ajax.XmlToHtmlAutocompleter = Class.create();
Object.extend(Object.extend(Ajax.XmlToHtmlAutocompleter.prototype, Autocompleter.Base.prototype), {
initialize: function(element, update, url, options) {
this.baseInitialize(element, update, options);
this.options.asynchronous = true;
this.options.onComplete = this.onComplete.bind(this);
this.options.defaultParams = this.options.parameters || null;
this.url = url;
},
getUpdatedChoices: function() {
entry = encodeURIComponent(this.options.paramName) + '=' +
encodeURIComponent(this.getToken());
this.options.parameters = this.options.callback ?
this.options.callback(this.element, entry) : entry;
// parse parameters and do replacements
var params = buildParameterString(this.options.defaultParams);
if (!isEmpty(params) || (isString(params) && params.length > 0)) {
this.options.parameters += '&' + params;
}
new Ajax.Request(this.url, this.options);
},
onComplete: function(request) {
var parser = new ResponseXmlToHtmlListParser();
parser.load(request);
this.updateChoices(parser.content);
}
});
AjaxJspTag.Autocomplete = Class.create();
AjaxJspTag.Autocomplete.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
$(this.options.source).setAttribute("autocomplete", "off");
// create DIV
new Insertion.After(this.options.source, '<div id="' + this.options.divElement + '" class="' + this.options.className + '"></div>');
this.execute();
},
setOptions: function(options) {
this.options = Object.extend({
divElement: "ajaxAuto_" + options.source,
indicator: options.indicator || '',
parameters: options.parameters || '',
parser: options.parser ? options.parser : new ResponseHtmlParser(),
handler: options.handler ? options.handler : this.handler
}, options || {});
},
execute: function(e) {
if (this.options.preFunction != null) this.options.preFunction();
var obj = this; // required because 'this' conflict with Ajax.Request
var aj = new Ajax.XmlToHtmlAutocompleter(
this.options.source,
this.options.divElement,
this.url, {minChars: obj.options.minimumCharacters,
tokens: obj.options.appendSeparator,
indicator: obj.options.indicator,
parameters: obj.options.parameters,
evalScripts: true,
afterUpdateElement: function(inputField, selectedItem) {
obj.options.handler(null, {
selectedItem: selectedItem,
tokens: obj.options.appendSeparator,
target: obj.options.target,
inputField: inputField,
postFunction: obj.options.postFunction
}
);
}
}
);
},
handler: function(request, options) {
if (options.target) {
if (options.tokens) {
if ($(options.target).value.length > 0) {
$(options.target).value += options.tokens;
}
$(options.target).value += options.selectedItem.id;
} else {
$(options.target).value = options.selectedItem.id;
}
}
if (options.postFunction != null) {
//Disable onupdate event handler of input field
//because, postFunction can change the content of
//input field and get into eternal loop.
var onupdateHandler = $(options.inputField).onupdate;
$(options.inputField).onupdate = '';
options.postFunction(request);
//Enable onupdate event handler of input field
$(options.inputField).onupdate = onupdateHandler;
}
}
});
/**
* TOGGLE TAG
*/
AjaxJspTag.Toggle = Class.create();
AjaxJspTag.Toggle.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
// create message DIV
if (this.options.messageClass) {
this.messageContainer = new Insertion.Top($(this.options.source),
'<div id="'+ this.options.source +'_message" class="' + this.options.messageClass +'"></div>');
}
this.setListeners();
},
setOptions: function(options) {
this.options = Object.extend({
parameters: options.parameters || 'rating={ajaxParameter}',
parser: options.parser ? options.parser : new ResponseTextParser(),
handler: options.handler ? options.handler : this.handler
}, options || {});
this.ratingParameter = AJAX_DEFAULT_PARAMETER;
},
setListeners: function() {
// attach events to anchors
var elements = $(this.options.source).getElementsByTagName('a');
for (var j=0; j<elements.length; j++) {
elements[j].onmouseover = this.raterMouseOver.bindAsEventListener(this);
elements[j].onmouseout = this.raterMouseOut.bindAsEventListener(this);
elements[j].onclick = this.raterClick.bindAsEventListener(this);
}
},
getCurrentRating: function(list) {
var selectedIndex = -1;
for (var i=0; i<list.length; i++) {
if (Element.hasClassName(list[i], this.options.selectedClass)) {
selectedIndex = i;
}
}
return selectedIndex;
},
getCurrentIndex: function(list, elem) {
var currentIndex = 0;
for (var i=0; i<list.length; i++) {
if (elem == list[i]) {
currentIndex = i;
}
}
return currentIndex;
},
raterMouseOver: function (e) {
// get containing div
var container = Event.findElement(e, 'div');
// get list of all anchors
var elements = container.getElementsByTagName('a');
// find the current rating
var selectedIndex = this.getCurrentRating(elements);
// find the index of the 'hovered' element
var currentIndex = this.getCurrentIndex(elements, Event.element(e));
// set message
if (this.options.messageClass) {
$(container.id+'_message').innerHTML = Event.element(e).title;
}
// iterate over each anchor and apply styles
for (var i=0; i<elements.length; i++) {
if (selectedIndex > -1) {
if (i <= selectedIndex && i <= currentIndex)
Element.addClassName(elements[i], this.options.selectedOverClass);
else if (i <= selectedIndex && i > currentIndex)
Element.addClassName(elements[i], this.options.selectedLessClass);
else if (i > selectedIndex && i <= currentIndex)
Element.addClassName(elements[i], this.options.overClass);
} else {
if (i <= currentIndex) Element.addClassName(elements[i], this.options.overClass);
}
}
},
raterMouseOut: function (e) {
// get containing div
var container = Event.findElement(e, 'div');
// get list of all anchors
var elements = container.getElementsByTagName('a');
// clear message
if (this.options.messageClass) {
$(container.id+'_message').innerHTML = '';
}
// iterate over each anchor and apply styles
for (var i=0; i<elements.length; i++) {
Element.removeClassName(elements[i], this.options.selectedOverClass);
Element.removeClassName(elements[i], this.options.selectedLessClass);
Element.removeClassName(elements[i], this.options.overClass);
}
},
raterClick: function (e) {
// get containing div
var container = Event.findElement(e, 'div');
// get list of all anchors
var elements = container.getElementsByTagName('a');
// find the index of the 'hovered' element
var currentIndex = this.getCurrentIndex(elements, Event.element(e));
// update styles
for (var i=0; i<elements.length; i++) {
Element.removeClassName(elements[i], this.options.selectedOverClass);
Element.removeClassName(elements[i], this.options.selectedLessClass);
Element.removeClassName(elements[i], this.options.overClass);
if (i <= currentIndex) {
if (Element.hasClassName(container, 'onoff')
&& Element.hasClassName(elements[i], this.options.selectedClass)) {
Element.removeClassName(elements[i], this.options.selectedClass);
} else {
Element.addClassName(elements[i], this.options.selectedClass);
}
} else if (i > currentIndex) {
Element.removeClassName(elements[i], this.options.selectedClass);
}
}
// send AJAX
var ratingToSend = elements[currentIndex].title;
if (Element.hasClassName(container, 'onoff')) {
// send opposite of what was selected
var ratings = this.options.ratings.split(',');
if (ratings[0] == ratingToSend) ratingToSend = ratings[1];
else ratingToSend = ratings[0];
}
this.execute(ratingToSend);
// set field (if defined)
if (this.options.state) {
$(this.options.state).value = ratingToSend;
}
},
execute: function(ratingValue) {
if (this.options.preFunction != null) this.options.preFunction();
// parse parameters and do replacements
var ajaxParameters = this.options.parameters || '';
var re = new RegExp("(\\{"+this.ratingParameter+"\\})", 'g');
ajaxParameters = ajaxParameters.replace(re, ratingValue);
var params = buildParameterString(ajaxParameters);
var obj = this; // required because 'this' conflict with Ajax.Request
var toggleStateFunc = this.getToggleStateValue;
var aj = new Ajax.Request(this.url, {
asynchronous: true,
method: 'get',
evalScripts: true,
parameters: params,
onSuccess: function(request) {
obj.options.parser.load(request);
var results = obj.options.parser.itemList;
obj.options.handler(request, {items: results});
},
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
},
handler: function(request, options) {
// TODO: anything?
},
getToggleStateValue: function(name, results) {
for (var i=0; i<results.length; i++) {
if (results[i][0] == name) return results[i][1];
}
return "";
}
});
/**
* CALLOUT TAG
*/
AjaxJspTag.Callout = Class.create();
AjaxJspTag.Callout.prototype = Object.extend(new AjaxJspTag.Base(), {
initialize: function(url, options) {
this.url = url;
this.setOptions(options);
this.setListeners();
},
setOptions: function(options) {
this.options = Object.extend({
parameters: options.parameters || '',
overlib: options.overlib || AJAX_CALLOUT_OVERLIB_DEFAULT,
parser: options.parser ? options.parser : new ResponseXmlToHtmlParser(),
handler: options.handler ? options.handler : this.handler
}, options || {});
this.calloutParameter = AJAX_DEFAULT_PARAMETER;
},
setListeners: function() {
if (this.options.sourceClass) {
var elemList = document.getElementsByClassName(this.options.sourceClass);
for (var i=0; i<elemList.length; i++) {
elemList[i].onmouseover = this.calloutMouseover.bindAsEventListener(this);
elemList[i].onmouseout = this.calloutMouseout.bindAsEventListener(this);
}
}
},
calloutMouseover: function(e) {
this.execute(e);
},
calloutMouseout: function(e) {
nd();
},
execute: function(e) {
if (this.options.preFunction != null) this.options.preFunction();
// parse parameters and do replacements
var ajaxParameters = this.options.parameters || '';
var re = new RegExp("(\\{"+this.calloutParameter+"\\})", 'g');
var elem = Event.element(e);
if (elem.type) {
ajaxParameters = ajaxParameters.replace(re, $F(elem));
} else {
ajaxParameters = ajaxParameters.replace(re, elem.innerHTML);
}
var params = buildParameterString(ajaxParameters);
var obj = this; // required because 'this' conflict with Ajax.Request
var aj = new Ajax.Request(this.url, {
asynchronous: true,
method: 'get',
evalScripts: true,
parameters: params,
onSuccess: function(request) {
obj.options.parser.load(request);
obj.options.handler(obj.options.parser.content, {title: obj.options.title,
overlib: obj.options.overlib});
},
onFailure: function(request) {
if (obj.options.errorFunction != null) obj.options.errorFunction(request);
},
onComplete: function(request) {
if (obj.options.postFunction != null) obj.options.postFunction(request);
}
});
},
handler: function(content, options) {
if (options.overlib) {
if (options.title) {
return eval("overlib(content,CAPTION,options.title,"+options.overlib+")");
} else {
return eval("overlib(content,"+options.overlib+")");
}
} else {
if (options.title) {
return overlib(content,CAPTION,options.title);
} else {
return overlib(content);
}
}
}
});
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -