在一个简单的MVC页面中放一个input,给他一个onfocus事件,这个事件执行一个方法,方法里面用$.ajax(),我的原意是当这个文本框获得焦点的时候就去执行后台方法,但是现在问题的是这个方法会不停的执行,废话少说,直接上代码吧!
前段代码:
<div>
<input id="com" type="text" onfocus="maileComplete();" />
</div>
function maileComplete() {
$.ajax({
data: "",
contentType: "application/json",
url: "@Url.Action("GetCitity","Test")",
type: "post",
dataType: "json",
success: function (msg) {
alert(msg);
}
});
}
后端代码就是返回一个Json字符串
public JsonResult GetCitity()
{
StringBuilder sb = new StringBuilder();
sb.Append("[");
sb.Append("\"苹果4代iphone正品\",");
sb.Append("\"苹果4代 手机套\",");
sb.Append("\"苹果4\",");
sb.Append("\"戴尔笔记本\",");
sb.Append("\"戴尔手机\",");
sb.Append("\"戴尔键盘\"");
sb.Append("]");
return Json(sb.ToString(), JsonRequestBehavior.DenyGet);
}
现在的结果是当文本框获得焦点之后不停的执行后台方法,不停的弹出对话框!!这是为什么呢?哪位大神出来指点一二??
java测试
后台代码
public void test(){
System.out.println("进入");
renderJson("{\"userName\":\"jzlg2012\",\"password\":\"123456\"}");
}
html代码(复制的你的)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>测试</title>
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.1/jquery.min.js"></script>
</head>
<body>
<div>
<input id="com" type="text" onfocus="maileComplete();" />
</div>
<script type="text/javascript">
function maileComplete() {
//alert("执行了");
$.ajax({
data: "",
contentType: "application/json",
url: "/test",
type: "post",
dataType: "json",
success: function (msg) {
alert(JSON.stringify(msg));
}
});
}
</script>
</body>
</html>
结果:
没有问题,在获取焦点的时候执行了方法返回到前台,没不停弹框
我用的是ASP.NET MVC 做的,一直出现了这个问题,如果用WebForm页面来做这个就不会出现这样的问题,不知道为啥MVC页面会是这样的??
input獲得焦點->alert跳出(input失去焦點)->按下alert的確定(input獲得焦點)
這是個死循環,當然無限alert..
不知道你要做什麼,但看起來這只是個demo
把alert(msg)改成console.log(msg)再測吧
这里的alert当然可以换做其他,但是问题的关键不在于此,问题的关键在于它不停的去执行后台方法,把alert注释掉,在后台方法里去下断点,程序也是一直在执行后台的方法!还有,为什么你会认为这里用了alert就是死循环呢??
@gyangjing:
結論是我寫了demo測出來的
我只能告訴你正解,能不能理解就是你自己的問題了
@RosonJ: 你说的我当然能理解了,但是我把alert去掉,依然会不停的去执行后台方法,这才是关键,不知大神有何解?
@gyangjing:
https://github.com/peterjan1989/AJAXIssueDemo
fork下來執行看看,沒有你說的問題
好了說一聲我刪掉
@RosonJ: 代码我下下来了,你我代码的不同在于你的模板页里面引用了一些Js和css,比如关于bootsharp的东西,而我的代码里面啥都没有引用,是不是因为引用了这些的JS的缘故?我再看看吧,谢谢你了!
@gyangjing:
jQuery你應該也引用了,jquery.validate, bootstrap等的不應該會造成影響,著重於focus事件的觸發去研究吧
實做過程中發現,來回切換頁籤也會重複觸發focus事件,但應該不是你的案例
@RosonJ: 代码里面只是引用了最基本的JS,其他的就没有了,但是也没为什么会不停的执行onfocus事件,这个以前还真没遇到过
@gyangjing:
看不到你的代碼也幫不上忙,我也挺好奇的..
@RosonJ:如果你实在好奇,你可以新建一个空的mvc程序,当前页面就引用一个基本的js,其他别的脚本啊样式啥的都不用,就把我的前端和后端的代码复制过去,你再看看效果。。。
@gyangjing:
你用的什麼瀏覽器,不確定有沒有影響,了解一下
@gyangjing:
試了,同樣沒出現的問題
@RosonJ: 谷歌,IE,火狐我都试过,都有这样的问题。。。。对了,我用的vs是2010,mvc 3,难道跟这个有关系?之前也没发现onfocus事件有这问题的。。。
@gyangjing:
focus是前端事件,不受後端版本影響,瀏覽器可能還大些
做個測試,你把AJAX拿掉,maileComplete()裡只寫一行console.log('...');
這樣還會重複觸發嗎
@RosonJ: 如果把ajax去掉,光执行前端的console.log的话,每次文本框获得焦点只会执行一次,但是加上ajax之后,就会不停的去执行后端方法了。。。
@gyangjing:
我..真的無解了,無法重現你的問題,實在無從查起..