IE下JavaScript迁移到FireFox下的工作笔记

 IE下JavaScript迁移到FireFox下的工作笔记  
<script src="http://blog.csdn.net/count.aspx?ID=1179654&Type=Rank"></script>
  


     ======================================================================   
     一些参考资料
     http://nexgenmedia.net/evang/iemozguide/
    
     http://www.javascriptkit.com/domref/
    
    
     通过firefox自带的工具学习的方法:
 
  打开TOOLS -> dom inspector , 左侧选中某个控件后, 右侧可以选择 JAVASCRIPT OBJECT
  
  通过自带工具调试javascript
  TOOLS -> JavaScript Console
  
  打开所有js警告:
  在地址栏里录入:about:config
  双击,设置 javascript option restict 打开为true 能够看到很多警告,利于纠错
  
  
  ☆ 关于调试JS的tip
  调试js时,经常受缓存的影响,页面不会加载最新的代码,为此解决如下:
  在新页面里打开原来的地址,关闭原来的页面,ok了.
  以上方法在IE和FF下都有效.
  
  在ff下按Ctrl+shift+del, 打开清除私有信息对话框, 点击立即清除, 回到页面后reload一次也是可行的方案.
  
  
  
  ☆ IE -> firefox javascript类
  △ document.all -> document.getElementById
  并且控件尽量用id,而不是name标识
  
  为了兼容旧代码,参考下面的函数, 把document.all 替换为 document_all即可
  function document_all(objName,doc){
  if (!doc) doc = document;
  
  var obj;
  obj = doc.getElementById(objName);
  
  if (!obj) obj = doc.getElementsByName(objName)[0];
  
  return obj;
  }
  
  
  提示:
  如果控件只有name,没有id, 用getElementById时:
  IE:也可以找到对象
  FF:返回NULL
  △ 获得form里某个元素的方法
  formObj.elements['user_ name'];
  
  △ 取集合元素时, ie支持 [],() 2种写法, 但是ff仅支持[],如:
  table.rows(5).cells(0)
  改为:
  table.rows[5].cells[0]
  
  △ 判断对象是否是object的方法应该为
  if( typeof 对象变量 == "object")
  而不是 if(对象变量 == "[object]")
  
  △ eval(对象名称) -> document.getElementById
  FF支持eval函数
  
  △ 通过id直接调用对象
  对象id.value = ""
  改为
  document.getElementById("name").value = ""
  
  
  
  △ 不支持onpropertychange事件
  
  △ obj.insertAdjacentElement("beforeBegin",objText);
  改为用
  obj.parentNode.insertBefore(objText,obj);
  
  △ createElement不支持HTML代码
  用document.write(esHTML); 可以解决一部分情况
  
  △ innerText -> textContent
  
  △ 对象名称中的$不能识别, 建议改为_
  objName = "t1$spin"
  改为
  objName = "t1_spin"
  
  △ 事件名称和注册方式的变化
  addEventListener("blur", myBlur, false);
  
  
  △ FF里设置Attribute为某个对象,然后再取出来,这时候对象的属性都丢失了?
  objText.setAttribute("dropdown_select",obj);
  alert(obj.id) //正确的名字
  obj = objText.getAttribute("dropdown_select");
  alert(obj.id) //null
  
  在IE下没有问题, FF对setAttribute来说,第2个参数都是字符串型的!!!
  所以如果第2个参数是对象时,相当于调用对象的 toString() 方法了
  
  解决的方法是用下面的调用方式:
  objText.dropdown_select = obj;
  
  obj = objText.dropdown_select
  
  
  △ className -> class
  FF下用class代替IE下的className
  由于class是关键字, 所以需要用 setAttribute/getAttribute才行
  setAttribute("class","css样式名称");
  
  △ 在html里定义的属性,必须用getAttribute才行
  
  获取时:
  document.getElementByID("TD1").isOBJ 总返回 undefined, IE下是可以的
  应该用:
  document.getElementByID("TD1").getAttribute("isOBJ")
  
  
  △ FF里select控件不再是:总是在顶端显示
  所以需要设置控件的zIndex
  
  △ 对于if ( vars == undefined ) 下面的值用于判断是等同的
  undefined
  null
  false
  0
  
  
  △ 如果FF调用obj.focus(); 报错,请尝试改为:
  window.setTimeout( function(){ obj.focus(); }, 0);
  
  现在的方案是在失去焦点前判断
  △ 关于在控件的blur事件里判断下一个获得焦点的控件的tip, 类似于Powerbuilder的item focus changing事件
  用途举例: 对dropdown控件里的text控件,
  如果下一个获得焦点的对象是selection,则不做录入控制,如果不是,则提示,并设置焦点为text
  
  经测试:
  IE: blur发生在focus后
  FF: blur发生在focus前调用
  
  
  IE: 在onbeforedeactivate事件里用activeElement可以获得下一个对象
  
  FF: blur事件发生在focus前面,而FF又没有中间事件
  下面的都不行!
  target
  currentTarget
  relativeTarget
  
  看来需要这样处理!
  注册所有控件的onblur,设置lastElement
  在focus里处理上一个? 也不行啊!
  
  能否模拟自己的itemfocuschanging事件?
  IE: onbeforedeactivate
  FF: 抢先注册onfocus和onblur, 在里面设置activeElement
  在onfocus里设置activeElement后,
  调用onbeforedeactivate
  如果onbeforedeactivate返回false,则设置focus为原来的控件!
  
  
  在控件失去焦点前,设置lastObj=this
  在控件获得焦点时,先判断lastObj是什么
  
  
  
  
  
  △ FF不能处理alert造成的死循环情况
  
  △ FF下,keyCode是只读的, 那把回车转换为tab怎么办? 在录入时进行转换怎么办??
  
  变通的方法是:
  1. 回车跳转 -> 自己写跳转处理代码.
  2. 在能够录入的控件里,
  把选中的部分替换为新录入的内容: var text = String.fromCharCode(event.keyCode);
  同时阻止按键事件上传, 调用: event.preventDefault()
  
  
  △ selection的难度较大,因为IE和FF没有接近的函数
  为此专门做了一个对象来消除差异
  感觉firefox的selection机制使用起来更简洁一些
  
  这种模式是桥梁模式还是
  
  
  △

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值