Ajax / jquery结果不会显示在iframe中。显示在新页面

时间:2017-06-26 02:51:24

标签: javascript jquery html ajax iframe

我搜索过stackoverflow和其他论坛,但我无法解决所描述的问题。下方。

该问题在IE 11和Firefox 10.0.2中以相同的方式表现出来。

我想将一个表单提交(POST)到一个网站(http://mirgo2.co.uk/bridgesolver),并在页面上显示结果(带有发牌人的桥牌表)。

javascript如下:

<script>
// -------------Create the form
  var formData = new FormData();
  var content = '[Board "1"]' + '\n' +
               '[Dealer "N"]' + '\n' +
               '[Vulnerable "EW"]' + '\n' +
               '[Deal "N:K97.K43.6432.QT8 Q52.765.KJ.76543 AT8.AQ2.9875.AK9 J643.JT98.AQT.J2"]'; // the body of the new file...
  var blob = new Blob([content], { type: "text/plain"});

  formData.append( "fileToUpload", blob, "somename.pbn" )

  formData.append("event",0); 

// ------------Submit the form
      $.ajax({
          url: 'http://mirgo2.co.uk/bridgesolver/upload_file.php',
          type: 'POST',
          data: formData,
          async: false,
          cache: false,
          contentType: false,
          processData: false,
          success: function (returndata) {
              $("#theTarget").html(returndata);
              alert(formData);
          },
          error: function () {
              alert("error in ajax form submission");
          }
      });
</script>

目标是iframe,在页面上定义如下:

<iframe id="theTarget" name="theTarget" ></iframe>

结果很接近但不完全。

  1. 表单按预期提交,如Firefox F12所示 网络显示
  2. 提交返回成功,如显示的formData alert
  3. 所示
  4. iframe在警告
  5. 后面的页面上显示为空
  6. 相反,在成功提醒单击“确定”后,请求的数据会单独显示 。包含iframe的页面 消失,电路板显示在同一个浏览器窗口中。
  7. 我不明白为什么会这样,我也找不到另一种方法来实现这个结果。

    欢迎所有建议。

    Bram van Oosterhout

    PS:评论提醒我以下可能是相关的。 发出请求的页面从域bram.van-oosterhout.org返回 该请求发布到域mirgo2.co.uk。 浏览器窗口中的成功显示源自dds.bridgewebs.com

    使用iframe的建议特定于结果的域不是返回包含ajax请求的页面的域。

    我还应该在上面说过,当服务器mirgo2.co.uk返回错误消息时,该机制可以正常工作。当文件名不正确时(例如:somename.txt),服务器(mirgo2.co.uk)会返回错误消息,该消息显示在页面上的正确位置。但是当从dds.bridgewebs.com返回正确的结果时,我的页面将被dds.bridgewebs.com提供的结果取代。

    更新27/6/2017 11:20: 我想我找到了问题的原因。

    mirgo2.co.uk返回的代码是:

    <script language="JavaScript" type="text/JavaScript">
    var filename="http://mirgo2.co.uk/bridgesolver/uploads/5951a6d4a9d308.60317801.pbn";
    </script>
    <body>
    <script language="JavaScript" type="text/JavaScript">
    location.replace("http://dds.bridgewebs.com/bsol2/ddummy.htm?club=bsol_site&file=" + filename);</script>
    </body>
    

    当它放在iframe中时,它会被执行,而location.replace将替换整个页面。

    这解释了症状。

    我对javascript API不太熟悉。如何将上述内容翻译成所需的returnsndata =“http://dds.bridgewebs.com/bsol2/ddummy.htm?club=bsol_site&file=”+ filename)?

2 个答案:

答案 0 :(得分:0)

我已经通过蛮力解决了这个问题。该实现适用于:

  success: function (returndata) {
      $("#theTarget").html(returndata);

替换为:

  success: function (returndata) {
    var re = new RegExp(
      '\"(http://mirgo2.co.uk/bridgesolver/uploads/.*?.pbn)\"' +
      '[\\s\\S]*?' +
      '\"(http://dds.bridgewebs.com/.*?=)\"'   
       );
    var myResult = returndata.match( re );

    document.getElementById('theTarget').setAttribute( 'src',
                                 myResult[2] + myResult[1] );

正则表达式提取返回内容中的两个URL。 iframe然后显示网址请求的数据。

上面讨论了导致我这样做的观察结果。

我强烈推荐IE 11 F12调试工具。特别是网络选项卡和子选项卡。

感谢收听。

答案 1 :(得分:0)

我也对使用相同的基础网站获得双重虚拟解决方案感兴趣。就我而言,我想发出HTTP GET请求以获得解决方案。作为一个标准测试,我通过了一个要求,北拥有所有黑桃,东拥有所有心,南拥有所有钻石,西拥有所有俱乐部。漏洞为无。

curl "https://dds.bridgewebs.com/cgi-bin/bsol2/ddummy?request=m&dealstr=N:AKQJT98765432...%20.AKQJT98765432..%20..AKQJT98765432.%20...AKQJT98765432&vul=None"

该网站以json字符串作为响应

{"sess":{"sockref":"(null)","ddtricks":"0d0d00d0d000d0d00d0d"},"contractsNS":"NS:NS 7S","contractsEW":"EW:NS 7S","scoreNS":"NS 1510","scoreEW":"EW -1510","vul":"0"}

“ ddtricks”项被编码为5x4的十六进制数字矩阵。前五个十六进制数字是North的技巧计数(NT,黑桃,心,钻石,球棒),其次是South,East和West。方向和西服始终是固定的。但是,请求字符串可以将任何方向编码为dealstr(“ N:...”)的第一个字符。