【问题标题】:Response.WriteBlock error when using mootools in server-side ASP JScript在服务器端 ASP JScript 中使用 mootools 时出现 Response.WriteBlock 错误
【发布时间】:2010-11-04 12:03:54
【问题描述】:

我今天一直在玩 Mootools 1.3 服务器端。它真的很好,经过一番抨击才使它对经典的 ASP 友好,但仍然充满了优点(tm)。

在向朋友展示 Mootools 的功能时,我遇到了一个奇怪的 ASP 相关错误,这是我以前从未见过的。

Microsoft JScript runtime error '800a138f'

'Response.WriteBlock(...)' is null or not an object

导致它的代码是 Mootools 时髦的“forEach”助手之一:

[1,2,3].each( function( i ) {
   Response.Write( "<b>" + i + "</b>, " );
});

它真的一点也不喜欢这段代码。我注释掉了 Response.Write 并且有一个空块,它仍然抛出错误。很奇怪。我知道 ASP 做了一些优化魔法来将 html 块和 asp 块组合在一起(因此有 Reponse.WriteBlock 注释),但不知道为什么这会适用于此。

但此代码将运行:

var fruits = [];
fruits.push( "apples" );
fruits.push( "oranges" );

fruits.each( function( fruit ) {
  Response.Write( "<b>" + fruit + "</b>, " );
});

// As will this
var nums = [ 1,2,3,4,5 ];
nums.each( function(i) {
    Response.Write( "<b>" + i + "</b>" );
});

有没有人知道是什么导致了这个错误?我会继续挖掘,但想知道是否有任何 JScript 伙伴可以提供一些启示。可能只是一个 ASP 怪癖?

[更新]

怪异仍在继续,设法让它工作,但它似乎取决于每个循环之前发生的事情。所以回顾一下这是行不通的:

<%

[ 1,2,3,4,5 ].each( function(i) {
    Response.Write( "<b>" + i + "</b>" );
});

%>

但这确实(注意只是在它上面添加了 var 行):

<%

var something = 1;

[ 1,2,3,4,5 ].each( function(i) {
    Response.Write( "<b>" + i + "</b>" );
});

%>

确实很奇怪。必须与 ASP 处理块的方式有关,也许解析器中有一条规则关于以(它会认为相当随机的)数组语句开头的块,或者至少它没有被编程为期望我做那个(我不认为他们想象服务器端的 mootools 早在什么时候)!不过还是希望得到深入的解释,这样我可以更好地避免它。

【问题讨论】:

  • 奇特的......就好像它直到它被传递到一个var中才查找原型链。出于好奇,在 1.2.5 上会发生同样的事情吗?如果在 1.3 中使用 Array.from([1,2,3]).each() 会怎样?
  • Array.from 有效,当我将它添加到我的代码顶部时,我的原始循环也有效!这导致我在我的问题更新中发表评论。它不是 Mootools 问题,我猜只是 ASP“不按这种方式构建”的问题。 Moo 1.2 做了同样的事情。
  • 啊,所以它不会原型数组,直到它“看到”一个实例?好的。 :)

标签: asp-classic mootools javascript


【解决方案1】:

试着把你的代码改成这样……

<%

;[ 1,2,3,4,5 ].each( function(i) {
    Response.Write( "<b>" + i + "</b>" );
});

%>

这只是一种预感。


一般来说,以([ 开头而没有自己的分号的行或特别是文件被认为是不好的做法。主要原因与串联有关...

例如

//foo.js
1 + 1 == 2

//bar.js
("lol, string")

//foo.js + bar.js
1 + 1 == 2("lol, string") // TypeError: number is not a function

由于bar.js 无法知道最终会在它之前包含什么,它应该始终在( 之前包含自己的;,即

//bar.js
;("lol, string")

//foo.js + bar.js
1 + 1 == 2;("lol, string") // SUCCESS!!1!

我的预感是 ASP 领域正在发生类似的奇怪事情。
由于我们无法访问 JScript 的源代码或 ASP 框架本身,因此无法确定发生了什么。

【讨论】:

  • 是的,就是这样。乍一看真的很奇怪,但如果你仔细想想就很有意义。设法让我的代码运行,并且必须对我写的内容更加小心。我现在倾向于自动放置
【解决方案2】:

我从未见过经典 asp 中的 response.writeblock,
不应该是 response.write 吗?

【讨论】:

  • 这是 asp 解析器内部使用的一种未记录的方法。 2enetworx.com/dev/samples/perfblocks.asp
  • 使用 mootools 语法几乎是 JScript 所能得到的一样漂亮。让编写 ASP 成为梦想 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 2021-12-24
  • 1970-01-01
  • 2019-07-21
  • 2015-03-21
  • 2019-10-24
  • 1970-01-01
相关资源
最近更新 更多