代码之家  ›  专栏  ›  技术社区  ›  denisjacquemin

format.js响应不执行

  •  0
  • denisjacquemin  · 技术社区  · 16 年前

    我使用Rails 3.0.0测试版

    在一个操作之后,我的rjs视图返回javascript,但是代码没有被执行

    在萤火虫中我看到了我的反应

    $('polaroids').insert("<li>\n  <a title=\"4204497503_a0c43c561d.jpg\" href=\"#\">\n    <img alt=\"4204497503_a0c43c561d.jpg\" src=\"/system/photos/279/original/4204497503_a0c43c561d.jpg?1268857318\" />\n  <\/a>\n<\/li>")
    

    下面是生成请求的javascript

    function send(file, url) {
        try {
            var xhr = new XMLHttpRequest;
    
            var boundary    = generateBoundary();
    
            var contentType = "multipart/form-data; boundary=" + boundary;
    
            xhr.upload.addEventListener("loadstart", (function(e){
                $('progress_'+file.name).update('0%');
            }), false);
    
            xhr.upload.addEventListener("progress", (function(e) {
                  if (e.lengthComputable) {
                      var percentage = Math.round((e.loaded * 100) / e.total);
                      $('progress_'+file.name).update(percentage + '%');
                  }
            }), false);
    
    
            xhr.open("POST", url, true);
            xhr.onreadystatechange = function() {
                if (xhr.readyState === 4) {
                   // done
                }
            };
    
            xhr.setRequestHeader("Content-Type", contentType);
            xhr.setRequestHeader("Accept", "text/javascript");
    
            var CRLF  = "\r\n";
            var request = "--" + boundary  + CRLF;
    
            request += 'Content-Disposition: form-data; ';
            request += 'name="' + 'photo[name]' + '"' + CRLF + CRLF;
            request += file.name + CRLF;
    
            request += "--" + boundary + CRLF;
    
            request += 'Content-Disposition: form-data; ';
            request += 'name="' + 'photo[photo]' + '"; ';
            request += 'filename="'+ file.fileName + '"' + CRLF;
    
            request += "Content-Type: application/octet-stream" + CRLF + CRLF;
            request += file.value + CRLF;
            request+= "--" + boundary + "--" + CRLF;
    
            xhr.sendAsBinary(request);
    
        } catch(e) {
            alert('send Error: ' + e);
        }
    }
    

    这是控制器

      def remote_create
        @photo = Photo.new(params[:photo])
        @photo.save
        respond_to do |format|
          format.js
        end
      end
    

    这是响应头

    Response Headers
    Etag    "7343b21b2f062fb74b7d5f32e3a83c2c"
    Connection  Keep-Alive
    Content-Type    text/javascript; charset=utf-8
    Date    Wed, 17 Mar 2010 20:21:58 GMT
    Server  WEBrick/1.3.1 (Ruby/1.8.7/2008-08-11)
    X-Runtime   0.060497
    Content-Length  220
    Cache-Control   max-age=0, private, must-revalidate
    Set-Cookie  _photos_session=BAh7ByIQX2NzcmZfdG9rZW4iMS9OWnpOZUR6UGQ2UDhvbGt5YWpTWXhJcFR2YjRHOEhzZHlIbmdMblRlMWs9Ig9zZXNzaW9uX2lkIiUxNjlhOWYzNjQxODE2N2NjN2FiNmYzY2VkYmU3OTgwYQ%3D%3D--022d7202178b2cc7bf968e558c2ae67ecef1fb74; path=/; HttpOnly
    

    有什么特别的要求让它工作吗?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Derek Lucas    14 年前

    对于那些,像我一样,遇到问题的人 Ajax File Uploader 而且carrierWave没有执行返回的javascript,这是由于同样的原因。这是因为写文件上传程序的目的是假设返回给它的所有内容都是json,然后重写它来计算responsetext,而不是将它放入一个变量中,从而修复了这个问题。

    我发帖完全是为了不让别人花上几个小时去想是虫子造成的。

        2
  •  0
  •   JP Silvashy Gautam Rege    16 年前

    错误是您的js:

    $('polaroids').insert("<li>\n  <a title=\"4204497503_a0c43c561d.jpg\" href=\"#\">\n    <img alt=\"4204497503_a0c43c561d.jpg\" src=\"/system/photos/279/original/4204497503_a0c43c561d.jpg?1268857318\" />\n  <\/a>\n<\/li>")
    

    你可能在找一个目标 div 或者某个元素 id 或 class 但你只是 $('polaroids') ,也许可以试试 $('.polaroids') 或 $('#polaroids') 这取决于你的html是什么样的。

        3
  •  0
  •   denisjacquemin    16 年前

    我找到了解决方案,我的ajax请求是手工构建的,我没有使用prototype或jquery。 要在响应中执行javascript,我必须添加以下代码

    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4) {
            eval(xhr.responseText || '');
        }
    };