我有一个很小的功能,我只使用数字输入。它在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
答案 0 :(得分:2)
在wireElemToEvent
中您可能希望在初始化后检查elem
是否为空。此外,最好检查是否存在elem.attachEvent
和elem.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