In IECN, we can see that Xinyun's JS about interchange select is invalid in Firefox because removeNode and swapNode are used. Google just found that you can use a custom prototype to correct valid attributes and methods in IE.
Reference: http://www.phpx.com/happy/top97619.html
The modification scheme is as follows:
<Script language = "javascript" type = "text/javascript">
<! --
If (window. Event) {// corrected the DOM of the Event
/*
IE5 MacIE5 Mozilla Konqueror2.2 Opera5
Event yes
Event. returnValue yes no
Event. cancelBubble yes no
Event. srcElement yes no
Event. fromElement yes no
*/
Event. prototype. _ defineSetter _ ("returnValue", function (B ){//
If (! B) this. preventDefault ();
Return B;
});
Event. prototype. _ defineSetter _ ("cancelBubble", function (B) {// sets or retrieves the layer bubbles of the current Event handle
If (B) this. stopPropagation ();
Return B;
});
Event. prototype. _ defineGetter _ ("srcElement", function (){
Var node‑this.tar get;
While (node. nodeType! = 1) node = node. parentNode;
Return node;
});
Event. prototype. _ defineGetter _ ("fromElement", function () {// return the source node removed from the mouse
Var node;
If (this. type = "mouseover ")
Node = this. relatedTarget;
Else if (this. type = "mouseout ")
Node‑this.tar get;
If (! Node) return;
While (node. nodeType! = 1) node = node. parentNode;
Return node;
});
Event. prototype. _ defineGetter _ ("toElement", function () {// return the source node to which the cursor is moved
Var node;
If (this. type = "mouseout ")
Node = this. relatedTarget;
Else if (this. type = "mouseover ")
Node‑this.tar get;
If (! Node) return;
While (node. nodeType! = 1) node = node. parentNode;
Return node;
});
Event. prototype. _ defineGetter _ ("offsetX", function (){
Return this. layerX;
});
Event. prototype. _ defineGetter _ ("offsetY", function (){
Return this. layerY;
});
}
If (window. Document) {// modify the DOM of the Document
/*
IE5 MacIE5 Mozilla Konqueror2.2 Opera5
Document.doc umentElement yes no
Document. activeElement yes null no
*/
}
If (window. Node) {// corrected Node DOM
/*
IE5 MacIE5 Mozilla Konqueror2.2 Opera5
Node. contains yes no yes
Node. replaceNode yes no
Node. removeNode yes no
Node. children yes no
Node. hasChildNodes yes no
Node. childNodes yes no
Node. swapNode yes no
Node. currentStyle yes no
*/
Node. prototype. replaceNode = function (Node) {// Replace the specified Node
This. parentNode. replaceChild (Node, this );
}
Node. prototype. removeNode = function (removeChildren) {// delete a specified Node
If (removeChildren)
Return this. parentNode. removeChild (this );
Else {
Var range = document. createRange ();
Range. selectNodeContents (this );
Return this. parentNode. replaceChild (range. extractContents (), this );
}
}
Node. prototype. swapNode = function (Node) {// exchange Node
Var nextSibling = this. nextSibling;
Var parentNode = this. parentNode;
Node. parentNode. replaceChild (this, Node );
ParentNode. insertBefore (node, nextSibling );
}
}
If (window. HTMLElement ){
HTMLElement. prototype. _ defineGetter _ ("all", function (){
Var a = this. getElementsByTagName ("*");
Var node = this;
A. tags = function (sTagName ){
Return node. getElementsByTagName (sTagName );
}
Return;
});
HTMLElement. prototype. _ defineGetter _ ("parentElement", function (){
If (this. parentNode = this. ownerDocument) return null;
Return this. parentNode;
});
HTMLElement. prototype. _ defineGetter _ ("children", function (){
Var tmp = [];
Var j = 0;
Var n;
For (var I = 0; I <this. childNodes. length; I ++ ){
N = this. childNodes [I];
If (n. nodeType = 1 ){
Tmp [j ++] = n;
If (n. name ){
If (! Tmp [n. name])
Tmp [n. name] = [];
Tmp [n. name] [tmp [n. name]. length] = n;
}
If (n. id)
Tmp [n. id] = n;
}
}
Return tmp;
});
HTMLElement. prototype. _ defineGetter _ ("currentStyle", function (){
Return this. ownerDocument. defaultView. getComputedStyle (this, null );
});
HTMLElement. prototype. _ defineSetter _ ("outerHTML", function (sHTML ){
Var r = this. ownerDocument. createRange ();
R. setStartBefore (this );
Var df = r. createContextualFragment (sHTML );
This. parentNode. replaceChild (df, this );
Return sHTML;
});
HTMLElement. prototype. _ defineGetter _ ("outerHTML", function (){
Var attr;
Var attrs = this. attributes;
Var str = "<" + this. tagName;
For (var I = 0; I <attrs. length; I ++ ){
Attr = attrs [I];
If (attr. specified)
Str + = "" + attr. name + '= "' + attr. value + '"';
}
If (! This. canHaveChildren)
Return str + "> ";
Return str + ">" + this. innerHTML + "</" + this. tagName + "> ";
});
HTMLElement. prototype. _ defineGetter _ ("canHaveChildren", function (){
Switch (this. tagName. toLowerCase ()){
Case "area ":
Case "base ":
Case "basefont ":
Case "col ":
Case "frame ":
Case "hr ":
Case "img ":
Case "br ":
Case "input ":
Case "isindex ":
Case "link ":
Case "meta ":
Case "param ":
Return false;
}
Return true;
});
HTMLElement. prototype. _ defineSetter _ ("innerText", function (sText ){
Var parsedText = document. createTextNode (sText );
This. innerHTML = parsedText;
Return parsedText;
});
HTMLElement. prototype. _ defineGetter _ ("innerText", function (){
Var r = this. ownerDocument. createRange ();
R. selectNodeContents (this );
Return r. toString ();
});
HTMLElement. prototype. _ defineSetter _ ("outerText", function (sText ){
Var parsedText = document. createTextNode (sText );
This. outerHTML = parsedText;
Return parsedText;
});
HTMLElement. prototype. _ defineGetter _ ("outerText", function (){
Var r = this. ownerDocument. createRange ();
R. selectNodeContents (this );
Return r. toString ();
});
HTMLElement. prototype. attachEvent = function (sType, fHandler ){
Var polictypename = sType. replace (/on /,"");
FHandler. _ ieEmuEventHandler = function (e ){
Window. event = e;
Return fHandler ();
}
This. addEventListener (optional typename, fHandler. _ ieEmuEventHandler, false );
}
HTMLElement. prototype. detachEvent = function (sType, fHandler ){
Var polictypename = sType. replace (/on /,"");
If (typeof (fHandler. _ ieEmuEventHandler) = "function ")
This. removeEventListener (optional typename, fHandler. _ ieEmuEventHandler, false );
Else
This. removeEventListener (polictypename, fHandler, true );
}
HTMLElement. prototype. contains = function (Node) {// whether a Node is included
Do if (Node = this) return true;
While (Node = Node. parentNode );
Return false;
}
HTMLElement. prototype. insertAdjacentElement = function (where, parsedNode ){
Switch (where ){
Case "beforeBegin ":
This. parentNode. insertBefore (parsedNode, this );
Break;
Case "afterBegin ":
This. insertBefore (parsedNode, this. firstChild );
Break;
Case "beforeEnd ":
This. appendChild (parsedNode );
Break;
Case "afterEnd ":
If (this. nextSibling)
This. parentNode. insertBefore (parsedNode, this. nextSibling );
Else
This. parentNode. appendChild (parsedNode );
Break;
}
}
HTMLElement. prototype. insertAdjacentHTML = function (where, htmlStr ){
Var r = this. ownerDocument. createRange ();
R. setStartBefore (this );
Var parsedHTML = r. createContextualFragment (htmlStr );
This. insertAdjacentElement (where, parsedHTML );
}
HTMLElement. prototype. insertAdjacentText = function (where, txtStr ){
Var parsedText = document. createTextNode (txtStr );
This. insertAdjacentElement (where, parsedText );
}
HTMLElement. prototype. attachEvent = function (sType, fHandler ){
Var polictypename = sType. replace (/on /,"");
FHandler. _ ieEmuEventHandler = function (e ){
Window. event = e;
Return fHandler ();
}
This. addEventListener (optional typename, fHandler. _ ieEmuEventHandler, false );
}
HTMLElement. prototype. detachEvent = function (sType, fHandler ){
Var polictypename = sType. replace (/on /,"");
If (typeof (fHandler. _ ieEmuEventHandler) = "function ")
This. removeEventListener (optional typename, fHandler. _ ieEmuEventHandler, false );
Else
This. removeEventListener (polictypename, fHandler, true );
}
}
// -->
</Script>