再战浏览器兼容 浏览器应用服务器IEXSLXML
程序员文章站
2022-07-16 09:13:19
...
- 也许你也喜欢用document.all.*的写法来取得一个页面元素的引用,那么这个习惯是很糟糕的,这个语法只有IE支持,火狐里面是不行的。两者都支持的方法是:document.getElementById(),如果你嫌这个方法输入太麻烦可以简化一下:var $=function (id){return document.getElementById(id);} 后面就可以这样写了$("div");这种简化偷师至Prototype
- 如果要取到页面元素的内容object.innerHTML是没有问题的,innerText在IE里通行,在火狐里面是textContent
-
也许你和我一样喜欢使用event.srcElement,但是在火狐里面是event.target,例如
<input id="Button2" type="button" value="Test" onclick="alert(event.target.id)" />
而且注意这里还有一个小问题,event必须作为参数传递进去;
下面的方法是不对的:function TestEvent()
{
alert(event.target.id);//这里火狐会提示event未定义
}
<input id="Button3" type="button" value="TestEvent" onclick="TestEvent(event)" />
正确的写法:
function TestEvent(event)
{
alert(event.target.id);
}
<input id="Button3" type="button" value="TestEvent" onclick="TestEvent(event)" />
-
对于事件源我们还是期望有一个统一的使用方法,这里我们可以通过funciton.caller来暗度陈仓:
functiongetEvent()
{
if(document.all)returnwindow.event;//ie
func=getEvent.caller;//这是该方法的关键
while(func!=null){
vararg0=func.arguments[0];
if(arg0){if((arg0.constructor==Event||arg0.constructor==MouseEvent)||(typeof(arg0)=="object"&&arg0.preventDefault&&arg0.stopPropagation)){returnarg0;}}
func=func.caller;
}
returnnull;
}
functiongetSrcElement()
{
varevt=getEvent();
varelement=evt.srcElement||evt.target;
returnelement;
}
functionTestCommonEvent()
{
varsrc=getSrcElement();//我们就可以使用这样一个统一的方式来获得事件源
alert(src.id);
}
-
使用.net类库我们这里使用可以很方便的引入System.Xml.Xsl等namespace来进行XSLT转换。代码简单
XslTransformxslt=newXslTransform();
xslt.Load("print_root.xsl");
XmlDocumentdoc=newXmlDocument();
doc.Load("library.xml");
//Createanewdocumentcontainingjusttheresulttreefragment.
XmlNodetestNode=doc.DocumentElement.FirstChild;
XmlDocumenttmpDoc=newXmlDocument();
tmpDoc.LoadXml(testNode.OuterXml);
//Passthedocumentcontainingtheresulttreefragment
//totheTransformmethod.
Console.WriteLine("Passing"+tmpDoc.OuterXml+"toprint_root.xsl");
xslt.Transform(tmpDoc,null,Console.Out,null);
数据是固定的只是转换一下样式,这种需求在Web应用中还是很常见的,我们知道这样大大减少了客户端与服务器端的往返次数和服务器端的计算压力。那么客户端有这个能力么?
MSDN上我们也找到了使用Javascript进行客户端XSLT转换的解决方案
varxslt=newActiveXObject("Msxml2.XSLTemplate.3.0");
varxslDoc=newActiveXObject("Msxml2.FreeThreadedDOMDocument.3.0");
varxslProc;
xslDoc.async=false;
xslDoc.load("createProcessor.xsl");
if(xslDoc.parseError.errorCode!=0){
varmyErr=xslDoc.parseError;
WScript.Echo("Youhaveerror"+myErr.reason);
}else{
xslt.stylesheet=xslDoc;
varxmlDoc=newActiveXObject("Msxml2.DOMDocument.3.0");
xmlDoc.async=false;
xmlDoc.load("books.xml");
if(xmlDoc.parseError.errorCode!=0){
varmyErr=xmlDoc.parseError;
WScript.Echo("Youhaveerror"+myErr.reason);
}else{
xslProc=xslt.createProcessor();
xslProc.input=xmlDoc;
xslProc.addParameter("param1","Hello");
xslProc.transform();
document.getElementById("outputdiv").innerHTML=xslProc.output;
}
}
找到解决方案我们并没有开心多久,你知道浏览器兼容是每一个
web开发者的隐忧,显然上面的解决方案太微软太IE了。我们需要冷静一下,我们的目标是要兼容Firefox。W3C DOM将document.implementation属性作为使脚本找出当前环境实现了哪些DOM模块的一个途径。最后的解决方案是这个样子:
1functionXsltTransform(xslfile)
2
3{
4
5if(typeof(window.ActiveXObject)!='undefined')
6
7{
8
9//ie
10
11try
12
13{
14
15varxmlDoc=newActiveXObject("Msxml2.DOMDocument.3.0");
16
17varxslDoc=newActiveXObject("Msxml2.FreeThreadedDOMDocument");
18
19xmlDoc.async=false;
20
21xslDoc.async=false;
22
23xmlDoc.loadXML(document.getElementById("xmlContent").value.replace(/\r\n/gi,""));
24
25xslDoc.load(xslfile);
26
27
28
29varoTemplate=newActiveXObject("Msxml2.XSLTemplate");
30
31oTemplate.stylesheet=xslDoc;
32
33varoProcessor=oTemplate.createProcessor();
34
35oProcessor.input=xmlDoc.documentElement;
36
37
38
39oProcessor.addParameter("parameter",'<%=count%>');
40
41oProcessor.transform();
42
43
44
45document.getElementById('div').innerHTML=oProcessor.output;
46
47
48
49}catch(e){
50
51
52
53}
54
55}
56
57elseif(document.implementation&&document.implementation.createDocument)
58
59{
60
61//ff
62
63try
64
65{
66
67varparser=newDOMParser();
68
69varxmlDoc;
70
71if(document.getElementById("xmlContent").value=="")
72
73xmlDoc=parser.parseFromString(text,"text/xml");
74
75else
76
77xmlDoc=parser.parseFromString(document.getElementById("xmlContent").value.replace(/\r\n/gi,""),"text/xml");
78
79
80
81xmlDoc.async=false;
82
83
84
85varxslDoc=document.implementation.createDocument("","",null);
86
87xslDoc.async=false;
88
89xslDoc.load(xslfile);
90
91
92
93//定义XSLTProcessor对象
94
95varxsltProcessor=newXSLTProcessor();
96
97xsltProcessor.importStylesheet(xslDoc);
98
99xsltProcessor.setParameter(null,"parameter",'<%=count%>');
100
101//transformToDocument方式
102
103varresult=xsltProcessor.transformToDocument(xmlDoc);
104
105document.getElementById('div').innerHTML=result.documentElement.textContent;
106
107}catch(e){
108
109}
110
111}
112
113}
114
115
116
2
3{
4
5if(typeof(window.ActiveXObject)!='undefined')
6
7{
8
9//ie
10
11try
12
13{
14
15varxmlDoc=newActiveXObject("Msxml2.DOMDocument.3.0");
16
17varxslDoc=newActiveXObject("Msxml2.FreeThreadedDOMDocument");
18
19xmlDoc.async=false;
20
21xslDoc.async=false;
22
23xmlDoc.loadXML(document.getElementById("xmlContent").value.replace(/\r\n/gi,""));
24
25xslDoc.load(xslfile);
26
27
28
29varoTemplate=newActiveXObject("Msxml2.XSLTemplate");
30
31oTemplate.stylesheet=xslDoc;
32
33varoProcessor=oTemplate.createProcessor();
34
35oProcessor.input=xmlDoc.documentElement;
36
37
38
39oProcessor.addParameter("parameter",'<%=count%>');
40
41oProcessor.transform();
42
43
44
45document.getElementById('div').innerHTML=oProcessor.output;
46
47
48
49}catch(e){
50
51
52
53}
54
55}
56
57elseif(document.implementation&&document.implementation.createDocument)
58
59{
60
61//ff
62
63try
64
65{
66
67varparser=newDOMParser();
68
69varxmlDoc;
70
71if(document.getElementById("xmlContent").value=="")
72
73xmlDoc=parser.parseFromString(text,"text/xml");
74
75else
76
77xmlDoc=parser.parseFromString(document.getElementById("xmlContent").value.replace(/\r\n/gi,""),"text/xml");
78
79
80
81xmlDoc.async=false;
82
83
84
85varxslDoc=document.implementation.createDocument("","",null);
86
87xslDoc.async=false;
88
89xslDoc.load(xslfile);
90
91
92
93//定义XSLTProcessor对象
94
95varxsltProcessor=newXSLTProcessor();
96
97xsltProcessor.importStylesheet(xslDoc);
98
99xsltProcessor.setParameter(null,"parameter",'<%=count%>');
100
101//transformToDocument方式
102
103varresult=xsltProcessor.transformToDocument(xmlDoc);
104
105document.getElementById('div').innerHTML=result.documentElement.textContent;
106
107}catch(e){
108
109}
110
111}
112
113}
114
115
116