热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

AJAX页面查询实现的注意点

项目一直使用的都是最原始的form提交刷新整个页面的方式,不知道落后潮流几个时代了,而且体验很笨重。最近,PM提出一个隐藏利润的功能,在勾选一个多选框时,可以给查询结果增加利润一列。这个场景当然也可以

项目一直使用的都是最原始的form提交刷新整个页面的方式,不知道落后潮流几个时代了,而且体验很笨重。

最近,PM提出一个隐藏利润的功能,在勾选一个多选框时,可以给查询结果增加利润一列。这个场景当然也可以用整个页面刷新来实现,但是该页面同时存在6个统计项(如下图),重新统计这些项目无疑会浪费很多查询资源。所以考虑用ajax异步查询来实现。

今日订单:0个 已完成订单:0个 处理中订单:15个 待查看退款订单:0个

今日订单支出:0今日到账分润:0



思路如下:

1.将页面的form部分单独拆成一个页面form.vm,首次渲染由服务器完成

2.重写页面的form.submit事件,用ajax方式提交

3.服务器端接收到请求后进行处理,并使用查询结果渲染form.vm,再返回给前端

4.前端获取查询后的结果,用obj.html(res.data)方式刷新查询页面显示结果部分


遇到主要的问题:

1.得到查询部分后,使用obj.html(res.data)渲染后,该部分如果存在js绑定事件或者渲染外观的部分,就需要再次进行处理。在我的业务场景下,下拉列表是使用jqTransform实现的,页面首次加载对其进行了渲染,所以ajax查询返回后仍然需要重新渲染该下拉列表;

解决方案:

对于整站的控件,可以共用同一个js,比如init.js,提供初始化方法,页面查询完后就调用该方法;

对于本页面特殊的控件或者事件,可以放在一个方法里调用,ajax请求完后再次调用,但是鉴于重写form的submit事件也是页面初始化的一部分,所以最终导致了递归的调用。

最终的结果大致如下:

var initPage = function init(){

//ajax查询:
at.ajaxQuery($('#searchForm'),$('#formContainer'),function(){
site.init();
initPage();
});
//其他初始化页面动作
}


2.特别需要注意,在覆写form.submit事件时需要return false;否则就会继续执行

ajaxQuery : function(form, refreshPart, reRender) {
if (form.length > 0) {
form.submit(function() {
form.ajaxSubmit({
dataType : 'json',
type : 'GET',
success : function(res) {
if (res.code === '1') {
if (res.data.length > 0) {
refreshPart.html(res.data);
}
reRender();
}else{
$.showError("查询数据出错,请刷新页面重试");
}
},
beforeSubmit : function() {
refreshPart
.html("
数据加载中...
");
},
error : function(xhr, e, msg) {
$.showError("查询数据出错,请刷新页面重试");
}
});

return false;
});
}
}

3.Javascript中的this

以下代码require一个js模块:

var at = require("../../comp/ajaxTool.js");
var ajaxQuick=at.ajaxQuick;
function afterDomLoaded() {
at.ajaxQuick("/myLife/fetchYesterdayBalance.htm", $('#yesterdayBalance'));
at.ajaxQuick("/myLife/fetchTotalIncomeOfToday.htm", $('#todayIncome'));
at.ajaxQuick("/myLife/fetchTotalOutcomeOfToday.htm", $('#todayOutcome'));
at.ajaxQuick("/shopOrder/getDealingOrderCount.htm",
$('#dealingOrderCount'));
//...
}

ajaxTool.js代码中的写法如下:

var ajaxTool = {
/**
* 查询某个URL将内容替换指定元素内容
*/
ajaxQuick : function(reqestUrl, placeHolderObj, params) {
this.ajaxGet(reqestUrl, function(res) {
if (res.code === '1') {
placeHolderObj.text(res.data);
}
}, function(xhr) {
placeHolderObj.text('--');
}, params);
},

/**
* 封装ajax方式GET某个URL的数据
*/
ajaxGet : function(reqestUrl, successCallback, beforeSendCallback,
params) {
$.ajax({
url : reqestUrl,
type : 'get',
dataType : 'json',
data : params || {
t : new Date().getTime()
},
success : successCallback,
beforeSend : beforeSendCallback,
error : function(xreq, err, e) {
Y.alert(err);
}
});
}
//....
}

老是报ajaxGet函数没有定义,但是ajaxTool的写法看起来也没有问题。求教高人,发现问题出在,js中this关键字。在ajaxTool.js内部this是指向ajaxTool这个对象的,但当执行了var ajaxQuick=at.ajaxQuick; 这句以后,ajaxQuick这个方法的执行上下文已经变成了window,而在window上是没有ajaxGet的,经典坑啊!

关于最后一个问题附送一篇文章:

我希望自己尽早知道的7个Javascript怪癖



推荐阅读
  • 探讨在循环中调用$.post()时,回调函数为何会在循环结束后才开始执行,并提供解决方案和优化建议。 ... [详细]
  • 本文探讨了dbforms框架的核心设计理念及其背后的技术原理,详细分析了该框架如何通过其独特的设计模式来简化开发流程,并为开发者提供了优化使用方法的建议。 ... [详细]
  • 一个登陆界面
    预览截图html部分123456789101112用户登入1314邮箱名称邮箱为空15密码密码为空16登 ... [详细]
  • 本文详细介绍了如何利用Go语言和WebSockets技术构建一个高效的实时聊天系统。随着网络应用的日益复杂化,实时交互成为了提升用户体验的关键要素之一。通过本指南,开发者可以学习到最新的技术和最佳实践。 ... [详细]
  • 本文探讨了2019年前端技术的发展趋势,包括工具化、配置化和泛前端化等方面,并提供了详细的学习路线和职业规划建议。 ... [详细]
  • 在Web开发过程中,Ajax技术常用于前后端数据交互。其中一个重要的属性async决定了请求是否以异步方式执行,本文将详细解析async属性的作用及使用方法。 ... [详细]
  • 理解文档对象模型(DOM)
    本文介绍了文档对象模型(DOM)的基本概念,包括其作为HTML文档的节点树结构,以及如何通过JavaScript操作DOM来实现网页的动态交互。 ... [详细]
  • 本文深入探讨了JavaScript中实现继承的四种常见方法,包括原型链继承、构造函数继承、组合继承和寄生组合继承。对于正在学习或从事Web前端开发的技术人员来说,理解这些继承模式对于提高代码质量和维护性至关重要。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 本文探讨了如何通过WebBrowser控件在用户点击输入框时自动显示图片验证码。该过程可能涉及JavaScript事件的触发与响应。 ... [详细]
  • 本文探讨了浏览器的同源策略限制及其对 AJAX 请求的影响,并详细介绍了如何在 Spring Boot 应用中优雅地处理跨域请求,特别是当请求包含自定义 Headers 时的解决方案。 ... [详细]
  • 深入解析ES6至ES8的新特性与应用
    本文详细介绍了自2015年发布的ECMAScript 6.0(简称ES6)以来,JavaScript语言的多项重要更新,旨在帮助开发者更好地理解和利用这些新特性进行复杂应用的开发。 ... [详细]
  • 本文将介绍如何利用Python爬虫技术抓取国内主流在线学习平台的数据,并以51CTO学院为例,进行详细的技术解析和实践操作。 ... [详细]
  • 深入分析十大PHP开发框架
    随着PHP技术的发展,各类开发框架层出不穷,成为了开发者们热议的话题。本文将详细介绍并对比十款主流的PHP开发框架,旨在帮助开发者根据自身需求选择最合适的工具。 ... [详细]
  • Microsoft即将发布WPF/E的CTP(Community Technology Preview)和SDK,标志着RIA(Rich Internet Application)技术的新里程碑。更多详情及下载链接请参见MSDN官方页面。 ... [详细]
author-avatar
小男生2502863203
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有