当前,要查看StackSnippets中的console.log()条目,您需要打开浏览器控制台,并确保它是从帧中录制的。如果您要将片段添加到控制台,事情可能会简单得多。也许在代码片段的底部。

这可以通过使用自定义功能覆盖默认的console.log函数来完成,该功能既写入浏览器控制台(保留对原始功能的引用),也可以写入代码段的控制台。

编辑:
也许还显示在此控制台中引发的错误。

评论

是的,请。要意识到没有输出是很多工作,因为我们还没有打开控制台。另外,并非每个程序员都意识到开发人员工具中的控制台存在。

大+1,现在我必须在每个代码段中都包含一个不相关的功能,以便结果显示读者可以轻松看到它们的位置,这分散了问题/答案的注意力。更糟糕的是,您看到人们在使用document.write,这只是一个糟糕的主意。它不必是console.log,仅此而已。也许snippet.write(“ HTML进入这里”)。

@Unihedron如果您没有意识到“控制台存在”,那么您就不能称自己为“程序员”(至少不是网络程序员)。这是2014年的人,而不是90年代。

两个词:范围蠕变。

严重的是,我们能否继续前进。仅为了执行此操作而必须包含脚本是非常令人分心的。它会对答案产生负面影响。自从提出此请求以来,它仍然很长。

@ T.J。Crowder也许您应该向佳能授予赏金,以便他可以再提供一个。

@Scimonster:那真是聪明。谢谢,这正是我要做的。我们可以乒乓球直到完成。 :-)

@canon:对于实现功能而言,无论好坏,赏金几乎没有任何作用。如果我是你,我会保存你的声誉的。

哦,天哪,一年多以后,什么都没有。是的

@canon::-)不幸的是,它还没有在meta.so上结束,所以我们不必担心。但是只要我们继续交易赏金,我们就不会用完代表。 :-)我只是不明白为什么片段被完全忽略了。考虑到网站在JS,HTML和CSS标签中的访问量,这真是太疯狂了。图钉的东西绝对应该是一流的体验,但是自从引入以来,草皮都已经做完了。

我是在我的大多数JS答案中都会定期包含这些脚本之一的人之一。谢谢canon&T.J. Crowder,这些都非常有帮助,很遗憾SO还没有实现它。

@ShadowWizard:我不认为使用赏金吸引人们关注一个问题不是滥用,这是我在这里的唯一目标。我可以毫不关心MSE代表。所以我问这是否是滥用。

@ShadowWizard:我无法控制佳能向谁颁发赏金。此处发生的“作弊”恰好为零,坦率地说,我发现该建议令人反感。 (以温和的方式,MSE上的任何东西都能引起反应。我几乎不会在黎明时要求手枪感到满意!)我正在做的所有事情,据我所知,所有教规正在做的事情,是在试图画画。注意堆栈溢出的一个好的功能(特别是)中的重要缺失功能。就这样。

@ T.J。Crowder-我将开始在这里发布赏金,直到我的3k元信誉消失为止。可笑的是,这还没有实现。

@ShadowWizard-我错过了其他中继文章,感谢您指出。除非这里的赏金引起任何不必要的反馈,否则我认为它没有问题。我也没有理由将这个问题作为另一个问题的重复项,因为显然这是已实施的[功能请求],而另一个问题是要求反馈的公告。

#1 楼

感谢您提出来!

在很大程度上感谢canon和他的MIT许可的Stack Snippets虚拟控制台库的努力,我们现在有了一个虚拟控制台!

通常我会做屏幕截图,但是使用Stack Snippets,我可以给您一个实时演示。看看吧!




 console.log("virtual!");
console.log("console!"); 

 <b>Here's some HTML</b> 





欢迎反馈!

评论


感谢您终于照顾好这个!

–Scimonster
16年5月18日在20:04

是的,感谢您最终实现了这一点。所有的赏金是否引起了注意,并且对您的决定有影响吗?顺便说一下,这里有500个元信誉点。

–乔什·克罗泽(Josh Crozier)
16年5月18日在20:29



谢谢@JoshCrozier。不,不是真的。或至少不会以您可能认为的方式。我并不关心这些要点,而是因为事实对人们来说足够重要,足以使他们放弃巨额悬赏。这就说明了很大的需求:于是我去了佳能公司,解决了这个问题。

–Haney♦
16年5月18日在20:30

大卫和其他几个人一样,我接受了“欢迎反馈!”链接表示我们应该在此处发布带有反馈的答案,包括错误报告和功能请求。我们应该这样做吗?还是将它们分别作为错误或功能请求问题单独发布?您已针对其中一个答案实施了其中之一,但我不确定您希望该模型继续运行多长时间...

– T.J.拥挤者
16年5月20日在14:54



@ T.J。Crowder还是可以的。将它们用作该帖子的答案使我很容易查看。顺便说一句,顺便说一句,BTW并没有忽略您,而是在思考您的想法并思考各种可能性。 :)

–Haney♦
16年5月20日在15:23

@Haney:太好了,随着更多内容的出现,我将它们发布在这里。真的,真的很感谢Stack Snippets,尤其是控制台。

– T.J.拥挤者
16年5月20日在15:44



#2 楼

我在meta.SO上提出了这个问题的副本,在这里我提出了一个解决方案,复制在这里:


我全心全意地同意。如果这些片段的目的是使我们能够演示功能并内嵌显示其输出,则需要将输出窗格调整为(可选)镜像记录的消息。

为什么我们要避免避免使用document.write()alert()?即使我们演示的是纯JavaScript概念,两者都假定使用浏览器环境。当然,我们不希望任何一个方法都应该位于node.js函数的中间。
我们都不用调试(希望)

alert()极具侵入性。

document.write()甚至不建议初学者使用一连串的警告
这两种方法都无法提供强大的序列化功能...忘了序列化对象。我们可以做很多更好的事情。

我的临时解决方案

我创建了一个小脚本,以通过html snippet1包括在内(请完整保留注释):

 <!-- console visualization; see http://meta.stackexchange.com/a/242491 -->
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
 


1如果我们获得了集成的控制台可视化效果,则可以删除此脚本并将其全部删除

注意:


console.log()的所有调用(info()warn()error()clear())都传递给实际的console

宽松地模仿Chrome的输出(不包括颜色和样式)
使用JSON.stringify()的变体(包括函数,正则表达式,未定义等)对对象进行打印,并为其自定义处理HTMLElement

通过向页面中注入元素来工作...因此,显然会污染DOM。
条目的数量限制为50。较旧的条目将被删除,以便为较新的条目腾出空间。
记录未处理的错误。
处理循环引用。您可以登录window;但是,我不推荐它。

这里有一个演示:




 // sample values
var values = [1e100, "a", true, new Date(), x => 1, /(?:)/ig, undefined, null];

// add a circular reference
values.push(values);

// log whole array with circular reference
console.log("array with circular reference: %o", values);

// log each value individually
values.forEach((v, i) => console.log("%i: %o", i, v));

// sample click handler
document.querySelector("button").addEventListener("click", function(e) {
  console.log("clicked: %o", this);
});

// throw a test error
throw new Error("test!"); 

 <!-- console visualization; see http://meta.stackexchange.com/a/242491 -->
<script src="https://gh-canon.github.io/stack-snippet-console/console.min.js"></script>
<button>click me</button> 





项目链接
最小版本
未最小版本



评论


这个答案没有收到足够的支持

–塞缪尔·刘(Samuel Liew)
2015年7月9日在3:23

我希望我可以为这个答案分配另一个赏金

–猫
16 Mar 2 '16 at 2:59

哇,如果我理解正确,T.J。克劳德(Crowder)给佳能(Canon)巨大的赏金,而佳能又给了T.J.人群的赏金巨大。我只想指出这种美丽的运动精神。

–bmende
16-4-10的23:58

@bmende实际上正在讨论这是否是一种滥用形式。

– boxspah
16-4-14在2:49



改用萤火虫有什么问题吗?看起来很完美:codepen.io/anon/pen/vGvXYW

–玛丽
16年5月4日在13:56

只是想说:您在此控制台上做得很好。真是太棒了,我很高兴SE管理层有能力将其纳入董事会。我们所有人都在javascript标签中向您致敬!

– T.J.拥挤者
16年5月19日在13:52

#3 楼

TL; DR


最好不要将实际的控制台留空,尤其是因为干扰它可以防止询问和回答与控制台有关的问题(例如何时以及如何在V8上扩展数据)控制台,这绝对不是一件容易的事。)

肯定需要一种内置的,简单的生成输出的方法,而又不会促进诸如document.write之类的不良做法。


以下内容的具体建议,包括托管在GitHub Pages上的版本(尽管该项目仍在那里,但它们已经终止了该URL),直到/除非片段具有自己的方式为止,都可以使用。



我认为应该不理会控制台,尤其是因为干扰控制台可以防止询问和回答与控制台有关的问题(例如何时以及如何在V8控制台上扩展数据,
,但是我很想知道我认为此请求的要点是:将输出写到输出pa的简单方法现在,人们正在做四件事:


使用document.write。这太糟糕了,它在2014年+的时候提升了1990年代的代码。


使用一些函数进行输出,例如我通常的用法:
  function display(msg) {
     document.body.insertAdjacentHTML(
         "beforeend",
         "<p>" + msg + "</p>"
     );
 }
 

这也不好,因为它会增加很多噪音,尤其是。到简短的代码段。


使用console.log,这只会使代码段的输出窗格浪费空间。


将脚本包含在代码段中(就像下面的我一样),这意味着该代码段依赖于场外资源。


这些都不是一个好的解决方案。
我的建议是保持简单并注入一个使用snippet(或其他方法)将log对象分割成片段(未在片段中显示);也许loglogHTML都:
 // MIT license, see: https://github.com/tjcrowder/simple-snippets-console/blob/master/LICENSE
var snippet = {
    version: "1.3",

    // Writes out the given text in a monospaced paragraph tag, escaping
    // & and < so they aren't rendered as HTML.
    log: function(msg, tag) {
        var elm = document.createElement(tag || "p");
        elm.style.fontFamily = "monospace";
        elm.style.margin = "2px 0 2px 0";
        if (Object.prototype.toString.call(msg) === "[object Array]") {
            msg = msg.join();
        } else if (typeof msg === "object") {
            msg = msg === null ? "null" : JSON.stringify(msg);
        }
        elm.appendChild(document.createTextNode(msg));
        document.body.appendChild(elm);
    },

    // Writes out the given HTML at the end of the body,
    // exactly as-is
    logHTML: function(html) {
        document.body.insertAdjacentHTML("beforeend", html);
    }
};
 

我已经在GitHub Pages上提供了一个版本(他们已经终止了该URL),直到片段具有自己的方式为止都可以使用。可以将其随意插入如下代码段的顶部:
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

像这样的简单snippet对象可以解决人们现在正在做的事情。考虑以下示例:
问题:
如何创建仅包含JavaScript中现有数组内容的子集的数组?例如,只有非负数?
答案:
您可以使用ES5的Array#filter。它调用您提供的函数,传入数组中的每个条目,并根据您返回的真实值的条目构建一个新数组:



 var a = [10, 0, -5, 7, 12, -3, -1];
var filtered = a.filter(function(entry) {
  return entry >= 0;
});
snippet.log("original: " + a.join(", "));        // "10, 0, -5, 7, 12, -3, -1"
snippet.log("filtered: " + filtered.join(", ")); // "10, 0, 7, 12" 




(很显然,如果尝试运行该命令,则会出现错误,因为未定义snippet。)
不是比:



 var a = [10, 0, -5, 7, 12, -3, -1];
var filtered = a.filter(function(entry) {
  return entry >= 0;
});
display("original: " + a.join(", "));        // "10, 0, -5, 7, 12, -3, -1"
display("filtered: " + filtered.join(", ")); // "10, 0, 7, 12"

function display(msg) {
    document.body.insertAdjacentHTML(
        "beforeend",
        "<p>" + msg + "</p>"
    );
} 




评论


@canon:我一直在使用上面的代码段对象,从github加载脚本。

– T.J.拥挤者
2015年2月11日在8:13

我不确定是否有一个单独的代码段对象是否很容易发现。现在,我认为大多数人要做的第一件事是尝试使用“ console.log”,然后想知道为什么它不起作用。

–hugomg
2015年5月15日13:27

@hugomg:非常容易检测/\bconsole\./并显示一条淡出消息,说明该怎么做。每当您接管这样的事情时,您都会立即打开自己的大门,以对其进行改进/创新,某些平台具有的特殊功能,像今天这样的关于控制台本身的问题等,等等。或者我们可以尝试完全模拟控制台,但是如果是这样,我希望选择一个退出选项(例如var console = realConsole;),但是我认为最好不要先干扰它地点。

– T.J.拥挤者
2015年5月15日13:41



另一种选择是添加一个标题为“ snippet.log输出”的选项卡。我只是认为以某种方式“避免”避免尝试console.log的常见问题很重要,它只是显示空白的结果选项卡。

–hugomg
2015年5月15日14:11

我希望看到我们检测并处理它,这是微不足道的。但这只是我的观点。另外,鉴于过去八个月中关于Stack Snippets的任何有意义的发展都没有出现,我认为较小的=实际发生的可能性略大。

– T.J.拥挤者
2015年5月15日14:13



msg = msg === null吗? “ null”:JSON.stringify(msg); vs msg = JSON.stringify(msg);? JSON.stringify如果为null,则返回null。还是我想念什么?

– Nina Scholz
15年8月15日在16:50

@NinaScholz:当时,我不确定这是特定行为。现在,我可以肯定的是。尽管如此,该检查仍可防止将null转换为“ null”,然后将“ null”解析回null,因此...

– T.J.拥挤者
15年8月15日在16:53

是的,在没有任何内置代码段行为的情况下,我通常使用document.write()只是因为它最简单,并且对于查看者来说似乎最不复杂。在jsFiddles中,我使用自己的异地脚本资源,因为可以将该脚本资源添加到jsFiddle中,但不会使代码显示复杂化。由于片段不是这种情况,所以我只使用document.write()并保持80年代的感觉。 StackOverflow片段中确实应该内置一些东西。不需要太多(可能需要5行代码来公开log()函数)。

– jfriend00
2015年9月4日在4:06

@佳能:哈哈!明白这一点:我也从未投票赞成你的。 Cri

– T.J.拥挤者
16-4-24在10:01



@ T.J。Crowder-快速了解,终于实现了控制台。

–乔什·克罗泽(Josh Crozier)
16年5月18日在20:33



@canon-有趣! FWIW,我不会使用深色背景,也不适合SO的设计,当然,对于演示部分,这不是浏览器默认执行的操作...您对此是否有SE参与,或者这仅仅是您自己的项目?

– T.J.拥挤者
18/12/2在9:16



@佳能-很酷。 (是的,我也喜欢深色背景进行编码。)

– T.J.拥挤者
18/12/2在11:13

看起来像是您的堆栈片段链接已损坏

–游侠怪胎♦
20年7月28日在18:39

@JourneymanGeek-是的,GitHub取消了这些URL。 :-|但是这些天我们有一个代码片段控制台,所以...(我一直在慢慢地尝试着〜340 SO答案,我曾经使用该链接切换到代码片段内置控制台...)

– T.J.拥挤者
20年7月29日在7:33

#4 楼

这实际上不是最佳片段。请参阅以下T. J. Crowder和Canon的答案,以获得更好的控制台模拟。
有一个重要的区别。我的是适用于所有帖子的用户脚本。其他的则是包含在特定的代码段中,供所有人受益。


我创建了一个脚本来执行此操作。您可以在Stack Apps上阅读有关此内容的更多信息。从Greasy Fork下载它。

观看实际操作! (来自此帖子的图片)



更新(2014-10-12):
现在显示错误。

#5 楼

我带来了来自首个meta.SE社区市政厅聊天事件的新闻(也希望如此)。
这里有部分成绩单:

佳能:@Haney只要有机会,我们就可以讨论Stack- Snippets™?
撤消:@canon具体是什么?
canon:@撤消控制台输出(meta.stackexchange.com/a/279053/159427)
Haney:@canon我不想劫持对话,但可以肯定的是,这已经在我们的雷达上了。我们肯定要这样做,只是现在就找时间而已
佳能:@Haney只是为了澄清,您肯定要进行讨论...还是要实现控制台可视化?
Haney :@canon我们认为控制台产品将带来巨大的好处(双赢,可能会在摘要中启用/禁用它)。只是需要花些时间来实现。
佳能:@Haney很棒!
哈尼:嘿@canon您在stopgap控制台js上拥有什么样的许可证? ;)
佳能:@Haney我想我盲目地选了MIT
Haney:很好,很好
Haney:@canon看到为我们完成基础工作后,我的工作变得更容易了... MIT许可证将使我们很容易采用这种方式。我将在下周看到团队的想法

更新:
Haney发表了关于市政厅聊天建议的评论:

@canon我们已经同意调查在接下来的几周内,我们将努力将其纳入图书馆,但尚无承诺...。


#6 楼

很长一段时间后,我决定发布我的答案。

我从今年4月开始使用它,而如今我已经对其进行了改进。

我的代码,目前以“不同”方式控制console对象(我错过了正确的词)。

代码处理console对象中的以下方法:


log
error
warn
info
time
timeEnd
clear

它也显示对象和数组在树状视图中。

代码可以执行的一些示例:




 //starts the console and tells to use the specific element to add the messages there

console._RELAY_TO_DOC = document.getElementById('messages');

//misc stuff, only _USE_JSON has the default value

console._USE_JSON = false;
console._SHOW_COOL_NUMBERS = true;
console._SHOW_TYPES = true;
console._SHOW_STRING_LENGTH = true;

//just use the console now:

console.time('test');

console.log(1,[],{},'string',[1,2,3,4,5],{a:1,b:2,c:3});
console.warn('Too much awesomeness!');
console.info('You are informed.');
console.error('Oh no! We divided by 0!');

console.timeEnd('test');

throw new Error('This will show in the console'); 

 * {font-family:sans-serif;}

html,document {overflow:hidden;}

#console{
  position:absolute;
  top:0px;
  right:-300px;
  -webkit-transition: right 1s;
  transition: right 1s;
  height:100%;
  max-height:100%;
}
#show {display:none;}
#show:checked+#console{right:0px;}
#show_button{
  display:inline-block;
  width:20px;
  height:40px;
  text-align:center;
  border:1px solid #ccc;
  -webkit-border-top-left-radius: 5px;
  -webkit-border-bottom-left-radius: 5px;
  -moz-border-radius-topleft: 5px;
  -moz-border-radius-bottomleft: 5px;
  border-top-left-radius: 5px;
  border-bottom-left-radius: 5px;
  background:white;
  cursor:pointer;
  float:left;
  padding-top:20px;
}
#messages {
  width:300px;
  float:right;
  min-height:100%;
  max-height:100%;
  height:100%;
  background:white;
  overflow-y:scroll;
  border-left:1px solid #ccc;
}

textarea {width:350px; height:130px;} 

 <!-- load the script -->
<script src="http://ismael-miguel.github.io/console-log-to-document/files/console.log.min.js"></script>


<span> All the messages are present there --> </span>
<input type="checkbox" id="show" />
<div id="console">
  <label id="show_button" for="show" checked="checked"> &#9654; </label>
  <div id="messages"><span>List of all messages:</span></div>
</div>

<div>
  Eval you code here: (write and click outside)<br>
  
  <textarea onchange="Function(this.value)();">console.time('test');

console.log(1,[],{},'string',[1,2,3,4,5],{a:1,b:2,c:3});
console.warn('Too much awesomeness!');
console.info('You are informed.');
console.error('Oh no! We divided by 0!');

console.timeEnd('test');

throw new Error('This will show in the console');</textarea>
</div> 





我要求@canon借给我他代码的一个重要功能:可以在未捕获时处理异常。

还有一些选择在console对象中:



_RELAY_TO_DOC-启用/禁用记录文档中的消息。
可以将其设置为true或使用Element

_USE_JSON-仅返回JSON字符串。从现在开始覆盖所有选项。

_SHOW_COOL_NUMBERS-以二进制,八进制和十六进制表示形式显示数字

_SHOW_TYPES-显示元素的数据类型。

_SHOW_STRING_LENGTH-显示字符串长度。

还向console对象添加了2种方法:



_restore_old_method-恢复方法(例如:log)为默认值

_restore_relay_method-是否与上述方法相反

我希望您喜欢它!

您可以请访问http://ismael-miguel.github.io/console-log-to-document/以获取有关代码及其功能的完整说明。

要使其在任何页面上均可工作,只需将<script src="http://ismael-miguel.github.io/console-log-to-document/files/console.log.min.js"></script>粘贴到您的<head>中。

警告:


这不喜欢递归(与Element一起使用是安全的s,它准备忽略它的递归)。
代码不能处理非常大的元素(例如document
如果滥用,这可能会消耗大量CPU
timetimeEnd不在这里' t准确,但与实际结果足够接近


评论


“甜”并没有开始描述这个

–猫
16年4月10日在0:54

@cat谢谢!我仍然看到一些需要抛光的粗糙边缘。如果您对如何改善它有任何想法,我在听。我很高兴编写此代码,并希望有人会觉得它有用。再次感谢您的评论!

–伊斯梅尔·米格尔(Ismael Miguel)
16-4-10的9:39