我正在研究通知系统并将数据库中的html通知正文加载到以下填充的视图中:
<form id="acceptInviteForm" method="POST">
<input type="hidden" name="accountId" value="6">
<input type="hidden" name="operation" value="acceptinvite">
<button class="acceptinvite btn btn-primary" href="/acceptinvite" onclick="acceptingRequest();">Accept Invitation</button>
</form>
并应用我在同一页面上定义的jQuery函数是这样的:
// Accept invitation button click
jQuery(document).ready(function() {
function acceptingRequest() {
var formData = jQuery("#acceptInviteForm").serialize();
alert(formData);
jQuery.ajax({
type: "POST",
url: "/acceptinvite",
data: formData,
dataType: "json",
beforeSubmit: function() {
jQuery(this).attr({"disabled":"disabled"});
},
success: function(data) {
alert("Success");
},
error: function() {
alert("Got error while accepting invitation, reload or contact administrator!");
}
});
}
});
因此,当用户点击按钮时,即使没有显示alert
也无法正常工作。
但是当我在Chrome控制台上注入上面的jquery函数时,事情变得越来越有趣 ,同时加载了视图并且按钮开始正常工作并显示警告太!
我没有得到不让事情奏效的观点!
答案 0 :(得分:0)
我认为你在文件就绪上定义函数acceptingRequest(),但你并没有真正调用它。尝试添加:
acceptingRequest();
在accepttingRequest()函数的定义之后。结果将是:
// Accept invitation button click
jQuery(document).ready(function() {
function acceptingRequest() {
var formData = jQuery("#acceptInviteForm").serialize();
alert(formData);
jQuery.ajax({
type: "POST",
url: "/acceptinvite",
data: formData,
dataType: "json",
beforeSubmit: function() {
jQuery(this).attr({"disabled":"disabled"});
},
success: function(data) {
alert("Success");
},
error: function() {
alert("Got error while accepting invitation, reload or contact administrator!");
}
});
}
acceptingRequest();
});
答案 1 :(得分:0)
这是因为这个字符串
<button class="acceptinvite btn btn-primary" href="/acceptinvite" onclick="acceptingRequest();">Accept Invitation</button>
浏览器将在您的acceptingRequest
函数定义之前提取。当document ready
被触发时,代码中的'acceptingRequest'将被异步定义。因此浏览器无法使用click
侦听器进行分配。尝试将您的脚本准确地放在</body>
之前(以及jQuery
脚本之后)且没有jQuery(document).ready
<script>
function acceptingRequest() {
var formData = jQuery("#acceptInviteForm").serialize();
alert(formData);
jQuery.ajax({
type: "POST",
url: "/acceptinvite",
data: formData,
dataType: "json",
beforeSubmit: function() {
jQuery(this).attr({"disabled":"disabled"});
},
success: function(data) {
alert("Success");
},
error: function() {
alert("Got error while accepting invitation, reload or contact administrator!");
}
});
}
</script>
</body>
答案 2 :(得分:0)
这是因为您的 acceptingRequest函数仅在匿名jQuery(文档).ready callback 中可见。
所以当你点击按钮时,acceptingRequest不可见。
要解决此问题,请使用$('button.acceptinvite').on('click',acceptingRequest)
或使用匿名回调(类似这样):
$('button.acceptinvite').on('click',function(){
var formData = jQuery("#acceptInviteForm").serialize();
alert(formData);
//Etc.
});
在这两种情况下,请删除onclick="acceptingRequest();"
,因为不再需要它。
另一个选择是使用全局变量使accepttingRequest在外面可见(它不是一个好的做法):
acceptingRequest = function () {
var formData = jQuery("#acceptInviteForm").serialize();
alert(formData);
//Etc.
}
现在,在jQuery()之外可以看到acceptingRequest。准备就绪,你可以做onclick =&#34; acceptingRequest();&#34;
如果您不需要完全加载DOM(就像在这种情况下一样),您可以删除 jQuery(document).ready(function(){})并且只是从头开始编写你的函数,因此按钮可以看到它们。
<script>
function acceptingRequest() {
var formData = jQuery("#acceptInviteForm").serialize();
alert(formData);
//Etc.
}
</script>
请告诉我这是否有用。
答案 3 :(得分:0)
在就绪状态下定义的函数可以在其自己的作用域中使用。因此,您可以在就绪状态下使用acceptingRequest()方法。
在我看来下面的代码是事件绑定中的最佳实践:
<form id="acceptInviteForm" method="POST">
<input type="hidden" name="accountId" value="6">
<input type="hidden" name="operation" value="acceptinvite">
<button class="acceptinvite btn btn-primary" id="acceptInviteButton" href="/acceptinvite" onclick="acceptingRequest();">Accept Invitation</button>
</form>
并处于准备状态:
jQuery(document).ready(function() {
function acceptingRequest() {
var formData = jQuery("#acceptInviteForm").serialize();
alert(formData);
jQuery.ajax({
type: "POST",
url: "/acceptinvite",
data: formData,
dataType: "json",
beforeSubmit: function() {
jQuery(this).attr({"disabled":"disabled"});
},
success: function(data) {
alert("Success");
},
error: function() {
alert("Got error while accepting invitation, reload or contact administrator!");
}
});
}
$("#acceptInviteButton").on("click",acceptingRequest);
});