【layer对话框】iframe内的layer.photos怎样显示在父窗口中

本文介绍了一种解决layer.photos遮罩层仅遮罩iframe子窗口而非父窗口的方法,通过在父窗口创建函数并传递图片数组到该函数实现整个页面的遮罩效果。

在开发中,对话框显得是不可或缺的组建,而layer作为一款优秀的开源免费的js插件,受到了越来越多的开发者的喜欢

关于layer的具体使用,可以参考官网的api,很详细    http://www.layui.com/doc/modules/layer.html

    今天在开发中遇到这么一个问题,就是在做后台时,用到了iframe来显示各个不同的页面内容,其中做了做了一个相册,很炫的动画,甚是满意,但是很快就发现一个美中不足的问题--layer.photos的遮罩层仅仅遮罩了iframe子窗口,而不是父窗口,给人感觉特别不好,效果如图所示:


而我是一个追求完美的人,怎么可以容忍这样的结果呢?果然不负有心人,终于找到了答案!

【解决之道】

首先在父窗口构建一个函数:

	function showPhotos(images) {
		layer.photos({
			area: '400px',
			shade: [0.85, '#000'],
			anim: 0,
			photos: {
				"title": "任务附件预览",
				"id": 'showImages',
				"data": images
			}
		});
	}

然后再子窗口,构建一个关于相册json字符串,调用showPhotos()函数即可

$("#task_pic_list .task_pic img").click(function(){
			var images = [   //相册包含的图片,数组格式
				{
					"alt": "图片名1",
					"pid":  1, //图片id
					"anim": 0,
					"src": "__IMG__/01.jpg", //原图地址
				},
				{
					"alt": "图片名2",
					"pid": 2, //图片id
					"anim": 0,
					"src": "__IMG__/01.jpg", //原图地址
				},
				{
					"alt": "图片名3",
					"pid": 3, //图片id
					"anim": 0,
					"src": "__IMG__/01.jpg", //原图地址
				},
				{
					"alt": "图片名4",
					"pid": 4, //图片id
					"anim": 0,
					"src": "__IMG__/01.jpg", //原图地址
				}
				
			];
			
			
			parent.showPhotos(images);
		});

终于搞定了,看一下效果吧,分享一下寡人的喜悦,

我的大作 欢迎来踩 www.iis7.com

<think>好的,我现在需要帮助用户解决在使用Layui的layer.photos时图片地址出错的问题。首先,我要回忆一下用户提供的引用内容,看看有没有相关的线索。 用户提到引用1的问题,动态插入图片后点击新图片会显示错误,提示无法读取'src'属性。这可能是因为图片数据没有正确加载或格式不对。引用2建议在图片全部加载后再调用layer.photos,可能需要使用回调函数或者确保所有图片加载完成。引用3的代码示例显示通过AJAX获取数据后调用layer.photos,但可能存在路径错误的情况。 接下来,我需要考虑用户的具体问题:图片地址错误的处理方法。可能的原因包括路径不正确、异步加载未完成、数据格式不符合要求等。我应该分步骤分析可能的原因,并提供相应的解决方案。 首先,检查地址是否正确。用户可能在动态生成图片路径时拼接错误,比如缺少前缀或拼写错误。建议使用绝对路径或者添加basePath。 然后,确保异步数据加载完成后再初始化。比如在AJAX的success回调调用layer.photos,或者在图片的onload事件处理。引用2提到需要在图片全部加载后调用方法,可能需要使用Promise.all或者计数器来确保所有图片加载完毕。 数据格式方面,layer.photos需要特定的JSON结构,比如包含alt和src字段。如果返回的数据不符合这个结构,就会出现错误。需要检查数据是否正确,并映射为需要的格式。 另外,可能涉及缓存问题,可以在URL后添加时间戳避免缓存。还有事件绑定问题,动态生成的元素可能需要重新绑定点击事件,或者使用事件委托。 最后,错误处理部分,可以添加try-catch或error回调来捕获异常,帮助定位问题。控制台输出也是重要的调试手段。 总结步骤:检查路径、确保数据加载完成、验证数据格式、处理缓存、正确绑定事件、添加错误处理。同时参考用户提供的引用内容的建议,比如在回调函数处理,或者使用layer.ext.js扩展。</think>针对layui的layer.photos图片地址错误问题,可通过以下步骤排查和解决: ### 一、路径校验与修复 1. **绝对路径处理** - 若使用动态地址,需添加项目根路径: ```javascript var basePath = "${pageContext.request.contextPath}"; photos:{ data: [{ alt: '示例', src: basePath + '/upload/' + dynamicPath // 确保路径拼接正确 }] } ``` ### 二、异步加载处理 2. **延迟初始化策略**(参考引用[2]建议) ```javascript // 使用Promise确保图片预加载完成 function loadImages(urls){ return Promise.all(urls.map(url => { return new Promise(resolve => { let img = new Image() img.onload = () => resolve({src: url}) img.src = url }) })) } // 调用示例 loadImages(['/img/1.jpg','/img/2.jpg']).then(data => { layer.photos({ photos: { data }, anim: 5 }) }) ``` ### 三、数据结构验证 3. **标准化数据格式**(参考引用[3]示例) ```javascript // 后端返回数据需包含以下字段 const validateData = (data) => { return data.map(item => ({ alt: item.title || '未命名', // 必须字段 src: item.fullUrl, // 完整有效地址 pid: item.id // 可选唯一标识 })) } // 在回调处理 $.getJSON("/api/photos", res => { layer.photos({ photos: { data: validateData(res.data) // 数据清洗 }, success: layero => { console.log('渲染完成') } }) }) ``` ### 四、缓存问题处理 4. **防缓存机制** ```javascript src: '/upload/image.jpg?t=' + new Date().getTime() ``` ### 五、事件绑定优化 5. **动态元素事件委托** ```javascript $(document).on('click', '.dynamic-img', function(){ layer.photos({ photos: { data: [{src: $(this).data('origin')}] } }) }) ``` ### 六、错误捕获 6. **异常处理增强** ```javascript try { layer.photos({ photos: { /*...*/ }, error: function(err){ console.error('图片加载失败:', err) } }) } catch(e) { layer.msg('初始化失败: ' + e.message) } ``` **典型调试流程:** 1. 浏览器控制台执行`network`标签过滤`img`请求 2. 检查所有图片资源的HTTP状态码 3. 验证JSON数据结构是否符合layer要求 4. 在代码关键节点添加`console.log`输出当前数据状态 [^1]: 动态加载需注意数据同步问题 [^2]: 预加载机制可避免渲染异常 [^3]: 数据格式标准化是核心要点
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值