代码之家  ›  专栏  ›  技术社区  ›  Pete Duncanson

在服务器端ASP JScript中使用Moools时出现response.writeBlock错误

  •  4
  • Pete Duncanson  · 技术社区  · 15 年前

    我今天一直在玩moools1.3服务器端。它真的很好,花了一些抨击,使它经典的ASP友好,但仍然充满美德(tm)。

    在向朋友展示mootools可以做什么的时候,我遇到了一个与ASP相关的奇怪错误,这是我以前从未见过的。

    Microsoft JScript runtime error '800a138f'
    
    'Response.WriteBlock(...)' is null or not an object
    

    导致这种情况的代码是moootools的一个时髦的“foreach”助手:

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

    它完全不喜欢这个代码。我把响应注释掉了,写了一个空块,它仍然抛出了错误。非常奇怪。我知道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怪癖?

    [更新]

    Wierdness继续工作,设法让它工作,但它似乎取决于每个循环之前发生了什么。综上所述,这是行不通的:

    <%
    
    [ 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处理块的方式有关,也许解析器中有一个关于块的规则,从一个(它认为是随机的)数组语句开始,或者至少它没有被编程为期望我这样做(我不认为他们想象的服务器端moootools回来的时候)!但我还是希望有一个深入的解释,这样我才能更好地避免它。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Thomas Aylott    15 年前

    试着把你的代码改成这个_

    <%
    
    ;[ 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
  •  0
  •   Frank    15 年前

    我从未在经典ASP中看到response.writeBlock,
    不是应该是响应吗?写?