<div class="container"><div class="left"></div><div class="right clearfix"></div></div>

$function(){}:页面加载函数(先等页面加载完成后再执行JS),如果在这里面再声明一个函数,那么在外部是调用不到它的。

    $(function (){var $left = $(".left");var $right = $(".right");$.ajax({url:"init",type:"get",dataType:"json",success:function (data){//console.log(data)for(var i=0;i<data.length;i++){$left.append("<div><a href='javascript:getWares("+data[i].typeId+")'>"+data[i].typeName+"</a></div>")// $left.append("<div id='"+data[i].typeId+"'>"+data[i].typeName+"</div>");}}})//console.log($(".left div a").html());function getWares(typeId){//console.log("@@@")$.ajax({url:"searchByType?typeId="+typeId,type:"get",dataType:"json",success:function (data){}})}})

这样写完后(先在第一个div里面追加div再在div里面追加a标签,并给a标签绑定点击函数),但是这个时候页面会报出 getWares()这个函数未定义的错误! 原因是a标签里面的点击属于外部调用,而这个函数定义在$ function(){}里面,相当于这个函数已经属于是局部函数了,只在$ function(){}里面生效,所以会报出这个错误。

可以这样解决:

    $(function (){var $left = $(".left");var $right = $(".right");$.ajax({url:"init",type:"get",dataType:"json",success:function (data){//console.log(data)for(var i=0;i<data.length;i++){$left.append("<div><a href='javascript:getWares("+data[i].typeId+")'>"+data[i].typeName+"</a></div>")// $left.append("<div id='"+data[i].typeId+"'>"+data[i].typeName+"</div>");}}})})//console.log($(".left div a").html());function getWares(typeId){//console.log("@@@")$.ajax({url:"searchByType?typeId="+typeId,type:"get",dataType:"json",success:function (data){}})}

把function放在$ function()函数外面,使其变成全局函数
如果不是内嵌的JS,也可以考虑包$ function()函数去掉,使其变成全局函数

    $(function (){var $left = $(".left");var $right = $(".right");$.ajax({url:"init",type:"get",dataType:"json",success:function (data){//console.log(data)for(var i=0;i<data.length;i++){$left.append("<div><a href='javascript:getWares("+data[i].typeId+")'>"+data[i].typeName+"</a></div>")// $left.append("<div id='"+data[i].typeId+"'>"+data[i].typeName+"</div>");}}})$("a").click(function (){})})

还可以像上面这样,给具体的标签这样绑定点击事件,那这个时候,它就不算是外部调用了,并且这样写,它不属于是声明一个函数,而是直接内部绑定了函数,所以这样没事(但本题这样写不可以,因为涉及到了ajax异步问题)

AJAX异步问题初探

    $(function (){var $left = $(".left");var $right = $(".right");$.ajax({url:"init",type:"get",dataType:"json",success:function (data){//console.log(data)for(var i=0;i<data.length;i++){$left.append("<div><a href='javascript:getWares("+data[i].typeId+")'>"+data[i].typeName+"</a></div>")// $left.append("<div id='"+data[i].typeId+"'>"+data[i].typeName+"</div>");}}})console.log($(".left div a").html());})

控制台报出 undefined,原因:ajax这里是异步请求,也就是说,当执行$.ajax{}这段时,下面的console.log( $(“.left div a”).html()) 这段其实也在执行,因为这是异步,没有顺序执行这种说法了,而假如,.ajax这段还没执行完,先打印这个时候就肯定会报undefined这给错误了。

    $(function (){var $left = $(".left");var $right = $(".right");$.ajax({url:"init",type:"get",dataType:"json",success:function (data){//console.log(data)for(var i=0;i<data.length;i++){$left.append("<div><a href='javascript:getWares("+data[i].typeId+")'>"+data[i].typeName+"</a></div>")// $left.append("<div id='"+data[i].typeId+"'>"+data[i].typeName+"</div>");}console.log($(".left div a").html());}})})

放在第一个.ajax这个时候能正常输出

可以尝试换一种思路,我上面是想要获取到a标签,然后给a标签$(“.a”).click(function(){})绑定鼠标点击事件,但是刚刚说了,要么放在第一个 $ .ajax({})里面,但这样总感觉不太好,或者干脆这样:
我不通过获取标签然后点击绑定事件,直接在a标签里面绑定函数

 $(function (){var $left = $(".left");var $right = $(".right");$.ajax({url:"init",type:"get",dataType:"json",success:function (data){//console.log(data)for(var i=0;i<data.length;i++){$left.append("<div><a href='javascript:getWares("+data[i].typeId+")'>"+data[i].typeName+"</a></div>")// $left.append("<div id='"+data[i].typeId+"'>"+data[i].typeName+"</div>");}}})})function getWares(typeId){console.log(typeId)$.ajax({url:"searchByType?typeId="+typeId,type:"get",dataType:"json",success:function (data){}})}

这样写,压根就不需要获取什么标签了然后绑定了(因为获取标签就有可能会出现异步问题:获取标签的时候,标签都还没有加载完成,其实导致这样的问题根本原因就是异步,即它们是同时执行的,而不是顺序执行的

    $(function (){var $left = $(".left");var $right = $(".right");$.ajax({url:"init",type:"get",dataType:"json",success:function (data){//console.log(data)for(var i=0;i<data.length;i++){$left.append("<div><a href='javascript:getWares("+data[i].typeId+")'>"+data[i].typeName+"</a></div>")// $left.append("<div id='"+data[i].typeId+"'>"+data[i].typeName+"</div>");}}})})function getWares(typeId){//清除之前的div$(".right div").html("");var $right = $(".right");console.log(typeId)$.ajax({url:"searchByType?typeId="+typeId,type:"get",dataType:"json",success:function (data){for(var i=0;i<data.length;i++){$right.append("<div> <img src='image/"+data[i].img+"'> <div>¥"+data[i].price+"</div><div>"+data[i].wareName+"</div></div>")}}})}

$ (“.right div”).html(“”)能正常执行到:
$(“a”).click(function(){})不可以是因为绑定的前提是先要找到a标签,而找到a标签这个动作 $(“a”)它这段是需要和ajax异步时同时执行的,所以实际上会出现找不到a标签的情况
而 function getWares(typeId){}只是一个函数,它是需要触发的,根本不会和ajax同时触发,它时通过a标签内部直接绑定的函数,当你触发这段函数的时候,标签百分百加载完毕了,所以 $ (“.right div”).html(“”)能正常执行到!!!

最新文章

  1. SecureCR 改变背景色和文字颜色
  2. ShopXO本地化部署安装之centeros 安装Apache2.4.6 + PHP7.0.33 + Mysql5.7.25环境
  3. 大数据到底有多大,人工智能到底有多能
  4. SpringBoot集成MyBatis-Plus代码生成器
  5. 贪心算法——合并区间(Leetcode 56)
  6. android 单选按钮横置,input radio如何实现横向布局
  7. pandas Dataframe删除缺失值
  8. 论文阅读笔记(四)——ESPNetV2:A Light-weight Power Efficient and General Purpose Convolutional Neural Network
  9. 在Spring Security框架下JWT的实现细节原理
  10. 线性代数mit18.06读课本-D1-1.1
  11. 网络规划 网络工程 用户需求分析 网络结构设计
  12. c语言换行用分号代替,go语言换行的地方可以用分号替代吗?
  13. html5 播放 3gp,一个html5播放视频的video控件只支持android的默认格式mp4和3gp
  14. 相机的内参会改变吗_关于相机内参中的焦距fx和fy
  15. 什么是mysql的安装版本的_一:MySQL基本介绍及安装
  16. waf 防火墙限制_WAF防火墙设备指标及参数说明
  17. 地理围栏 | EXCEL表格中分析轨迹坐标是否在设定的围栏范围内
  18. 年化17.5%,十年8倍的“双低”转债策略:从零实现量化回测系统之三
  19. java微信小程序音乐播放器分享系统
  20. 移动端布局介绍——css像素/物理像素/设备像素比

热门文章

  1. 清明节 一秒钟设置Html灰色背景
  2. 验证windows系统永久激活
  3. 在Ubuntu20.04 LTS中安装OpenCV4.5.4
  4. Android Studio 基础 之 获取系统Calendar 日历日程(可获得当天以后可设定天数范围内的日历日程) (涉及指定日期时间判断是星期几的方法使用)的方法整理
  5. CTF—攻防练习之HTTP—暴力破解
  6. 周星驰:卑微是人生第一课
  7. java开源工具简介(2)
  8. 2023年1~3月前端学习笔记
  9. 引擎十一:体积感SSS,SSR
  10. 【Python】使用Python做简易爬虫爬取B站评论