Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript console.log.apply在IE9中不工作_Javascript_Debugging_Console_Internet Explorer 9 - Fatal编程技术网

Javascript console.log.apply在IE9中不工作

Javascript console.log.apply在IE9中不工作,javascript,debugging,console,internet-explorer-9,Javascript,Debugging,Console,Internet Explorer 9,看起来我重新发明了轮子,但不知怎么的,这在InternetExplorer9中不起作用,但在IE6中起作用 function debug() if(!window.console) { window.console = { log: function() { /* do something */ } }; } console.log.apply(console, arguments); } 相关的: F12调试器告诉我这个“对象”(console.log)不支持方法“a

看起来我重新发明了轮子,但不知怎么的,这在InternetExplorer9中不起作用,但在IE6中起作用

function debug()
  if(!window.console) { 
    window.console = { log: function() { /* do something */ } };
  }
  console.log.apply(console, arguments);
}
相关的:

F12调试器告诉我这个“对象”(console.log)不支持方法“apply”。 它甚至不被认为是一种功能吗?
还有其他的指针或想法吗?

一些IE的宿主对象函数不是真正的JavaScript函数,因此没有
apply
call
。(
警报
,例如。)

因此,您必须以艰难的方式完成:

function debug()
  var index;

  if(!window.console) { 
    window.console = { log: function() { /* do something */ } };
  }
  for (index = 0; index < arguments.length; ++index) {
      console.log(arguments[index]);
  }
}
函数调试()
var指数;
如果(!window.console){
window.console={log:function(){/*dosomething*/};
}
for(索引=0;索引
好的,当您这样编写时,它会起作用:

function debug()
  if(!window.console) { 
    window.console = {};
    console.log = function() { /* do something */ };
  }
  console.log.apply(console, arguments);
}

奇怪的行为。。。但是如果你这样写的话,“console.log”会被识别为一个函数。

答案的第二部分也回答了这个问题。我不认为这是一个复制品,为了方便起见,我将粘贴在这里:

console对象不是任何标准的一部分,而是文档对象模型的扩展。与其他DOM对象一样,它被视为主机对象,不需要从对象继承,也不需要像本机ECMAScript函数和对象那样从函数继承其方法。这就是那些方法上未定义apply和call的原因。在IE9中,大多数DOM对象都经过了改进,从本地ECMAScript类型继承。由于开发人员工具被认为是IE的扩展(尽管是内置的扩展),它们显然没有得到与DOM其余部分相同的改进

无论如何,您仍然可以在控制台方法上使用一些Function.prototype方法,并使用一些bind()魔法:

因此,您可以用相同的方式为IE 9安装所有
控制台
方法

if (Function.prototype.bind && window.console && typeof console.log == "object"){
    [
      "log","info","warn","error","assert","dir","clear","profile","profileEnd"
    ].forEach(function (method) {
        console[method] = this.bind(console[method], console);
    }, Function.prototype.call);
}
这将用调用“主机”函数的本机函数替换“主机”函数。您可以在InternetExplorer8中使用它,方法是在代码中包含和的兼容性实现,或者重写上面的代码片段以合并这些方法使用的技术

另见
  • -Microsoft Connect(需要实时帐户)

    • 保罗·爱尔兰也是这样做的。它比上面的一些答案更简单,但使log始终输出一个数组(即使只传入一个参数):


      我提出这个问题的原因是,我试图为一个特定的模块“添加”console.log函数,因此我可以通过使用一些参数来获得更本地化和更深入的调试信息,IE 9破坏了它

      @Andy E answer很好,帮助我了解了很多关于apply的知识。我只是不采用同样的方法来支持IE9,所以我的解决方案是只在“现代浏览器”上运行控制台(现代意味着无论什么浏览器的行为符合我的预期=)


      我遇到了同样的麻烦,并为此制定了常规。 它不像上面所有的实现那样花哨,但它在所有现代浏览器中都能工作

      我用Firefox(Firebug)、IE 7、8、9 Chrome和Opera进行了测试。 它使用了邪恶的EVAL,但您只希望在开发中进行调试。 之后,您将用
      debug=function(){}替换代码

      就是这样

      function toType(obj) {
          if (obj === undefined) return "undefined";
          if (obj === null) return "null";
          var m = obj.constructor;
          if (!m) return "window";
          m = m.toString().match(/(?:function|\[object)\s*([a-z|A-Z|0-9|_|@]*)/);
          return m[1].toLowerCase();
      }
      
      你好,汉斯

      (function(ns) {
        var msgs = [];
      
        // IE compatiblity
        function argtoarr (args,from) {
          var a = [];
          for (var i = from || 0; i<args.length; i++) a.push(args[i]);
          return a;    
        }
      
        function log(arg) {
          var params = "", format = "", type , output,
              types = {
                  "number" : "%d",
                  "object" : "{%o}",
                  "array" : "[%o]"
              };
          for (var i=0; i<arg.length; i++) {
              params += (params ? "," : "")+"arg["+i+"]";
              type = types[toType(arg[i])] || "%s";
              if (type === "%d" && parseFloat(arg[i]) == parseInt(arg[i], 10)) type = "%f";
              format += (format ? "," : "")+type;
          }
          // opera does not support string format, so leave it out
          output = "console.log("+(window.opera ? "" : "'%f',".replace("%f",format))+"%p);".replace("%p",params);
          eval(output);
        }
      
        ns.debug = function () {
          msgs.push(argtoarr(arguments));
          if (console !== undefined) while (msgs.length>0) log(msgs.shift());
        }
      
      })(window);
      
      尝试:


      适用于
      日志
      调试
      信息
      警告
      错误
      组端

      。JS中并非所有可调用的东西都必须是
      函数
      对象。起初我也这么认为。但是,它以前没有定义过。@line-o:注意,您在某些地方使用的是
      window.console
      ,在其他地方使用的是
      console
      。现在,在所有其他条件相同的情况下,这些应该是相同的,但这是我们正在讨论的IE,如果它与
      控制台玩魔术游戏,我一点也不会感到惊讶。log
      @Tim Down:true,很像对RegExp实例的非标准扩展,使它们可以调用@TJC,@line-o:console
      对象直到您第一次启动特定选项卡的开发人员工具时才存在。请参阅我对您对我的答案的评论的回复。你在某种程度上的不一致应该是好的,但我敢打赌IE在玩愚蠢的游戏。+1当然,这个解决方案引入了一个新的依赖项:
      Function#bind
      ,在还没有完全达到ECMAScript 5规范的实现上必须提供它……实际上,它是针对IE6的。但它给了我更深刻的见解,回答了我的问题,这对我帮助很大。所以,非常感谢@AndyThanks@Andy,我需要这个来让我的框架中的调试器在MSIE上工作。我已经在源代码中添加了学分,再次感谢!实现这一点的简单方法是:
      function debug(){function.prototype.apply.call(console.log,console,arguments);}
      这就是这个
      bind
      -ing代码的基本功能。我希望我能多次对这个答案进行投票。令人惊讶的信息和帮助!谢谢谢谢你提出了他的好方法。
      var C = function() {
        var args = Array.prototype.slice.call(arguments);
        var console = window.console;
        args[0]  = "Module X: "+args[0];
        if( typeof console == 'object' && console.log && console.log.apply ){
          console.log.apply(console, args);
        }
      };
      
      (function(ns) {
        var msgs = [];
      
        // IE compatiblity
        function argtoarr (args,from) {
          var a = [];
          for (var i = from || 0; i<args.length; i++) a.push(args[i]);
          return a;    
        }
      
        function log(arg) {
          var params = "", format = "", type , output,
              types = {
                  "number" : "%d",
                  "object" : "{%o}",
                  "array" : "[%o]"
              };
          for (var i=0; i<arg.length; i++) {
              params += (params ? "," : "")+"arg["+i+"]";
              type = types[toType(arg[i])] || "%s";
              if (type === "%d" && parseFloat(arg[i]) == parseInt(arg[i], 10)) type = "%f";
              format += (format ? "," : "")+type;
          }
          // opera does not support string format, so leave it out
          output = "console.log("+(window.opera ? "" : "'%f',".replace("%f",format))+"%p);".replace("%p",params);
          eval(output);
        }
      
        ns.debug = function () {
          msgs.push(argtoarr(arguments));
          if (console !== undefined) while (msgs.length>0) log(msgs.shift());
        }
      
      })(window);
      
      function toType(obj) {
          if (obj === undefined) return "undefined";
          if (obj === null) return "null";
          var m = obj.constructor;
          if (!m) return "window";
          m = m.toString().match(/(?:function|\[object)\s*([a-z|A-Z|0-9|_|@]*)/);
          return m[1].toLowerCase();
      }
      
      function log(type) {
        if (typeof console !== 'undefined' && typeof console.log !== 'undefined' &&
          console[type] && Function.prototype.bind) {
          var log = Function.prototype.bind.call(console[type], console);
          log.apply(console, Array.prototype.slice.call(arguments, 1));
        }
      }
      log('info', 'test', 'pass');
      log('error', 'test', 'fail');