console.log()
条目,您需要打开浏览器控制台,并确保它是从帧中录制的。如果您要将片段添加到控制台,事情可能会简单得多。也许在代码片段的底部。这可以通过使用自定义功能覆盖默认的
console.log
函数来完成,该功能既写入浏览器控制台(保留对原始功能的引用),也可以写入代码段的控制台。编辑:
也许还显示在此控制台中引发的错误。
#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
对象分割成片段(未在片段中显示);也许log
和logHTML
都: // 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"> ▶ </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
time
和timeEnd
不在这里' t准确,但与实际结果足够接近评论
“甜”并没有开始描述这个
–猫
16年4月10日在0:54
@cat谢谢!我仍然看到一些需要抛光的粗糙边缘。如果您对如何改善它有任何想法,我在听。我很高兴编写此代码,并希望有人会觉得它有用。再次感谢您的评论!
–伊斯梅尔·米格尔(Ismael Miguel)
16-4-10的9:39
评论
是的,请。要意识到没有输出是很多工作,因为我们还没有打开控制台。另外,并非每个程序员都意识到开发人员工具中的控制台存在。大+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-我错过了其他中继文章,感谢您指出。除非这里的赏金引起任何不必要的反馈,否则我认为它没有问题。我也没有理由将这个问题作为另一个问题的重复项,因为显然这是已实施的[功能请求],而另一个问题是要求反馈的公告。