Jquery 处理回调函数时提交导致严重问题
Jquery Submit is causing a serious issue while processing the callback function
我已经编写了一个程序,在为 行和列中的框数 取值后,我试图通过该程序创建网格。当我通过单击提交按钮提交表单时;我无法查看效果,因为它们会在几秒钟内消失。
现在,当我使用 click 事件处理程序 处理同一事件时,我能够看到我的所有效果。为什么 提交事件处理程序 失败而 单击事件处理程序 成功? 按下提交按钮后我的输出在几秒钟内消失背后的逻辑是什么,而另一方面当我使用 单击事件处理程序?
所需的输出由下面的脚本给出 ->
$(()=>{
function grid(row, col){
for(let i=1; i<=(row*col); ++i)
$('.Grid').append($('<div></div>').addClass("Tile"));
}
$('button').click(()=>{
$('.Grid').width($('#a').val() * 40);
$('.Grid').height($('#b').val() * 40);
grid($('#a').val(), $('#b').val());
});
});
.Grid{
font-size: 0px;
border: 2px solid blue;
}
.Tile{
height: 40px;
width: 40px;
border-radius: 6px;
background-color: grey;
display: inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="Grid"></div>
<button>Display!</button>
<form>
columns -> <input id="a" type="number"> <br/>
rows -> <input id="b" type="number"> <br/>
</form>
瞬时(不需要)输出由以下脚本给出 ->
$(()=>{
function grid(row, col){
for(let i=1; i<=(row*col); ++i)
$('.Grid').append($('<div></div>').addClass("Tile"));
}
$('form').submit(()=>{
$('.Grid').width($('#a').val() * 40);
$('.Grid').height($('#b').val() * 40);
grid($('#a').val(), $('#b').val());
});
});
.Grid{
font-size: 0px;
border: 2px solid blue;
}
.Tile{
height: 40px;
width: 40px;
border-radius: 6px;
background-color: grey;
display: inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="Grid"></div>
<form>
columns -> <input id="a" type="number"> <br/>
rows -> <input id="b" type="number"> <br/>
<input type="submit" value="submit">
</form>
当您提交表单时,浏览器会在尝试“提交”数据时执行整页重新加载,通常是提交到表单的 action
属性中指定的位置。这是 100% 的预期行为。
您可以通过在提交表单时拦截事件来防止这种默认行为。在您的代码中,当您添加 submit
处理程序时,您可以访问底层 event
和一个名为 preventDefault()
.
的函数
当你调用它时,事件停止。这里有更多 in-depth 解释它是如何工作的:https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault
我已经用一个有效的例子更新了你的代码片段:
$(() => {
function grid(row, col) {
for (let i = 1; i <= (row * col); ++i)
$('.Grid').append($('<div></div>').addClass("Tile"));
}
$('form').submit((event) => {
event.preventDefault();
$('.Grid').width($('#a').val() * 40);
$('.Grid').height($('#b').val() * 40);
grid($('#a').val(), $('#b').val());
});
});
.Grid {
font-size: 0px;
border: 2px solid blue;
}
.Tile {
height: 40px;
width: 40px;
border-radius: 6px;
background-color: grey;
display: inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="Grid"></div>
<form>
columns -> <input id="a" type="number" /> <br/> rows -> <input id="b" type="number" /> <br/>
<input type="submit" value="submit" />
</form>
我已经编写了一个程序,在为 行和列中的框数 取值后,我试图通过该程序创建网格。当我通过单击提交按钮提交表单时;我无法查看效果,因为它们会在几秒钟内消失。
现在,当我使用 click 事件处理程序 处理同一事件时,我能够看到我的所有效果。为什么 提交事件处理程序 失败而 单击事件处理程序 成功? 按下提交按钮后我的输出在几秒钟内消失背后的逻辑是什么,而另一方面当我使用 单击事件处理程序?
所需的输出由下面的脚本给出 ->
$(()=>{
function grid(row, col){
for(let i=1; i<=(row*col); ++i)
$('.Grid').append($('<div></div>').addClass("Tile"));
}
$('button').click(()=>{
$('.Grid').width($('#a').val() * 40);
$('.Grid').height($('#b').val() * 40);
grid($('#a').val(), $('#b').val());
});
});
.Grid{
font-size: 0px;
border: 2px solid blue;
}
.Tile{
height: 40px;
width: 40px;
border-radius: 6px;
background-color: grey;
display: inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="Grid"></div>
<button>Display!</button>
<form>
columns -> <input id="a" type="number"> <br/>
rows -> <input id="b" type="number"> <br/>
</form>
瞬时(不需要)输出由以下脚本给出 ->
$(()=>{
function grid(row, col){
for(let i=1; i<=(row*col); ++i)
$('.Grid').append($('<div></div>').addClass("Tile"));
}
$('form').submit(()=>{
$('.Grid').width($('#a').val() * 40);
$('.Grid').height($('#b').val() * 40);
grid($('#a').val(), $('#b').val());
});
});
.Grid{
font-size: 0px;
border: 2px solid blue;
}
.Tile{
height: 40px;
width: 40px;
border-radius: 6px;
background-color: grey;
display: inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="Grid"></div>
<form>
columns -> <input id="a" type="number"> <br/>
rows -> <input id="b" type="number"> <br/>
<input type="submit" value="submit">
</form>
当您提交表单时,浏览器会在尝试“提交”数据时执行整页重新加载,通常是提交到表单的 action
属性中指定的位置。这是 100% 的预期行为。
您可以通过在提交表单时拦截事件来防止这种默认行为。在您的代码中,当您添加 submit
处理程序时,您可以访问底层 event
和一个名为 preventDefault()
.
当你调用它时,事件停止。这里有更多 in-depth 解释它是如何工作的:https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault
我已经用一个有效的例子更新了你的代码片段:
$(() => {
function grid(row, col) {
for (let i = 1; i <= (row * col); ++i)
$('.Grid').append($('<div></div>').addClass("Tile"));
}
$('form').submit((event) => {
event.preventDefault();
$('.Grid').width($('#a').val() * 40);
$('.Grid').height($('#b').val() * 40);
grid($('#a').val(), $('#b').val());
});
});
.Grid {
font-size: 0px;
border: 2px solid blue;
}
.Tile {
height: 40px;
width: 40px;
border-radius: 6px;
background-color: grey;
display: inline-block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="Grid"></div>
<form>
columns -> <input id="a" type="number" /> <br/> rows -> <input id="b" type="number" /> <br/>
<input type="submit" value="submit" />
</form>