
magnific popup 是一款流行的响应式 jquery 灯箱插件,常用于创建图片、视频、地图等内容的弹窗画廊。其 callbacks 配置项中的 elementparse 函数是一个非常强大的工具,允许开发者在解析每个画廊元素时动态修改其类型和配置。这在处理混合内容(例如,既有图片又有视频)的画廊时尤其有用。
在 elementParse 回调中,item 对象包含了当前被解析元素的相关信息。开发者经常需要根据元素的特定属性(如类名)来决定弹窗的类型。然而,直接尝试通过 item.el.context.className 访问元素的类名时,可能会遇到 Uncaught TypeError: Cannot read properties of undefined (reading 'className') 这样的错误。
这个错误表明 item.el.context 是 undefined,因此无法读取其上的 className 属性。item.el 本身是一个 jQuery 对象,它封装了 DOM 元素。在某些情况下,context 属性可能存在于 jQuery 对象中,但在 magnificPopup 的 elementParse 回调所提供的 item.el 中,它可能并不总是指向预期的原始 DOM 元素。
要正确访问一个 jQuery 对象所代表的 DOM 元素的原生属性,如 className,我们需要获取到实际的 DOM 元素。jQuery 对象是一个类数组对象,其内部包含了一个或多个 DOM 元素。第一个 DOM 元素可以通过索引 [0] 来访问。因此,正确的路径应该是 item.el[0],它会返回原始的 DOM 元素,然后我们就可以安全地访问其 className 属性了。
为了解决 className 未定义的问题,只需将代码中的 item.el.context.className 替换为 item.el[0].className 即可。以下是一个完整的示例,演示了如何使用 Magnific Popup 创建一个混合内容(图片和视频)的画廊,并正确地根据元素的类名来区分和配置:
确保在 HTML 文件的 <head> 或 <body> 底部引入 jQuery 和 Magnific Popup 的 CSS 和 JavaScript 文件。建议使用 CDN 链接以简化部署。
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/magnific-popup.css" integrity="sha512-WEQNv9d3+sqyHjrqUZobDhFARZDko2wpWdfcpv44lsypsSuMO0kHGd3MQ8rrsBn/Qa39VojphdU6CMkpJUmDVw==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/jquery.magnific-popup.min.js" integrity="sha512-IsNh5E3eYy3tr/JiX2Yx4vsCujtkhwl7SLqgnwLNgf04Hrt9BT9SXlLlZlWx+OK4ndzAoALhsMNcCmkggjZB1w==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
创建一个包含不同类型链接(图片和视频)的画廊容器。通过为链接元素添加不同的类名(例如 image 和 video)来区分它们。
<div class="row">
<div class="col-sm-12">
<div class="popup-gallery">
<a href="http://sandbox.vciwork.com/codepenstuff/images/1.jpg" class="image" title="第一张图片">
<img src="http://sandbox.vciwork.com/codepenstuff/images/1.jpg" alt="图片1" />
</a>
<a href="https://www.youtube.com/watch?v=L0jQz6jqQS0" class="video" title="YouTube 视频">
<img src="http://sandbox.vciwork.com/codepenstuff/images/2.jpg" alt="视频缩略图" />
</a>
<a href="http://sandbox.vciwork.com/codepenstuff/images/4.jpg" class="image" title="第二张图片">
<img src="http://sandbox.vciwork.com/codepenstuff/images/4.jpg" alt="图片2" />
</a>
</div>
</div>
</div>为画廊元素添加一些基本的样式,使其在页面上正确显示。
.popup-gallery a {
display: inline-block;
width: 25%; /* 示例:每行显示4个 */
}
.popup-gallery a img {
height: auto;
width: 100%;
}在 $(document).ready() 中初始化 Magnific Popup,并在 elementParse 回调中使用 item.el[0].className 来判断元素类型并设置相应的弹窗配置。
$(document).ready(function() {
$('.popup-gallery').magnificPopup({
delegate: 'a', // 委托事件到 'a' 标签
type: 'image', // 默认类型设置为 'image'
callbacks: {
elementParse: function(item) {
// 正确访问 DOM 元素的类名
if (item.el[0].className == 'video') {
item.type = 'iframe'; // 如果是视频,则设置为 iframe 类型
item.iframe = {
patterns: {
youtube: {
index: 'youtube.com/',
id: 'v=',
src: '//www.youtube.com/embed/%id%?autoplay=1'
},
vimeo: {
index: 'vimeo.com/',
id: '/',
src: '//player.vimeo.com/video/%id%?autoplay=1'
},
gmaps: {
index: '//maps.google.',
src: '%id%&output=embed'
}
}
};
} else {
// 否则保持默认的图片类型配置
item.type = 'image';
item.tLoading = 'Loading image #%curr%...';
item.mainClass = 'mfp-img-mobile';
item.image = {
tError: '<a href="%url%">The image #%curr%</a> could not be loaded.'
};
}
}
},
gallery: {
enabled: true, // 启用画廊模式
navigateByImgClick: true,
preload: [0, 1] // 预加载当前图片前后各一张
}
});
});通过上述调整,可以确保 Magnific Popup 在处理混合内容画廊时,能够准确地识别元素类型并应用正确的弹窗配置,从而避免 className 未定义的运行时错误。
以上就是解决 Magnific Popup 中 className 未定义错误的指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号