📄 zapatecutils.js
字号:
};
/**
* The reverse of Zapatec.Utils.makePref(), this function unserializes the
* given string and creates an object from it.
*
* @param txt [string] the serialized value.
* @return [Object] a new object if it was created successfully or null otherwise.
*/
Zapatec.Utils.loadPref = function(txt) {
var obj = null;
try {
eval("obj={" + txt + "}");
} catch(e) {}
return obj;
};
/**
* Merges the values of the source object into the destination object.
*
* @param dest [Object] the destination object.
* @param src [Object] the source object.
*/
Zapatec.Utils.mergeObjects = function(dest, src) {
for (var i in src)
dest[i] = src[i];
};
// based on the WCH idea
// http://www.aplus.co.yu/WCH/code3/WCH.js
/// \defgroup WCH functions
//@{
Zapatec.Utils.__wch_id = 0; /**< [number, static] used to create ID-s for the WCH objects */
/**
* Create an WCH object. This function does nothing if the browser is not
* IE5.5 or IE6.0. A WCH object is one of the most bizarre tricks to avoid a
* notorious IE bug: IE normally shows "windowed controls" on top of any HTML
* elements, regardless of any z-index that might be specified in CSS. This
* technique is described at: http://www.aplus.co.yu/WCH/
*
* A "WCH object" is actually an HTMLIFrame element having a certain "CSS
* filter" (proprietary MSIE extension) that forces opacity zero. This object,
* displayed on top of a windowed control such as a select box, will completely
* hide the select box, allowing us to place other HTMLElement objects above.
*
* WCH stands for "Windowed Controls Hider".
*
* @return [HTMLIFrame or null] a new WCH object if the browser is "supported", null otherwise.
*/
Zapatec.Utils.createWCH = function() {
var f = null;
if (Zapatec.is_ie && !Zapatec.is_ie5) {
var filter = 'filter:progid:DXImageTransform.Microsoft.alpha(style=0,opacity=0);';
var id = "WCH" + (++Zapatec.Utils.__wch_id);
window.self.document.body.insertAdjacentHTML
('beforeEnd', '<iframe id="' + id + '" scroll="no" frameborder="0" ' +
'style="z-index:0;position:absolute;visibility:hidden;' + filter +
'border:0;top:0;left:0;width:0;height:0;" ' +
'src="javascript:false;"></iframe>');
f = window.self.document.getElementById(id);
}
return f;
};
/**
* Configure a given WCH object to be displayed on top of the given element.
* Optionally, a second element can be passed, and in this case it will setup
* the WCH object to cover both elements.
*
* @param f [HTMLIFrame] the WCH object
* @param el [HTMLElement] the element to cover.
* @param el2 [HTMLElement, optional] another element to cover.
*/
Zapatec.Utils.setupWCH_el = function(f, el, el2) {
if (f) {
var pos = Zapatec.Utils.getAbsolutePos(el),
X1 = pos.x,
Y1 = pos.y,
X2 = X1 + el.offsetWidth,
Y2 = Y1 + el.offsetHeight;
if (el2) {
var p2 = Zapatec.Utils.getAbsolutePos(el2),
XX1 = p2.x,
YY1 = p2.y,
XX2 = XX1 + el2.offsetWidth,
YY2 = YY1 + el2.offsetHeight;
if (X1 > XX1)
X1 = XX1;
if (Y1 > YY1)
Y1 = YY1;
if (X2 < XX2)
X2 = XX2;
if (Y2 < YY2)
Y2 = YY2;
}
Zapatec.Utils.setupWCH(f, X1, Y1, X2-X1, Y2-Y1);
}
};
/**
* Configure a WCH object to cover a certain part of the screen.
*
* @param f [HTMLIFrame] the WCH object.
* @param x [number] the X coordinate.
* @param y [number] the Y coordinate.
* @param w [number] the width of the area.
* @param h [number] the height of the area.
*/
Zapatec.Utils.setupWCH = function(f, x, y, w, h) {
if (f) {
var s = f.style;
(typeof x != "undefined") && (s.left = x + "px");
(typeof y != "undefined") && (s.top = y + "px");
(typeof w != "undefined") && (s.width = w + "px");
(typeof h != "undefined") && (s.height = h + "px");
s.visibility = "visible";
}
};
/**
* Hide a WCH object.
*
* @param f [HTMLIFrame] object to hide.
*/
Zapatec.Utils.hideWCH = function(f) {
if (f)
f.style.visibility = "hidden";
};
//@}
/**
* Destroys the given element (remove it from the DOM tree) if it's not null
* and it's parent is not null.
*
* @param el [HTMLElement] the element to destroy.
*/
Zapatec.Utils.destroy = function(el) {
if (el && el.parentNode)
el.parentNode.removeChild(el);
};
/**
* Opens a new window at a certain URL and having some properties.
*
* @param url [string] the URL to open a new window to.
* @param windowName [string] the name of the new window (as for target attribute).
* @param width [number] the width of the new window in pixels.
* @param height [number] the height of the new window in pixels.
* @param scrollbars [string] "yes" or "no" for scrollbars.
*
* @return [object] the new window
*/
Zapatec.Utils.newCenteredWindow = function(url, windowName, width, height, scrollbars){
var leftPosition = 0;
var topPosition = 0;
if (screen.width)
leftPosition = (screen.width - width)/2;
if (screen.height)
topPosition = (screen.height - height)/2;
var winArgs =
'height=' + height +
',width=' + width +
',top=' + topPosition +
',left=' + leftPosition +
',scrollbars=' + scrollbars +
',resizable';
var win = window.open(url,windowName,winArgs);
return win;
};
/**
* Given a reference to a select element, this function will select the option
* having the given value and optionally will call the default handler for
* "onchange".
*
* @param sel [HTMLSelectElement] reference to the SELECT element.
* @param val [string] the value that we should select.
* @param call_default [boolean] true if the default onchange should be called.
*/
Zapatec.Utils.selectOption = function(sel, val, call_default) {
var a = sel.options, i, o;
for (i = a.length; --i >= 0;) {
o = a[i];
o.selected = (o.val == val);
}
sel.value = val;
if (call_default) {
if (typeof sel.onchange == "function")
sel.onchange();
else if (typeof sel.onchange == "string")
eval(sel.onchange);
}
};
/**
* A more flexible way to get the "nextSibling" of a given element. If the
* "tag" argument is passed, then this function will return the next sibling
* that has a certain tag. Otherwise it will simply return el.nextSibling.
*
* @param el [HTMLElement] reference to the anchor element.
* @param tag [string] the tag name of the returned node.
*
* @return [HTMLElement or null] el.nextSibling if tag is not passed, or the
* first element after el having the specified tag. Null is returned if no
* element could be found.
*/
Zapatec.Utils.getNextSibling = function(el, tag) {
el = el.nextSibling;
if (!tag)
return el;
tag = tag.toLowerCase();
while (el && (el.nodeType != 1 || el.tagName.toLowerCase() != tag))
el = el.nextSibling;
return el;
};
/**
* Similar to Zapatec.Utils.getNextSibling(), this function will return the
* first child of the given element that has a specified tag.
*
* @param el [HTMLElement] reference to the anchor element.
* @param tag [string] the tag name of the returned node.
*
* @return [HTMLElement] reference to the found node, or null if none could be
* found.
*/
Zapatec.Utils.getFirstChild = function(el, tag) {
el = el.firstChild;
if (!tag)
return el;
tag = tag.toLowerCase();
if (el.nodeType == 1 && el.tagName.toLowerCase() == tag)
return el;
return Zapatec.Utils.getNextSibling(el, tag);
};
Zapatec.Utils._ids = {}; /**< [number, static] maintains a list of generated IDs */
/**
* Generates an unique ID, for a certain code (let's say "class"). If the
* optional "id" argument is passed, then it just returns the id for that code
* (no generation). This function is sometimes useful when we need to create
* elements and be able to access them later by ID.
*
* @param code [string] the class of ids. User defined, can be anything.
* @param id [string, optional] specify if the ID is already known.
*
* @return [string] the unique ID
*/
Zapatec.Utils.generateID = function(code, id) {
if (typeof id == "undefined") {
if (typeof this._ids[code] == "undefined")
this._ids[code] = 0;
id = ++this._ids[code];
}
return "zapatec-" + code + "-" + id;
};
/**
* Add a tooltip to the specified element.
*
* Function that adds a custom tooltip for an element. The "target" is the
* element to where the tooltip should be added to, and the "tooltip" is a DIV
* that contains the tooltip text. Optionally, the tooltip DIV can have the
* "title" attribute set; if so, its value will be displayed highlighted as
* the title of the tooltip.
*
* @param target reference to or ID of the target element
* @param tooltip reference to or ID of the tooltip content element
*/
Zapatec.Utils.addTooltip = function(target, tooltip) {
return new Zapatec.Tooltip(target, tooltip);
};
// Browser sniffing
/// detect Opera browser
Zapatec.is_opera = /opera/i.test(navigator.userAgent);
/// detect a special case of "web browser"
Zapatec.is_ie = ( /msie/i.test(navigator.userAgent) && !Zapatec.is_opera );
/// detect IE5.0/Win
Zapatec.is_ie5 = ( Zapatec.is_ie && /msie 5\.0/i.test(navigator.userAgent) );
/// detect IE for Macintosh
Zapatec.is_mac_ie = ( /msie.*mac/i.test(navigator.userAgent) && !Zapatec.is_opera );
/// detect KHTML-based browsers
Zapatec.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
/// detect Konqueror
Zapatec.is_konqueror = /Konqueror/i.test(navigator.userAgent);
/// detect Gecko
Zapatec.is_gecko = /Gecko/i.test(navigator.userAgent);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -