【问题标题】:Javascript cross browser scriptingJavascript跨浏览器脚本
【发布时间】:2019-09-23 02:57:10
【问题描述】:

我有一个小函数,我只允许输入数字。它在 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 # has no method 'attachEvent'

知道我做错了什么吗?

【问题讨论】:

    标签: javascript cross-browser dom-events


    【解决方案1】:

    wireElemToEvent 中,您可能需要在初始化elem 后检查它是否为空。另外,最好检查elem.attachEventelem.addEventListener的存在,而不是window.event是否被定义。

    【讨论】:

      【解决方案2】:

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

       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);
          ...
      });
      

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,因为我是新手,所以一直在四处寻找解决方案。 显然 (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);
        }
        };
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • +1。跨浏览器支持总是会回到 jQuery :) 太容易了。
          • 我同意 100% 并且我使用并喜欢 jQuery,但是在这个特定的项目中,没有使用 jQuery。客户不想要任何第 3 方库。
          • 很抱歉听到这个消息。您的客户是否知道 jQuery 受 Microsoft 支持并将作为 Visual Studio 2010 的一部分提供? weblogs.asp.net/scottgu/archive/2008/09/28/…
          • -1:答案并不总是 JQuery。以跨浏览器支持的方式附加事件非常容易,无需任何开销。
          • @Joel:你是对的,当然。但是使用 jQuery 只是一个建议的替代方案。我认为推广我喜欢的图书馆的使用和提高人们对图书馆的认识没有问题。
          猜你喜欢
          • 2010-09-19
          • 2011-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-15
          • 1970-01-01
          相关资源
          最近更新 更多