诡异问题,click事件需要第二次点击才执行

staywithc 2011-07-19 06:45:37
使用jquery
在提交按钮上绑定了事件,大概100多行代码。
其中涉及到遍历、json格式化等方法。

现象:
页面加载后,第一次点击没有任何反应。
第二次才会正确的执行流程。

难道是js太多,处理太慢?

我现在的解决方案:在ready事件里预先click()了一次,这样在用户点击的时候,就好像只点一次就成功了一样。

但我感觉这样的方式不太正常,不知道还有其他什么别的原因?各位是否也碰到过类似的问题?
...全文
488 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
小笨熊 2011-07-20
  • 打赏
  • 举报
回复
lz你单步debug下,看看第一次button click时有没有触发ajax事件,看看是不是阻塞了。
小笨熊 2011-07-20
  • 打赏
  • 举报
回复
没遇到过这个问题,学习下。。。
staywithc 2011-07-20
  • 打赏
  • 举报
回复
就是普通的button,第一次点击没有反应,第二次点击才会执行ajax提交事件。
yksyuan 2011-07-20
  • 打赏
  • 举报
回复
点击后 刷新 执行么??????????
staywithc 2011-07-20
  • 打赏
  • 举报
回复
最后在ready事件里面绑定:


//提交
$("#btnSubmit").click(function(){
doSubmit(false);
});
staywithc 2011-07-20
  • 打赏
  • 举报
回复


//提交
var doSubmit = function(istemp){
if(!onSubmitBefore()){return false;}
if(isContainData()){
formatJson();
if(isSomeUnitNoData())
{
if(!confirm( istemp ? "@(confirmStrSaveLater)" : "@(confirmStr)")){return false;}
}
else {
if(!confirm("有些预算单元的数据为空,确认要提交?")){return false;}
}
getWin("winLoading").center().open();
$.post("/Project/SubmitBudget",{
jsonStr : JSON.stringify(container),
projectId : "@Model.ProjectID",
budgetUnitType : "@Model.Scale.BudgetUnitType",
sd : "@Model.Scale.StartDate",
ed : "@Model.Scale.EndDate",
isTemp : istemp
},function(d){
if(d == "1"){
window.location.href = "/Project/Budget?projectID=@(Model.ProjectID)";
}
else if(d == "-1"){
alert("System Error");
}
else{
alert(d);
}
});
}
else{
alert("@Resource.Lang.Message_Error_NoDataNeedSave");
}
};

var onSubmitBefore = function(){
var r = validDetail();
if(r){
var scaleObj = genObj();
var r = false;
for(var i=0;i<container.length;i++)
{
if(container[i].DateKey == scaleObj.DateKey)
{
r = true;
container[i] = scaleObj;
break;
}
}
if(!r){
container.push(scaleObj);
}
//除了保存当前页数据,还需要把每个预算单元的数据也构造出来(如果没有的话)
for(var i=0;i<dateRange.length;i++){
var f = false;
for(var j=0;j<container.length;j++){
if(container[j].DateKey == dateRange[i]){
f = true;
break;
}
}
if(!f){
container.push({
DateKey : dateRange[i],
HrJsonStr : new Array(),
OtherJsonStr : new Array()
});
}
}
}
return r;
};
//常规校验
var validDetail = function () {
var r = true;
var numRegex = new RegExp("^[+]?(([0-9]{1,8}\d*))$");
//var dobuleRegex = new RegExp(/^[+]?(([1-9]\d{1,7}[.]?)|(0.))(\d{0,2})?$/);
var dobuleRegex = new RegExp(/^(\d{1,8})(\.\d{1,2})?$/);
var dateRegex = new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$");
$("#tbodyHrBudget tr").each(function(){
var numTb = $(this).find("input.amount");
if(!numRegex.test(numTb.val())){
numTb.addClass("t-state-error");
r = false;
}
else {
numTb.removeClass("t-state-error");
}
if(!r){
return false;
}
});
$("#tbodyOtherBudget tr").each(function(){
var numTb = $(this).find("input.amount");
var sel = $(this).find("select.occurtype");
var dateTb = $(this).find("input.t-input");
if(!dobuleRegex.test(numTb.val())){
numTb.addClass("t-state-error");
r = false;
}
else {
numTb.removeClass("t-state-error");
}
//如果是一次性成本,需要校验日期
var dstr = dateTb.val();
if(sel.val() == "1"){
if(!dateRegex.test(dstr)){
dateTb.addClass("t-state-error");
r = false;
}
else{
//范围也需要在进度安排范围之内
var sd = ("@(budgetSd)").toDate();
var ed = ("@(budgetEd)").toDate();
var d = dstr.toDate();
if( d<sd || d>ed)
{
dateTb.addClass("t-state-error");
alert("@Resource.Lang.Message_Info_DataNeedBetween");
r = false;
}
else {
dateTb.removeClass("t-state-error");
}
}
}

if(!r){
return false;
}
});
return r;
};
var formatJson = function(){
for(var i=0;i<container.length;i++){
for(var j=0;j<container[i].OtherJsonStr.length;j++){
container[i].OtherJsonStr[j].OccurDate = formatDateStr(container[i].OtherJsonStr[j].OccurDate);
}
}
};
//是否有了待提交的数据
var isContainData = function(){
var r = false;
for(var i=0;i<container.length;i++){
if(container[i].HrJsonStr.length > 0 || container[i].OtherJsonStr.length > 0){
r = true;
break;
}
}
return r;
};
var isSomeUnitNoData = function(){
var r = true;
for(var i=0;i<container.length;i++){
if(container[i].HrJsonStr.length == 0 && container[i].OtherJsonStr.length == 0){
r = false;
break;
}
}
return r;
};

var formatDateStr = function(str){
if(str != "" && str.indexOf("Date") > -1 ){
var num = str.match(/\d+/);
eval("var dd = Date(" + num + ")");
if(typeof(dd) != "undefined")
{
var dtd = new Date(dd);

str = dtd.Format("yyyy/M/d");
}
}
return str;
};

//生成人力成本表格的JSON对象
var genHrJson = function(){
var arr = new Array();
$("#tbodyHrBudget tr").each(function(){
var obj = new Object();
obj.JobTitle = $(this).find("select.jobtitle").val();
obj.Amount = $(this).find("input.amount").val();
obj.CostType = $(this).find("select.costtype").val();
arr.push(obj);
});
return arr;
};
//生成其他成本表格的JSON对象
var genOtherJson = function(){
var arr = new Array();
$("#tbodyOtherBudget tr").each(function(){
var obj = new Object();
obj.OtherCostType = $(this).find("select.othercosttype").val();
obj.Amount = $(this).find("input.amount").val();
obj.CostType = $(this).find("select.costtype").val();
obj.OccurType = $(this).find("select.occurtype").val();
obj.OccurDate = $(this).find("input.t-input").val();
arr.push(obj);
});
return arr;
};
//当前页的整体JSON对象
var genObj = function(){
var obj = new Object();
obj.DateKey = currentDay;
obj.HrJsonStr = genHrJson();
obj.OtherJsonStr = genOtherJson();
return obj;
};
  • 打赏
  • 举报
回复
如果几亿程序员都心有灵犀只用一种写代码的方法,就知道你说什么了。具体可能性多了,取决于你代码到底是怎么写的。
staywithc 2011-07-19
  • 打赏
  • 举报
回复
好吧,明天贴代码
bieyinan 2011-07-19
  • 打赏
  • 举报
回复
晒代码吧~~~
豆虫 2011-07-19
  • 打赏
  • 举报
回复
不能先click一次 这样解决不了根本问题

还是晒下你的代码吧~~~
不耐烦 2011-07-19
  • 打赏
  • 举报
回复
无代码无真相
Go 旅城通票 2011-07-19
  • 打赏
  • 举报
回复
感觉你代码有问题。。~
sirme128 2011-07-19
  • 打赏
  • 举报
回复
顶一下
staywithc 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zell419 的回复:]

绑定click事件的代码是不是在ready事件里面 ?
[/Quote]

是的
zell419 2011-07-19
  • 打赏
  • 举报
回复
绑定click事件的代码是不是在ready事件里面 ?

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧