单击事件在 jQuery 移动设备和 IE 上触发了两次
Click Event Fired Twice on jQuery Mobile and IE
我有一个 jQuery 移动应用程序,它依赖于 运行 考勤系统的弹出窗口。该系统工作正常,除了 Windows 8+.
上的 IE 版本 9+
当在客户端按下检查 in/out 的按钮时,POST 请求被发送到处理程序页面以在转发之前管理请求(即验证数据、输入数据库)到相关的客户端条目。
似乎正在发生的是按钮事件被触发了两次。第一次被标记为 "Aborted"(如 F12 开发人员工具的 Result
列所示),然后再次调用(我会 post 图片,但没有足够的声誉) .然而,调用似乎正在进入处理程序页面,尽管据称已中止,因为数据库中出现了两个条目。
按钮代码如下:
<button data-inline="true" data-mini="true" data-theme="b" data-ajax="false" id="submitBtn" onClick="this.form.submit(); this.disabled=true;">Check Out / Split Visit</button>
我特意禁用了该按钮,这样用户就无法多次点击该按钮。我尝试了不同的方法来生成按钮,包括使用 a href
并将 data-role
设置为按钮以及使按钮成为 submit
按钮 - 同样的事情发生了。按钮点击时没有其他 JavaScript 运行ning,因为它正在播放某些移动设备(用户验证在处理程序页面上完成)。
我可以通过将 X-UA-Compatible
设置为 IE=7
来强制页面呈现为旧版本的 IE,但这会使应用程序看起来很糟糕,我不确定强制 IE 将页面作为早期版本处理的安全方面。
我正在使用 jQuery Mobile 1.3.2 和 jQuery 1.10.2,因为较新的版本没有我们应用程序的核心功能。后端写在PHP。在 Windows Phone 8、Surface 3 和 Windows 8.1 桌面上重复出现该故障。
弹出代码:
<div data-role="popup" id="checkInOut" data-theme="b" data-dismissible="false" data-overlay-theme="b" class="ui-content" style="max-width:340px; padding-bottom:2em;">
<h3 id="checkTitle">Check-In At Client</h3>
<form action="checkInOutHandler.php" method="post" name="checkInOutForm" id="checkInOutForm" data-ajax="false">
<input type="hidden" name="TAClientID" id="TAClientID" />
<input type="hidden" name="actionType" id="actionType" value="In" />
<label for="useCurrentTime">
Use Current Time
</label>
<input id="useCurrentTime" name="useCurrentTime" type="checkbox" class="useCurrentTime" data-mini="true" checked="checked" />
<!-- Hidden Div for the manual entry of time !-->
<div id="customTimeDiv" style="display: none;">
<label for="customTime">
Enter the time you wish to use (in 24 Hour format hh:mm)
</label>
<input id="customTime" name="customTime" type="time" placeholder="Enter Time (hh:mm)" data-mini="true" />
<label for="customReason">
You MUST select a reason for not using the current time
</label>
<select name="customReason" id="customReason" data-theme="b" data-icon="arrow-d" data-inline="true" data-mini="true">
<option value="" selected>Please select a reason...</option>
<option value='937'>No reception</option><option value='938'>Forgot</option><option value='943'>Phone flat / not working</option><option value='944'>Problem with portal</option><option value='949'>Split Visit</option><option value='964'>Incorrect Client Selected</option><option value='963'>Incorrect Service Selected</option><option value='945'>Other (Payroll may call to confirm)</option> </select>
</div>
<!-- End Hidden Div !-->
<br />
<input type="hidden" id="travelTime" name="travelTime" data-mini="true" data-inline="true" value="0" />
<button data-inline="true" data-mini="true" data-theme="b" data-ajax="false" id="submitBtn" onClick="this.form.submit(); this.disabled=true;">Check In</button>
<a href="#" data-role="button" data-rel="back" data-inline="true" data-mini="true">Cancel</a>
</form>
</div>
Header代码:
<!DOCTYPE html>
<html>
<head>
<title>SMNCC App</title>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="https://portal.suemann.com.au/favicon.ico" />
<!-- <script type="text/javascript" src="./js/timeTrack.js"></script>!-->
<script type="text/javascript" src="./js/readNewsItem.js"></script>
<link rel="stylesheet" href="./jqueryMobile/jquery.mobile.min.css" /> <!-- Original File: jquery.mobile-1.3.2.min.css !-->
<link rel="stylesheet" href="./themes/hartijaPrint.css" type="text/css" media="print"> <!-- Hartija print CSS framework !-->
<script type="text/javascript" src="./jqueryMobile/jquery.min.js"></script> <!-- Original File: jquery-1.10.2.min.js !-->
<script type="text/javascript" src="./jqueryMobile/disableAjax.js"></script>
<script type="text/javascript" src="./jqueryMobile/jquery.mobile.min.js"></script> <!-- Original File: jquery.mobile-1.3.2.min.js !-->
</head>
<body
我不是 运行 Windows 8 所以我无法测试它,但是你可以使用 jQuery 检查按钮是否已经被按下。
例如:Html代码:
<button id="mybutton">Click me!</button>
jQuery:
var alreadySent = false;
$(document).ready(function() {
$("#myButton").click(function(event) {
event.preventDefault();
if (!alreadySent) {
sendPostRequestOrWhatever();
alreadySent = true;
}
$(this).prop("disabled", true);
});
});
当然,这是假设当您说按钮触发两次时,您的意思是点击事件是 运行 两次。如果点击事件仅触发一次但发送请求触发两次,则代码将不起作用。
我有一个 jQuery 移动应用程序,它依赖于 运行 考勤系统的弹出窗口。该系统工作正常,除了 Windows 8+.
上的 IE 版本 9+当在客户端按下检查 in/out 的按钮时,POST 请求被发送到处理程序页面以在转发之前管理请求(即验证数据、输入数据库)到相关的客户端条目。
似乎正在发生的是按钮事件被触发了两次。第一次被标记为 "Aborted"(如 F12 开发人员工具的 Result
列所示),然后再次调用(我会 post 图片,但没有足够的声誉) .然而,调用似乎正在进入处理程序页面,尽管据称已中止,因为数据库中出现了两个条目。
按钮代码如下:
<button data-inline="true" data-mini="true" data-theme="b" data-ajax="false" id="submitBtn" onClick="this.form.submit(); this.disabled=true;">Check Out / Split Visit</button>
我特意禁用了该按钮,这样用户就无法多次点击该按钮。我尝试了不同的方法来生成按钮,包括使用 a href
并将 data-role
设置为按钮以及使按钮成为 submit
按钮 - 同样的事情发生了。按钮点击时没有其他 JavaScript 运行ning,因为它正在播放某些移动设备(用户验证在处理程序页面上完成)。
我可以通过将 X-UA-Compatible
设置为 IE=7
来强制页面呈现为旧版本的 IE,但这会使应用程序看起来很糟糕,我不确定强制 IE 将页面作为早期版本处理的安全方面。
我正在使用 jQuery Mobile 1.3.2 和 jQuery 1.10.2,因为较新的版本没有我们应用程序的核心功能。后端写在PHP。在 Windows Phone 8、Surface 3 和 Windows 8.1 桌面上重复出现该故障。
弹出代码:
<div data-role="popup" id="checkInOut" data-theme="b" data-dismissible="false" data-overlay-theme="b" class="ui-content" style="max-width:340px; padding-bottom:2em;">
<h3 id="checkTitle">Check-In At Client</h3>
<form action="checkInOutHandler.php" method="post" name="checkInOutForm" id="checkInOutForm" data-ajax="false">
<input type="hidden" name="TAClientID" id="TAClientID" />
<input type="hidden" name="actionType" id="actionType" value="In" />
<label for="useCurrentTime">
Use Current Time
</label>
<input id="useCurrentTime" name="useCurrentTime" type="checkbox" class="useCurrentTime" data-mini="true" checked="checked" />
<!-- Hidden Div for the manual entry of time !-->
<div id="customTimeDiv" style="display: none;">
<label for="customTime">
Enter the time you wish to use (in 24 Hour format hh:mm)
</label>
<input id="customTime" name="customTime" type="time" placeholder="Enter Time (hh:mm)" data-mini="true" />
<label for="customReason">
You MUST select a reason for not using the current time
</label>
<select name="customReason" id="customReason" data-theme="b" data-icon="arrow-d" data-inline="true" data-mini="true">
<option value="" selected>Please select a reason...</option>
<option value='937'>No reception</option><option value='938'>Forgot</option><option value='943'>Phone flat / not working</option><option value='944'>Problem with portal</option><option value='949'>Split Visit</option><option value='964'>Incorrect Client Selected</option><option value='963'>Incorrect Service Selected</option><option value='945'>Other (Payroll may call to confirm)</option> </select>
</div>
<!-- End Hidden Div !-->
<br />
<input type="hidden" id="travelTime" name="travelTime" data-mini="true" data-inline="true" value="0" />
<button data-inline="true" data-mini="true" data-theme="b" data-ajax="false" id="submitBtn" onClick="this.form.submit(); this.disabled=true;">Check In</button>
<a href="#" data-role="button" data-rel="back" data-inline="true" data-mini="true">Cancel</a>
</form>
</div>
Header代码:
<!DOCTYPE html>
<html>
<head>
<title>SMNCC App</title>
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="shortcut icon" href="https://portal.suemann.com.au/favicon.ico" />
<!-- <script type="text/javascript" src="./js/timeTrack.js"></script>!-->
<script type="text/javascript" src="./js/readNewsItem.js"></script>
<link rel="stylesheet" href="./jqueryMobile/jquery.mobile.min.css" /> <!-- Original File: jquery.mobile-1.3.2.min.css !-->
<link rel="stylesheet" href="./themes/hartijaPrint.css" type="text/css" media="print"> <!-- Hartija print CSS framework !-->
<script type="text/javascript" src="./jqueryMobile/jquery.min.js"></script> <!-- Original File: jquery-1.10.2.min.js !-->
<script type="text/javascript" src="./jqueryMobile/disableAjax.js"></script>
<script type="text/javascript" src="./jqueryMobile/jquery.mobile.min.js"></script> <!-- Original File: jquery.mobile-1.3.2.min.js !-->
</head>
<body
我不是 运行 Windows 8 所以我无法测试它,但是你可以使用 jQuery 检查按钮是否已经被按下。
例如:Html代码:
<button id="mybutton">Click me!</button>
jQuery:
var alreadySent = false;
$(document).ready(function() {
$("#myButton").click(function(event) {
event.preventDefault();
if (!alreadySent) {
sendPostRequestOrWhatever();
alreadySent = true;
}
$(this).prop("disabled", true);
});
});
当然,这是假设当您说按钮触发两次时,您的意思是点击事件是 运行 两次。如果点击事件仅触发一次但发送请求触发两次,则代码将不起作用。