我正在使用使用原型(prototype)库的第三方软件。在 Firefox 最新更新(版本 68 及以上)之前,它运行良好。它仍然可以在其他浏览器中运行。我尝试调试,每当我引入断点并逐步执行代码时,代码就会工作。我发现了以下代码行,如果我跳过并让代码运行,问题就可以解决。但如果我让代码在此之前运行,就会出现问题。
return formView.submit();
有什么想法吗?我什至可以接受黑客攻击。
更新:
我按照建议创建了 MRE。这是链接https://brandsoftinfotech.com/test/firefox-frame-submit/
我创建了 2 个表单,一个在父页面中,一个在框架中。在提交父页面表单时,框架页面表单被提交并将数据写入日志文件中。提交时的表单页面仅显示该日志文件中的数据。
index.html
<!DOCTYPE html>
<html>
<head>
<script>
function submitFunction() {
var myFrame = document.getElementById("myFrame");
var myForm = myFrame.contentWindow.document.getElementById("myForm");
myForm.submit();
}
</script>
</head>
<body>
<form action="index-submit.php" onSubmit="submitFunction()">
<input type="submit" value="Submit">
</form>
<iframe id="myFrame" src="frame-box.html"></iframe>
</body>
</html>
frame-box.html
<form action="frame-submit.php" id="myForm">
First name:<br>
<input type="text" name="firstname" value="Mickey"><br>
Last name:<br>
<input type="text" name="lastname" value="Mouse"><br><br>
</form>
这在 Chrome、MS Edge 上运行良好,但在 Firefox 上不起作用。
我不确定解决这个问题是否可以解决我的问题,但至少这应该适用于我的库代码。
最佳答案
我有点惊讶地发现它可以在任何浏览器上运行。通过允许父级表单提交,您将拆除该页面,这意味着拆除 iframe,并且可以中止任何可能正在进行的请求(或者如果没有完全启动,则永远不会启动)。
我可能会切换到 ajax,而不是进行实际的表单提交。
但是,如果您想进行表单提交,为了可靠地执行此操作,您必须等待框架的提交完成,然后再进行父级提交。做到这一点的简单方法是让框架提交响应一个带有 JavaScript 的小页面,告诉父级它已完成:
<!DOCTYPE html>
<html>
<body>
<script>
if (parent && parent.formCallback) {
parent.formCallback();
}
</script>
</body>
</html>
那么父页面是这样的:
<!DOCTYPE html>
<html>
<head>
<script>
function submitFunction() {
var myFrame = document.getElementById("myFrame");
var myForm = myFrame.contentWindow.document.getElementById("myForm");
myForm.submit();
return false; // <−−−−−−−− cancel submission
}
function formCallback() { //
document.getElementById("parentForm").submit(); // <−−−−−−−− Submit on callback
} //
</script>
</head>
<body>
<!-- vvvvvvvvvvvvvvv−−−−−−−− Added ID -->
<form id="parentForm" action="/index-submit" onSubmit="return submitFunction()">
<input type="hidden" name="index-field" value="x">
<input type="submit" value="Submit">
</form>
<iframe id="myFrame" src="frame-box.html"></iframe>
</body>
</html>
但是您可能只需检测 iframe 中位置的变化就可以逃脱惩罚。这将涉及仅更改父页面,如下所示:
<!DOCTYPE html>
<html>
<head>
<script>
function submitFunction(form) { // <−−−−−−−− Added parameter
var myFrame = document.getElementById("myFrame");
var myForm = myFrame.contentWindow.document.getElementById("myForm");
myForm.submit();
// Wait for the location of the iframe window to change
setInterval(function() {
if (String(myFrame.contentWindow.location).includes("frame-submit")) {
// Frame's form submitted, we can submit ours
form.submit();
}
}, 100);
return false; // <−−−−−−−− cancel submission
}
</script>
</head>
<body>
<form action="/index-submit" onSubmit="return submitFunction(this)">
<!-- ^^^^−−−−−−−−− added argument -->
<input type="hidden" name="index-field" value="x">
<input type="submit" value="Submit">
</form>
<iframe id="myFrame" src="frame-box.html"></iframe>
</body>
</html>
如果框架中的表单进行了大量上传,我不认为它会起作用(尽管我对此可能是错误的)。
关于javascript - Firefox 最新更新 - Javascript 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58725367/