再战浏览器兼容

  1. 也许你也喜欢用document.all.*的写法来取得一个页面元素的引用,那么这个习惯是很糟糕的,这个语法只有IE支持,火狐里面是不行的。两者都支持的方法是:document.getElementById(),如果你嫌这个方法输入太麻烦可以简化一下:var $=function (id){return document.getElementById(id);} 后面就可以这样写了$("div");这种简化偷师至Prototype
  2. 如果要取到页面元素的内容object.innerHTML是没有问题的,innerTextIE里通行,在火狐里面是textContent
  3. 也许你和我一样喜欢使用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)" />

  4. 对于事件源我们还是期望有一个统一的使用方法,这里我们可以通过funciton.caller来暗度陈仓:
    None.gif function getEvent()
    None.gif
    ExpandedBlockStart.gifContractedBlock.gif
    dot.gif {
    InBlock.gif
    InBlock.gif
    if(document.all)returnwindow.event;//ie
    InBlock.gif

    InBlock.giffunc
    =getEvent.caller;//这是该方法的关键
    InBlock.gif

    ExpandedSubBlockStart.gifContractedSubBlock.gif
    while(func!=null)dot.gif{
    InBlock.gif
    InBlock.gif
    vararg0=func.arguments[0];
    InBlock.gif
    ExpandedSubBlockStart.gifContractedSubBlock.gif
    if(arg0)dot.gif{if((arg0.constructor==Event||arg0.constructor==MouseEvent)||(typeof(arg0)=="object"&&arg0.preventDefault&&arg0.stopPropagation))dot.gif{returnarg0;}}
    InBlock.gif
    InBlock.giffunc
    =func.caller;
    InBlock.gif
    ExpandedSubBlockEnd.gif}

    InBlock.gif
    InBlock.gif
    returnnull;
    InBlock.gif
    ExpandedBlockEnd.gif}

    None.gif
    None.gif
    function getSrcElement()
    None.gif
    ExpandedBlockStart.gifContractedBlock.gif
    dot.gif {
    InBlock.gif
    InBlock.gif
    varevt=getEvent();
    InBlock.gif
    InBlock.gif
    varelement=evt.srcElement||evt.target;
    InBlock.gif
    InBlock.gif
    returnelement;
    InBlock.gif
    ExpandedBlockEnd.gif}

    None.gif
    None.gif
    function TestCommonEvent()
    None.gif
    ExpandedBlockStart.gifContractedBlock.gif
    dot.gif {
    InBlock.gif
    InBlock.gif
    varsrc=getSrcElement();//我们就可以使用这样一个统一的方式来获得事件源
    InBlock.gif

    InBlock.gifalert(src.id);
    InBlock.gif
    ExpandedBlockEnd.gif}

    None.gif
    None.gif

  5. 使用.net类库我们这里使用可以很方便的引入System.Xml.Xslnamespace来进行XSLT转换。代码简单
    None.gif XslTransformxslt = new XslTransform();
    None.gifxslt.Load(
    " print_root.xsl " );
    None.gifXmlDocumentdoc
    = new XmlDocument();
    None.gifdoc.Load(
    " library.xml " );
    None.gif
    // Createanewdocumentcontainingjusttheresulttreefragment.
    None.gif
    XmlNodetestNode = doc.DocumentElement.FirstChild;
    None.gifXmlDocumenttmpDoc
    = new XmlDocument();
    None.giftmpDoc.LoadXml(testNode.OuterXml);
    None.gif
    // Passthedocumentcontainingtheresulttreefragment
    None.gif
    // totheTransformmethod.
    None.gif
    Console.WriteLine( " Passing " + tmpDoc.OuterXml + " toprint_root.xsl " );
    None.gifxslt.Transform(tmpDoc,
    null ,Console.Out, null );
    None.gif
    None.gif

    数据是固定的只是转换一下样式,这种需求在Web应用中还是很常见的,我们知道这样大大减少了客户端与服务器端的往返次数和服务器端的计算压力。那么客户端有这个能力么?

    MSDN上我们也找到了使用Javascript进行客户端XSLT转换的解决方案

    None.gif var xslt = new ActiveXObject( " Msxml2.XSLTemplate.3.0 " );
    None.gif
    var xslDoc = new ActiveXObject( " Msxml2.FreeThreadedDOMDocument.3.0 " );
    None.gif
    var xslProc;
    None.gifxslDoc.async
    = false ;
    None.gifxslDoc.load(
    " createProcessor.xsl " );
    ExpandedBlockStart.gifContractedBlock.gif
    if (xslDoc.parseError.errorCode != 0 ) dot.gif {
    InBlock.gif
    varmyErr=xslDoc.parseError;
    InBlock.gifWScript.Echo(
    "Youhaveerror"+myErr.reason);
    ExpandedBlockStart.gifContractedBlock.gif}
    else dot.gif {
    InBlock.gifxslt.stylesheet
    =xslDoc;
    InBlock.gif
    varxmlDoc=newActiveXObject("Msxml2.DOMDocument.3.0");
    InBlock.gifxmlDoc.async
    =false;
    InBlock.gifxmlDoc.load(
    "books.xml");
    ExpandedSubBlockStart.gifContractedSubBlock.gif
    if(xmlDoc.parseError.errorCode!=0)dot.gif{
    InBlock.gif
    varmyErr=xmlDoc.parseError;
    InBlock.gifWScript.Echo(
    "Youhaveerror"+myErr.reason);
    ExpandedSubBlockStart.gifContractedSubBlock.gif}
    elsedot.gif{
    InBlock.gifxslProc
    =xslt.createProcessor();
    InBlock.gifxslProc.input
    =xmlDoc;
    InBlock.gifxslProc.addParameter(
    "param1","Hello");
    InBlock.gifxslProc.transform();
    InBlock.gifdocument.getElementById(
    "outputdiv").innerHTML=xslProc.output;
    ExpandedSubBlockEnd.gif}

    ExpandedBlockEnd.gif}

    None.gif

    找到解决方案我们并没有开心多久,你知道浏览器兼容是每一个

    web开发者的隐忧,显然上面的解决方案太微软太IE了。我们需要冷静一下,我们的目标是要兼容Firefox

    W3C DOMdocument.implementation属性作为使脚本找出当前环境实现了哪些DOM模块的一个途径。最后的解决方案是这个样子:


1 function XsltTransform(xslfile)
2
3 {
4
5 if ( typeof (window.ActiveXObject) != ' undefined ' )
6
7 {
8
9 // ie
10
11 try
12
13 {
14
15 var xmlDoc = new ActiveXObject( " Msxml2.DOMDocument.3.0 " );
16
17 var xslDoc = new ActiveXObject( " Msxml2.FreeThreadedDOMDocument " );
18
19 xmlDoc.async = false ;
20
21 xslDoc.async = false ;
22
23 xmlDoc.loadXML(document.getElementById( " xmlContent " ).value.replace( / \r\n / gi, "" ));
24
25 xslDoc.load(xslfile);
26
27
28
29 var oTemplate = new ActiveXObject( " Msxml2.XSLTemplate " );
30
31 oTemplate.stylesheet = xslDoc;
32
33 var oProcessor = oTemplate.createProcessor();
34
35 oProcessor.input = xmlDoc.documentElement;
36
37
38
39 oProcessor.addParameter( " parameter " , ' <%=count%> ' );
40
41 oProcessor.transform();
42
43
44
45 document.getElementById( ' div ' ).innerHTML = oProcessor.output;
46
47
48
49 } catch (e){
50
51
52
53 }
54
55 }
56
57 else if (document.implementation && document.implementation.createDocument)
58
59 {
60
61 // ff
62
63 try
64
65 {
66
67 var parser = new DOMParser();
68
69 var xmlDoc;
70
71 if (document.getElementById( " xmlContent " ).value == "" )
72
73 xmlDoc = parser.parseFromString(text, " text/xml " );
74
75 else
76
77 xmlDoc = parser.parseFromString(document.getElementById( " xmlContent " ).value.replace( / \r\n / gi, "" ), " text/xml " );
78
79
80
81 xmlDoc.async = false ;
82
83
84
85 var xslDoc = document.implementation.createDocument( "" , "" , null );
86
87 xslDoc.async = false ;
88
89 xslDoc.load(xslfile);
90
91
92
93 // 定义XSLTProcessor对象
94
95 var xsltProcessor = new XSLTProcessor();
96
97 xsltProcessor.importStylesheet(xslDoc);
98
99 xsltProcessor.setParameter( null , " parameter " , ' <%=count%> ' );
100
101 // transformToDocument方式
102
103 var result = xsltProcessor.transformToDocument(xmlDoc);
104
105 document.getElementById( ' div ' ).innerHTML = result.documentElement.textContent;
106
107 } catch (e){
108
109 }
110
111 }
112
113 }
114
115 jet
116
坚强2002和你一起回头再说...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值