• 以下以 IE 代替 Internet Explorer,以 MF 代替 Mozzila Firefox

    1. document.form.item 问题
    (1)现有问题:
    现有代码中存在许多 document.formName.item("itemName") 这样的语句,不能在 MF 下运行
    (2)解决方法:
    改用 document.formName.elements["elementName"]
    (3)其它
    参见 2

    2. 集合类对象问题
    (1)现有问题:
    现有代码中许多集合类对象取用时使用 (),IE 能接受,MF 不能。
    (2)解决方法:
    改用 [] 作为下标运算。如:document.forms("formName") 改为 document.forms["formName"]。
    又如:document.getElementsByName("inputName")(1) 改为 document.getElementsByName("inputName")[1]
    (3)其它

    3. window.event
    (1)现有问题:
    使用 window.event 无法在 MF 上运行
    (2)解决方法:
    MF 的 event 只能在事件发生的现场使用,此问题暂无法解决。可以这样变通:
    原代码(可在IE中运行):
    <input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit()"/>
    ...
    <script language="javascript">
    function gotoSubmit() {
    ...
    alert(window.event); // use window.event
    ...
    }
    </script>

    新代码(可在IE和MF中运行):
    <input type="button" name="someButton" value="提交" onclick="javascript:gotoSubmit(event)"/>
    ...
    <script language="javascript">
    function gotoSubmit(evt) {
    evt = evt ? evt : (window.event ? window.event : null);
    ...
    alert(evt); // use evt
    ...
    }
    </script>
    此外,如果新代码中第一行不改,与老代码一样的话(即 gotoSubmit 调用没有给参数),则仍然只能在IE中运行,但不会出错。所以,这种方案 tpl 部分仍与老代码兼容。

    4. HTML 对象的 id 作为对象名的问题
    (1)现有问题
    在 IE 中,HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 MF 中不能。
    (2)解决方法
    用 getElementById("idName") 代替 idName 作为对象变量使用。

    5. 用idName字符串取得对象的问题
    (1)现有问题
    在IE中,利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象,在MF 中不能。
    (2)解决方法
    用 getElementById(idName) 代替 eval(idName)。

    6. 变量名与某 HTML 对象 id 相同的问题
    (1)现有问题
    在 MF 中,因为对象 id 不作为 HTML 对象的名称,所以可以使用与 HTML 对象 id 相同的变量名,IE 中不能。
    (2)解决方法
    在声明变量时,一律加上 var ,以避免歧义,这样在 IE 中亦可正常运行。
    此外,最好不要取与 HTML 对象 id 相同的变量名,以减少错误。
    (3)其它
    参见 问题4

    7. event.x 与 event.y 问题
    (1)现有问题
    在IE 中,event 对象有 x, y 属性,MF中没有。
    (2)解决方法
    在MF中,与event.x 等效的是 event.pageX。但event.pageX IE中没有。
    故采用 event.clientX 代替 event.x。在IE 中也有这个变量。
    event.clientX 与 event.pageX 有微妙的差别(当整个页面有滚动条的时候),不过大多数时候是等效的。

    如果要完全一样,可以稍麻烦些:
    mX = event.x ? event.x : event.pageX;
    然后用 mX 代替 event.x
    (3)其它
    event.layerX 在 IE 与 MF 中都有,具体意义有无差别尚未试验。


    8. 关于frame
    (1)现有问题
    在 IE中 可以用window.testFrame取得该frame,mf中不行
    (2)解决方法
    在frame的使用方面mf和ie的最主要的区别是:
    如果在frame标签中书写了以下属性:
    <frame src="xx.htm" id="frameId" name="frameName" />
    那么ie可以通过id或者name访问这个frame对应的window对象
    而mf只可以通过name来访问这个frame对应的window对象
    例如如果上述frame标签写在最上层的window里面的htm里面,那么可以这样访问
    ie: window.top.frameId或者window.top.frameName来访问这个window对象
    mf: 只能这样window.top.frameName来访问这个window对象

    另外,在mf和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签
    并且可以通过window.top.document.getElementById("testFrame").src = ’xx.htm’来切换frame的内容
    也都可以通过window.top.frameName.location = ’xx.htm’来切换frame的内容
    关于frame和window的描述可以参见bbs的‘window与frame’文章
    以及/test/js/test_frame/目录下面的测试
    ----adun 2004.12.09修改

    9. 在mf中,自己定义的属性必须getAttribute()取得
    10.在mf中没有 parentElement parement.children 而用
    parentNode parentNode.childNodes
    childNodes的下标的含义在IE和MF中不同,MF使用DOM规范,childNodes中会插入空白文本节点。
    一般可以通过node.getElementsByTagName()来回避这个问题。
    当html中节点缺失时,IE和MF对parentNode的解释不同,例如
    <form>
    <table>
    <input/>
    </table>
    </form>
    MF中input.parentNode的值为form, 而IE中input.parentNode的值为空节点

    MF中节点没有removeNode方法,必须使用如下方法 node.parentNode.removeChild(node)

    11.const 问题
    (1)现有问题:
    在 IE 中不能使用 const 关键字。如 const constVar = 32; 在IE中这是语法错误。
    (2)解决方法:
    不使用 const ,以 var 代替。

    12. body 对象
    MF的body在body标签没有被浏览器完全读入之前就存在,而IE则必须在body完全被读入之后才存在

    13. url encoding
    在js中如果书写url就直接写&不要写&例如var url = ’xx.jsp?objectName=xx&objectEvent=xxx’;
    frm.action = url那么很有可能url不会被正常显示以至于参数没有正确的传到服务器
    一般会服务器报错参数没有找到
    当然如果是在tpl中例外,因为tpl中符合xml规范,要求&书写为&
    一般MF无法识别js中的&

    14. nodeName 和 tagName 问题
    (1)现有问题:
    在MF中,所有节点均有 nodeName 值,但 textNode 没有 tagName 值。在 IE 中,nodeName 的使用好象
    有问题(具体情况没有测试,但我的IE已经死了好几次)。
    (2)解决方法:
    使用 tagName,但应检测其是否为空。

    15. 元素属性
    IE下 input.type属性为只读,但是MF下可以修改

    16. document.getElementsByName() 和 document.all[name] 的问题
    (1)现有问题:
    在 IE 中,getElementsByName()、document.all[name] 均不能用来取得 div 元素(是否还有其它不能取的元素还不知道)。

    转自www.xyhhxx.com

  • 定义

      IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义属性。就是说CSS属性后面可以是一段Javascript表达式,CSS属性的值等于Javascript表达式计算的结果。 在表达式中可以直接引用元素自身的属性和方法,也可以使用其他浏览器对象。这个表达式就好像是在这个元素的一个成员函数中一样。

      给元素固有属性赋值

      例如,你可以依照浏览器的大小来安置一个元素的位置。

    #myDiv {
       position:   absolute;
       width:      100px;
       height:     100px;
       left:       expression(document.body.offsetWidth  - 110 + "px");
       top:        expression(document.body.offsetHeight - 110 + "px");
       background: red;
    }

    给元素自定义属性赋值

      例如,消除页面上的链接虚线框。 通常的做法是:

    <a href="link1.htm" onfocus="this.blur()">link1</a>
    <a href="link2.htm" onfocus="this.blur()">link2</a>
    <a href="link3.htm" onfocus="this.blur()">link3</a> 

      粗看或许还体现不出采用expression的优势,但如果你的页面上有几十甚至上百个链接,这时的你难道还会机械式地Ctrl+C,Ctrl+V么,何况两者一比较,哪个产生的冗余代码更多呢?

      采用expression的做法如下: 
    <style type="text/css">
    a {star : expression(onfocus=this.blur)}
    </style>
    <a href="link1.htm">link1</a>
    <a href="link2.htm">link2</a>
    <a href="link3.htm">link3</a> 

     说明:里面的star就是自己任意定义的属性,你可以随自己喜好另外定义,接着包含在expression()里的语句就是JS脚本,在自定义属性与expression之间可别忘了还有一个引号,因为实质还是CSS,所以放在style标签内,而非script内。OK,这样就很容易地用一句话实现了页面中的链接虚线框的消除。不过你先别得意,如果触发的特效是CSS的属性变化,那么出来的结果会跟你的本意有差别。例如你想随鼠标的移进移出而改变页面中的文本框颜色更改,你可能想当然的会认为应该写为

    <style type="text/css">
    input 
    {star : expression(onmouseover=this.style.backgroundColor="#FF0000";
    onmouseout=this.style.backgroundColor="#FFFFFF")}
    </style>
     <style type="text/css">
     input {star : expression(onmouseover=this.style.backgroundColor="#FF0000";
     onmouseout=this.style.backgroundColor="#FFFFFF")}
     </style>
    <input type="text">
    <input type="text">
    <input type="text">

    可结果却是出现脚本出错,正确的写法应该把CSS样式的定义写进函数内,如下所示:

    <style type="text/css">
    input {star : expression(onmouseover=function()
    {this.style.backgroundColor="#FF0000"},
    onmouseout=function(){this.style.backgroundColor="#FFFFFF"}) }
    </style>
    <input type="text">
    <input type="text">
    <input type="text"> 

     注意

      不是非常需要,一般不建议使用expression,因为expression对浏览器资源要求比较高。

    转自www.xyhhxx.com

  • WEB打印大全

    2006-02-27

    1、控制"纵打"、 横打”和“页面的边距。
    (1)<script defer>
    function SetPrintSettings() {
     // -- advanced features
     factory.printing.SetMarginMeasure(2) // measure margins in inches
     factory.SetPageRange(false, 1, 3) // need pages from 1 to 3
     factory.printing.printer = "HP DeskJet 870C"
     factory.printing.copies = 2
     factory.printing.collate = true
     factory.printing.paperSize = "A4"
     factory.printing.paperSource = "Manual feed"

     // -- basic features
     factory.printing.header = "This is MeadCo"
     factory.printing.footer = "Advanced Printing by ScriptX"
     factory.printing.portrait = false
     factory.printing.leftMargin = 1.0
     factory.printing.topMargin = 1.0
     factory.printing.rightMargin = 1.0
     factory.printing.bottomMargin = 1.0
    }
    </script>

    (2)
    <script language="javascript">
      function printsetup(){
      // 打印页面设置
      wb.execwb(8,1);
      }
      function printpreview(){
      // 打印页面预览
        
      wb.execwb(7,1);
         
        
      }

      function printit()
      {
      if (confirm(’确定打印吗?’)) {
      wb.execwb(6,6)
      }
      }
      </script>
    </head>
    <body>
    <OBJECT class id="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"

    height=0 id=wb name=wb width=0></OBJECT>
    <input type=button name=button_print value="打印"

    onclick="javascript:printit()">
    <input type=button name=button_setup value="打印页面设置"

    onclick="javascript:printsetup();">
    <input type=button name=button_show value="打印预览"

    onclick="javascript:printpreview();">
    <input type=button name=button_fh value="关闭"

    onclick="javascript:window.close();">

    ------------------------------------------------
    关于这个组件还有其他的用法,列举如下:
    WebBrowser.ExecWB(1,1) 打开
    Web.ExecWB(2,1) 关闭现在所有的IE窗口,并打开一个新窗口
    Web.ExecWB(4,1) 保存网页
    Web.ExecWB(6,1) 打印
    Web.ExecWB(7,1) 打印预览
    Web.ExecWB(8,1) 打印页面设置
    Web.ExecWB(10,1) 查看页面属性
    Web.ExecWB(15,1) 好像是撤销,有待确认
    Web.ExecWB(17,1) 全选
    Web.ExecWB(22,1) 刷新
    Web.ExecWB(45,1) 关闭窗体无提示

    2、分页打印
    <HTML>
    <HEAD>
    <STYLE>  
      P {page-break-after: always}
    </STYLE>
    </HEAD>
    <BODY>
    <%while not rs.eof%>
    <P><%=rs(0)%></P>
    <%rs.movenext%>
    <%wend%>
    </BODY>
    </HTML>

    3、ASP页面打印时如何去掉页面底部的路径和顶端的页码编号
    (1)ie的文件-〉页面设置-〉讲里面的页眉和页脚里面的东西都去掉,打印就不出来了。
    (2)<HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <META NAME="Generator" CONTENT="EditPlus">
    <META NAME="Author" CONTENT="YC">
    <script language="VBScript">
    dim hkey_root,hkey_path,hkey_key
    hkey_root="HKEY_CURRENT_USER"
    hkey_path="\Software\Microsoft\Internet Explorer\PageSetup"
    ’//设置网页打印的页眉页脚为空
    function pagesetup_null()
      on error resume next
      Set RegWsh = CreateObject("WScript.Shell")
      hkey_key="\header"  
      RegWsh.RegWrite hkey_root+hkey_path+hkey_key,""
      hkey_key="\footer"
      RegWsh.RegWrite hkey_root+hkey_path+hkey_key,""
    end function
    ’//设置网页打印的页眉页脚为默认值
    function pagesetup_default()
      on error resume next
      Set RegWsh = CreateObject("WScript.Shell")
      hkey_key="\header"  
      RegWsh.RegWrite hkey_root+hkey_path+hkey_key,"&w&b页码,&p/&P"
      hkey_key="\footer"
      RegWsh.RegWrite hkey_root+hkey_path+hkey_key,"&u&b&d"
    end function
    </script>
    </HEAD>

    <BODY>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/><p align=center>
    <input type="button" value="清空页码" onclick=pagesetup_null()> <input type="button" value="恢复页吗" onclick=pagesetup_default()><br/>

    </p>
    </BODY>
    </HTML>
    4、浮动帧打印
    <SCRIPT LANGUAGE=javascript>
    function button1_onclick() {
      var odoc=window.iframe1.document;
      var r=odoc.body.createTextRange();
      var stxt=r.htmlText;
      alert(stxt)
      var pwin=window.open("","print");
      pwin.document.write(stxt);
      pwin.print();
    }
    </SCRIPT>
    4、用FileSystem组件实现WEB应用中的本地特定打印
    <script Language=VBScript>
    function print_onclick //打印函数
    dim label
    label=document.printinfo.label.value //获得HTML页面的数据
    set objfs=CreateObject("Scripting.FileSystemObject") //创建FileSystem组件对象的实例
    set objprinter=objfs.CreateTextFile ("LPT1:",true) //建立与打印机的连接
    objprinter.Writeline("__________________________________") //输出打印的内容
    objprinter.Writeline("| |")
    objprinter.Writeline("| 您打印的数据是:"&label& " |”)
    objprinter.Writeline("| |")
    objprinter.Writeline("|_________________________________|")
    objprinter.close //断开与打印机的连接
    set objprinter=nothing
    set objfs=nothing // 关闭FileSystem组件对象
    end function
    </script>
    服务器端脚本:
    <%………
    set conn=server.CreateObject ("adodb.connection")
    conn.Open "DSN=name;UID=XXXX;PWD=XXXX;"
    set rs=server.CreateObject("adodb.recordset")
    rs.Open(“select ……”),conn,1,1
    ……….%> //与数据库进行交互
    HTML页面编码:
    <HTML>
    ………
    <FORM ID=printinfo NAME="printinfo" >
    <INPUT type="button" value="打印>>" id=print name=print > //调用打印函数
    <INPUT type=hidden id=text1 name=label value=<%=………%>> //保存服务器端传来的数据
    ………
    </HTML>

    转自www.xyhhxx.com

  • 改版后记

    2006-02-27

    又对模版进行了一些修改,增加了一个样式,在页面右上方可以切换;增加了一个音乐盒,在左边栏最下方面,点击[click me]可以打开。

    修正了一些小BUG……

    至此改版算告一段落了。

  • 之前提到的在BLOG最上方的Login和Search在FF中没效果的原因已经知道了,是JS脚本的问题,因为我之前使用的了document.all("id")来取得ID,这种方法是不标准的,所以在FF中不起作用。现在已经改为使用标准推荐的document.getElementById("id")来取得ID,问题已经得到解决。