【问题标题】:Wicked PDF not making AJAX / JS calls邪恶的 PDF 不进行 AJAX / JS 调用
【发布时间】:2020-01-22 10:50:53
【问题描述】:

我目前正在使用 JS 和 Ajax 请求来编辑一些 HTML 标签,具体取决于某些控制器方法的结果。在我想生成 PDF 之前,这一切正常,我一直在做一些研究,并使用 javascript_delaywindow-status 找到了一些“解决方案”,但是失败了。

按照 wkhtmltopdf 的指南,我正在使用 wicked_pdf_javascript_include_tag 加载 JS 文件,并且正在编写和保存该文件,但我不知道是否正在执行 Javascript因为“视觉”部分是在 .js 文件的 AJAX 部分中生成的,而 PDF 中没有显示。

控制器正在返回一个我想在 HTML 容器中可视化的完整 HTML:

$.ajax({
  url: "/monitor/device/"+widget.property.device_sensor,
  type: 'GET',
  dataType: 'html'
}).done(function (datos) {
  $container.html(datos);
}).always(function () {
  redBorder.widgets.util.reloadDone($container.parents('.widget'));
});

这是在 Rails 中使用 GEM wkhtmltopdf

我如何知道 JS 正在执行,如果它正在执行并且问题出在 AJAX 调用上,该如何解决?

【问题讨论】:

    标签: javascript ruby-on-rails ajax wicked-pdf


    【解决方案1】:

    在使用wicked-pdf 渲染期间,页面将保存到磁盘上的临时文件中,并通过file:// 协议打开。结果是该页面对您的服务器地址一无所知,即使它知道 - 它也会有不同的来源,默认情况下会阻止 ajax 调用(需要设置 CORS 以绕过它)。

    对于 pdf,最好摆脱 ajax 调用,因为显然不会有用户交互,并且会在视图中呈现所有必要的数据。

    【讨论】:

      【解决方案2】:

      试试这样的:

      var httpRequest;
          if (window.XMLHttpRequest) { // Mozilla, Safari, ...
            httpRequest = new XMLHttpRequest();
          } else if (window.ActiveXObject) { // IE
            try {
              httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
            }
            catch (e) {
              try {
                httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
              }
              catch (e) {}
            }
          }
          if (!httpRequest) {
            alert('Giving up :( Cannot create an XMLHTTP instance');
            return false;
          }
          httpRequest.open('GET', url);
          httpRequest.withCredentials = true;
          httpRequest.responseType = 'text';
          httpRequest.onreadystatechange = function(){
            if (httpRequest.readyState === 4) {
              /do stuff
            }
          };
          httpRequest.send();
      

      这用纯 javascript 替换了 ajax 调用。希望这对您有所帮助,佩德罗。

      【讨论】:

      • 感谢弗兰克的回复,我已经尝试过了,但没有成功,因为控制器和 XMLHttpRequest 之间仍然存在一些通信错误。这显然是使用 cookie 解决的,但我们没有收到控制器返回的信息。有关更多信息,请参阅:stackoverflow.com/questions/59895869/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 1970-01-01
      • 2014-12-12
      • 2013-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      相关资源
      最近更新 更多