javascript跨浏览器脚本帮助

时间:2010-02-02 18:10:37

标签: javascript javascript-events cross-browser

我有一个很小的功能,我只使用数字输入。它在IE中运行良好,但我无法在FireFox或Chrome中使用它。我在我的HTML页面的脚本标记中加载了这个js文件。

var numberOnly = function(evt) { 

  var theEvent = evt || window.event; 
  var key = theEvent.keyCode || theEvent.which; 
  key = String.fromCharCode( key ); 
  var regex = /[0-9]|\./; 
  if( !regex.test(key) ) { 
    theEvent.returnValue = false; 

 } 
}; 

var wireElemToEvent = function(elemId, event, func){

var elem = document.getElementById(elemId);
if (typeof window.event !== 'undefined') {
    elem.attachEvent("on" + event, func);
} else {
    elem.addEventListener(event, func, true);
}
};



var wireEvents = function(){

wireElemToEvent("tbxQuantity", "keypress", numberOnly);
wireElemToEvent("tbxPhone", "keypress", numberOnly);
wireElemToEvent("tbxZip", "keypress", numberOnly);


};

window.onload = wireEvents;

Chrome告诉我

file:/// C:/Documents%20and%20Settings/xxx/Desktop/numbersonly/res/js/numbersonly.js:17Uncaught TypeError:Object#没有方法'attachEvent'

知道我做错了吗?

感谢您的帮助, 〜CK

4 个答案:

答案 0 :(得分:2)

wireElemToEvent中您可能希望在初始化后检查elem是否为空。此外,最好检查是否存在elem.attachEventelem.addEventListener,而不是是否定义了window.event

答案 1 :(得分:1)

这是我用来跨浏览器附加事件的函数:

 function eventListen( t, fn, o ) {
  o = o || window;
  var e = t+fn;
  if ( o.attachEvent ) {
   o['e'+e] = fn;
   o[e] = function(){
    o['e'+e]( window.event );
   };
   o.attachEvent( 'on'+t, o[e] );
  }else{
   o.addEventListener( t, fn, false );
  }
 }

使用它:

eventListen('message', function(e){
 var msg = JSON.parse(e.data);
    ...
});

答案 2 :(得分:1)

我遇到了同样的问题,因为我是一名新手,正在寻找解决方案的一天。 显然(typeof window.event!=='undefined')不会阻止Safari / Chrome进入if语句。所以它实际上初始化了attachEvent,并且不知道如何处理它。

解决方案:

var wireElemToEvent = function(elemId, event, func){

var elem = document.getElementById(elemId);
if (elem.attachEvent) {
    elem.attachEvent("on" + event, func);
} 
else { // if (elem.addEventListener) interchangeably
    elem.addEventListener(event, func, true);
}
};

答案 3 :(得分:0)

使跨浏览器脚本编写更容易的一个好方法是使用jQuery。此外,没有理由重新发明轮子。为什么不试试这个jQuery插件:jQuery » numeric