我在以下结构中有DOM元素:
<div class="flexslider" data-ur-set="zoom">
<div data-ur-zoom-component="loading" data-ur-state="disabled">Loading…</div>
<div data-ur-zoom-component="button" data-ur-state="disabled">
<span>+</span><span>−</span>
</div>
<ul class="slides" data-ur-zoom-component="view_container">
<li><img src="//mydomain.com/path/to/small/image" onerror="this.src=altView.src" class="thumbnail selected-thumbnail" data-ur-src="//mydomain.com/path/to/large/image" data-ur-zoom-component="img"></li>
<li><img src="//mydomain.com/path/to/small/image" onerror="this.src=altView.src" class="thumbnail" data-ur-src="//mydomain.com/path/to/large/image" data-ur-zoom-component="img"></li>
<li><img src="//mydomain.com/path/to/small/image" onerror="this.src=altView.src" class="thumbnail" data-ur-src="//mydomain.com/path/to/large/image" data-ur-zoom-component="img"></li>
</ul>
</div>
当我单击图像本身(当前显示的幻灯片的图像)时,放大/缩小工作。但是,当我单击图像上的+
按钮范围时,我在Javascript控制台中看到一条错误TypeError: $img.data(...) is null
function setActive(img) {
if ($img && img != $img[0]) {
self.state = "enabled-out";
var zoomImg = $img.data("urZoomImg");
zoomImg.transform(0, 0, 1);
zoomImg.transitionEnd();
}
$img = $(img);
}
// zoom in/out button, zooms in to the center of the image
$(self.button).on(touchscreen ? "touchstart.ur.zoom" : "click.ur.zoom", function() {
if (self.img.length > 1)
setActive($(self.img).filter($container.find("[data-ur-state='active'] *"))[0]);
else
setActive(self.img[0]);
$img.data("urZoomImg").zoom(); // <---- This is the line throwing the error
});
我已经指出了上面代码中抛出null
TypeError的位置。我跟踪它,发现setActive正在发送undefined
img参数。
我怀疑我没有让Uranium Zoom交互的数据属性正确,但为什么+
按钮会抛出此错误?
正确的行为与此处的示例相似:http://uranium.io/interactions/zoom.html
答案 0 :(得分:1)
对于那些发现自己处于我的位置的人,我发现了正在发生的事情并且让我知道如何为自己解决这个问题。
如果滑块中有多个图像,铀缩放预计它们将被安排在铀轮播中。轮播DOM结构意味着包含每个图像的元素将具有data-ur-state='active'
,因此选择器$container.find("[data-ur-state='active'] *")
将在当前显示的幻灯片元素中找到图像。
但是,如果您没有使用轮播,那么您可能会看到我看到的null
TypeError。要在不使用铀轮播的情况下修复此问题,有一种方法可以更改核心铀文件以捕获适合您项目的选择器。但是,您正在更改核心文件,因此请小心处理!
要更改的文件名为assets/javascript/.remote/http__colon____slash____slash__downloads.moovweb.com__slash__uranium__slash__1.0.167__slash__uranium-pretty.js
在第608行修改选择器(如果你有类似的铀版本,代码块看起来就像下面那个。)
605 // zoom in/out button, zooms in to the center of the image
606 $(self.button).on(touchscreen ? "touchstart.ur.zoom" : "click.ur.zoom", function() {
607 if (self.img.length > 1)
608 setActive($(self.img).filter($container.find("[data-ur-state='active'] *"))[0]);
609 else
610 setActive(self.img[0]);
611 $img.data("urZoomImg").zoom();
612 });
重新启动你的moov服务器,以便它生成一个新的assets/javascript/main.js
,你的缩放按钮将使用新的代码并工作!