<img src="">标签通过js异步加载图片

本文介绍了一种使用异步加载技术来优化图片加载过程的方法,通过预设默认图片并在加载完成后替换为实际图片的方式,提高了网页加载速度及用户体验。

主要是考虑到网络的限制,为了更好的用户体验,采用异步加载显示的方法为img加载图片,直接贴代码:
标签:

<img onload="getHead(this,url);" src="../../static/xxx/xxx/head.png" >
<%--这里注意
1,src写在 onload后面
2,请给src一个默认的图片路径,不能直接src=""
--%>

js:

function getHead(obj,portraitUrl){
    //模拟网络延迟请求
     setTimeout(function (){   
     obj.src=../../static/xxx/xxx/add.png;               
    },1000+Math.random()*5000);

   /*
    $.ajax({
        type: "get",
        url: portraitUrl,
        async: true,
        success: function (portrait) {
           obj.src=portrait;
            portraitUrl.onload=null;//这里每次给obj的src赋值后都会执行onload 为了避免无限死循环需要这样置空
        }
*/
}

然后上面都是Android写多了的后遗症,完全没必要这么麻烦啊,脑抽了啊自己写个ajax,所有请看下面:

<img src="http:/xxxx.png" onerror='this.src="../../static/xxx/xxx/head.png" />
//这就ok了
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312" /> <title>甜蜜约会</title> </head> <link rel="stylesheet" href="../css/Untitled-2.css" type="text/css"/> <script type="text/javascript" src="../js/Untitled-3.js"></script> <body> <div class="head"> <div class="left"><img src="../images1/logo.png" /></div> <div class="right"><img src="../images1/phone.jpg"/></div> </div> <div id="nav"> <ul class="nav"> <li><a href="#" class="color_in">首页</a></li> <li><a href="#">港式甜品</a></li> <li><a href="#">台式甜品</a></li> <li><a href="#">植物甜品</a></li> <li><a href="#">广府糖水</a></li> <li><a href="#">加盟我们</a></li> <li><a href="#">分店地址</a></li> </ul> </div> <div class="banner"> <ul class="banner_pic" id="banner_pic"> <li class="current"><img src="../images1/01.jpg" /></li> <li class="pic"><img class="one" src="../images1/02.jpg" /></li> <li class="pic"><img class="one" src="../images1/03.jpg"/></li> </ul> <ol id="button"> <li class="current"></li> <li class="but"></li> <li class="but"></li> </ol> </div> <div id="learn"> <h2>甜蜜约会品牌简介</h2> <dl> <dt></dt> <dd class="tex1">想和甜蜜有个约会吗?</dd> <dd class="tex2">甜品不仅女孩子喜欢,不少男孩子也不例外,在人们越来越会享受生活的今天,甜品品牌可谓风升水起,“甜蜜约会就是其中一个。”</dd> </dl> <div class="imgbox" id="imgbox"> <span> <a href="#"><img src="../images1/1.jpg"/></a> <a href="#"><img src="../images1/2.jpg"/></a> <a href="#"><img src="../images1/3.jpg"/></a> <a href="#"><img src="../images1/4.jpg"/></a> </span> </div> </div> <div id="features"> <h2>甜蜜约会特色美食推荐</h2> <div class="list0"> <div id="SwitchBigPic"> <span class="sp"><a href="#" ><img src="../images1/111.jpg" /></a></span> <span><a href="#"><img src="../images1/222.jpg" /></a></span> <span><a href="#"><img src="../images1/333.jpg" /></a></span></div> <ul id="SwitchNav"> <li><a class="txt_img1" href="#"></a></li> <li><a class="txt_img2" href="#"></a></li> <li><a class="txt_img3" href="#"></a></li> </ul> </div> <div class="list1"> <h3></h3> <form action="#" method="post" class="biaodan"> <table class="content"> <tr> <td class="left">姓名:</td> <td><input type="text" class="txt001" /></td> </tr> <tr> <td class="left">手机:</td> <td><input type="text" class="txt001" /></td> </tr> <tr> <td class="left">邮箱:</td> <td><input type="text" class="txt001" /></td> </tr> <tr> <td class="left"></td> <td> <select class="course"> <option>请选择最近店铺地址</option> <option> 北京三里屯</option> <option>上海南京路3号</option> <option>广州淮阳路12号</option> <option>深圳大都会3号/</option> </select> </td> </tr> <tr> <td colspan="2"><input class="no_border" type="button" /></td> </tr> </table> </form> </div> </div> <div class="footer">甜蜜约会版权所有2020 - 2036 京 ICP 备 2232333 号  京公网安备 2342434324343</div> </body> </html>代码分析
06-21
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>商品管理</title> <script src="./js/echarts.js"></script> <link rel="stylesheet" href="./css/public.css" /> <link rel="stylesheet" href="./css/goodschild.css" /> <link rel="stylesheet" href="./css/myPagination.css"> <script src="./js/jquery-3.7.1.min.js"></script> <script type="text/javascript" charset="utf-8" src="./ueditor/ueditor.config.js"></script> <script type="text/javascript" charset="utf-8" src="./ueditor/ueditor.all.min.js"> </script> <script type="text/javascript" charset="utf-8" src="./ueditor/lang/zh-cn/zh-cn.js"></script> </head> <body> <!-- 预览的幕布 --> <div id="imagePreview" class="preview_modal" onclick="previewCancel()"> <!-- 预览的图片 --> <img id="previewImage" src="" alt="Preview Image"> </div> <!-- 顶部下拉框 --> <div class="top_box" id="top_box"> <div class="top_left"> <input type="text" placeholder="请输入产品名称搜索" id="searchInput"> </div> <div class="top_right"> <button id="searchBtn">搜索</button> <button id="resetBtn">重置</button> </div> </div> <!-- 按钮区域 --> <div class="top_boxs"> <div class="top_button"> <button id="addition" class="icon-btns"> <img src="./img/返回.png" alt="图标描述" width="15" height="15"> <p>返回</p> </button> <button id="additionst" class="icon-btns"> <img src="./img/加号.png" alt="图标描述" width="20" height="20"> <p>新增</p> </button> <button id="expurgate" class="icon-btn" disabled> <p>全部</p> <span class="badge" id="badge_first"></span> </button> <button id="search" class="icon-btn" disabled> <p>待审核</p> <span class="badge" id="badge_second"></span> </button> <button id="searchsa" class="icon-btn" disabled> <p>回收站</p> <span class="badge" id="badge_seconds"></span> </button> <button id="additions" class="icon-btns"> <p>批量审核</p> </button> <button id="expurgates" class="icon-btn"> <img src="./img/删除.png" alt="图标描述" width="20" height="20"> <p>批量删除</p> </button> </div> <div class="screen" id="refreshs"> <div class="screen_box"> <img src="./img/搜索-灰色.png" alt="刷新" class="renovate" id="searchs" /> </div> <div class="screen_box"> <img src="./img/刷新.png" alt="刷新" class="renovate" id="refresh" /> </div> <div class="screen_box"> <div class="screen_img"> <img src="./img/设置-灰色.png" alt="刷新" class="renovate" id="install" /> </div> <div class="setting_box"> <p class="setting_title">显示设置</p> <div class="setting_items"> <label> <input type="checkbox" value="id" checked> ID </label> <label> <input type="checkbox" value="company" checked> 公司名称 </label> <label> <input type="checkbox" value="tradeid" checked> 产品名称 </label> <label> <input type="checkbox" value="img" checked> 商品图片 </label> <label> <input type="checkbox" value="name" checked>行业 </label> <label> <input type="checkbox" value="status" checked> 审核状态 </label> <label> <input type="checkbox" value="type" checked> 上架状态 </label> <label> <input type="checkbox" value="create_time" checked> 创建时间 </label> </div> </div> </div> </div> </div> <div class="base_box"> <div id="base_package"> <table class="table_table-bordered"> <thead> <tr> <th> <input type="checkbox" id="selectAll" name="check-all"> </th> <th>id</th> <th>公司名称</th> <th>产品名称</th> <th>商品图片</th> <th>行业</th> <th>审核状态</th> <th>上架状态</th> <th>创建时间</th> <th>操作</th> </tr> </thead> <tbody> </tbody> </table> </div> <!-- 底部分页 --> <div class="pagination_box"> <div id="pagination" class="pagination"></div> </div> </div> <!-- 新增弹窗 --> <div class="windows_box"> <div class="paddle_box"> <p class="title">添加/编辑</p> <div class="form-item"> <p>*产品名称</p> <input type="text" name="productName" id="productName" placeholder="请输入内容名称"> </div> <div class="form-item"> <p>*产品图片</p> <div class="img_pop"> <form id="myForm"> <label> <input type="file" name="file" id="file" style="display: none;" onchange="upload(true)" accept="image/*"> <img src="./img/10050.png" id="pic"> </label> </form> <p class="error" id="img_error">图片</p> </div> </div> <div class="form-item"> <p>*产品介绍</p> <div class="described"> <div class="texta" id="editor"></div> <p class="error" id="text_error">详情</p> </div> </div> <div id="parcel" class="parcel"> <div class="radio-group"> <p>*上下架</p> <input type="radio" name="shelf" value="on" checked> <span>上架</span> <input type="radio" name="shelf" value="off"> <span>不需要</span> </div> <!-- 操作按钮 --> <div class="hint_button"> <button class="hint_right" onclick="zxc()">确认</button> <button class="hint_left" onclick="asd()">确定并继续添加</button> </div> </div> </div> </div> <!-- 删除弹窗 --> <div class="delete-mask" id="deleteMask"> <div class="delete-dialog" id="deleteDialog"> <div class="dialog-content" id="dialogContent"> <h3>确定要删除选中的行业吗?</h3> </div> <div class="dialog-actions" id="dialogActions"> <button class="action-cancel" id="cancelBtn" onclick="cancelDelete()">取消</button> <button class="action-confirm" id="confirmBtn" onclick="confirmDelete()">确定</button> </div> </div> </div> <!-- 失败 --> <div id="error"> <div class="errorCenter"> <img id="errorImg" src="./img/error.png" alt="" /> <span class="errorText"></span> </div> </div> <!-- 成功 --> <div id="success"> <div class="successCenter"> <img id="successImg" src="./img/yes.png" alt="" /> <span class="successText"></span> </div> </div> <script src="./js/public.js"></script> <script src="./js/goodschild.js"></script> <!-- 分页插件 --> <script src="./js/myPagination.js"></script> <!-- 富文本编辑器容器 --> <div class="texta" id="editor"></div> <script> // 初始化 UEditor 富文本编辑器 var ue = UE.getEditor('editor', { initialContent: '<span style="color: #999">请输入内容...</span>', // 初始占位符文本 autoHeight: false, }); // 监听编辑器准备就绪事件,为聚焦、失焦绑定占位符处理逻辑 ue.ready(() => { // 聚焦时,若内容是初始占位符则清空 ue.addListener('focus', () => { if (ue.getContent() === '<p><span style="color: #999">请输入内容...</span></p>') { ue.setContent(''); } }); // 失焦时,若内容为空或仅含换行则恢复占位符 ue.addListener('blur', () => { if (ue.getContent() === '' || ue.getContent() === '<p><br></p>') { ue.setContent('<span style="color: #999">请输入内容...</span>'); } }); }); </script> </body>
08-13
商品管理页面的 HTML 结构通常包括以下几个核心部分:商品列表展示区域、商品操作区域(如新增、编辑、删除)、搜索与筛选区域,以及可能的分页控件。以下是一个典型的商品管理页面结构示例: ### 商品管理页面 HTML 结构 ```html <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>商品管理</title> <link rel="stylesheet" href="styles.css"> </head> <body> <header> <h1>商品管理</h1> </header> <main> <section id="search-filter"> <input type="text" id="search" placeholder="搜索商品名称或编号"> <select id="category-filter"> <option value="">所有分类</option> <option value="electronics">电子产品</option> <option value="clothing">服装</option> <option value="books">书籍</option> </select> <button id="add-product">新增商品</button> </section> <section id="product-list"> <table> <thead> <tr> <th>商品编号</th> <th>商品名称</th> <th>分类</th> <th>价格</th> <th>库存</th> <th>操作</th> </tr> </thead> <tbody id="product-table-body"> <!-- 动态插入商品数据 --> </tbody> </table> </section> <section id="pagination"> <button id="prev-page">上一页</button> <span id="current-page">1</span> <button id="next-page">下一页</button> </section> </main> <footer> <p>© 2025 商品管理系统</p> </footer> <script src="scripts.js"></script> </body> </html> ``` ### 商品管理页面交互实现 为了实现商品管理页面的交互功能,通常会使用 JavaScript 来处理用户操作,如搜索、筛选、分页以及商品数据的增删改操作。以下是一个简单的 JavaScript 实现示例,展示如何通过 Ajax 与后端进行数据交互,并动态更新页面内容: ```javascript // scripts.js // 初始化变量 let currentPage = 1; const itemsPerPage = 10; let products = []; // 获取商品数据 function fetchProducts(page = 1, searchQuery = '', category = '') { // 使用 Ajax 请求获取商品数据 const xhr = new XMLHttpRequest(); xhr.open('GET', `/api/products?page=${page}&limit=${itemsPerPage}&search=${searchQuery}&category=${category}`, true); xhr.onload = function () { if (xhr.status === 200) { products = JSON.parse(xhr.responseText).data; renderProductTable(products); updatePaginationControls(); } }; xhr.send(); } // 渲染商品表格 function renderProductTable(productList) { const tbody = document.getElementById('product-table-body'); tbody.innerHTML = ''; productList.forEach(product => { const row = document.createElement('tr'); row.innerHTML = ` <td>${product.id}</td> <td>${product.name}</td> <td>${product.category}</td> <td>${product.price}</td> <td>${product.stock}</td> <td> <button onclick="editProduct(${product.id})">编辑</button> <button onclick="deleteProduct(${product.id})">删除</button> </td> `; tbody.appendChild(row); }); } // 处理新增商品 document.getElementById('add-product').addEventListener('click', () => { window.location.href = 'add-product.html'; }); // 处理搜索 document.getElementById('search').addEventListener('input', (e) => { fetchProducts(1, e.target.value, document.getElementById('category-filter').value); }); // 处理分类筛选 document.getElementById('category-filter').addEventListener('change', (e) => { fetchProducts(1, document.getElementById('search').value, e.target.value); }); // 处理分页 document.getElementById('prev-page').addEventListener('click', () => { if (currentPage > 1) { currentPage--; fetchProducts(currentPage, document.getElementById('search').value, document.getElementById('category-filter').value); } }); document.getElementById('next-page').addEventListener('click', () => { currentPage++; fetchProducts(currentPage, document.getElementById('search').value, document.getElementById('category-filter').value); }); // 更新分页控件 function updatePaginationControls() { document.getElementById('current-page').textContent = currentPage; } // 编辑商品 function editProduct(productId) { window.location.href = `edit-product.html?id=${productId}`; } // 删除商品 function deleteProduct(productId) { if (confirm('确定要删除该商品吗?')) { const xhr = new XMLHttpRequest(); xhr.open('DELETE', `/api/products/${productId}`, true); xhr.onload = function () { if (xhr.status === 200) { fetchProducts(currentPage); } }; xhr.send(); } } // 页面加载时获取第一页数据 window.onload = () => { fetchProducts(1); }; ``` ### 功能说明 1. **HTML 结构**: - 使用语义化标签(如 `<header>`、`<main>`、`<section>`、`<footer>`)来组织页面结构,使代码更具可读性和可维护性,同时有助于提升页面的可访问性和 SEO 优化 [^2]。 - 商品列表使用 `<table>` 展示,确保数据的结构化展示。 2. **JavaScript 交互**: - 使用 Ajax 请求从后端获取商品数据,避免页面刷新,提升用户体验 [^3]。 - 通过事件监听器处理搜索、筛选、分页、新增、编辑和删除等操作。 - 数据动态渲染到表格中,确保页面内容实时更新。 3. **Ajax 请求**: - 使用 `XMLHttpRequest` 进行异步请求,获取商品数据并更新页面内容,实现前后端数据交互 [^3]。 4. **分页处理**: - 支持上一页和下一页功能,动态更新当前页码并重新获取数据。 5. **增删改操作**: - 新增商品通过跳转到新增页面实现。 - 编辑商品通过跳转到编辑页面并传递商品 ID 实现。 - 删除商品通过 Ajax 发送 DELETE 请求实现,并在确认后执行删除操作。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值