我搜索过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>
结果很接近但不完全。
我不明白为什么会这样,我也找不到另一种方法来实现这个结果。
欢迎所有建议。
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)?
答案 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:...”)的第一个字符。