我无法让Backbone.js事件在视图位于Fancybox中时触发
I can't get Backbone.js events to trigger when the View is within a Fancybox
我有一个骨干视图,在一个花式框内呈现。我可以点击一个锚标记,它将工作,但事件在骨干视图不会触发。我在ShadowBox和另一个我不记得的灯箱中也遇到了同样的问题。任何想法吗?
var LightboxItemView = Backbone.View.extend({
className : 'lighbox-item',
events : {
"click .lightbox-preview" : "visitItemPage"
},
initialize : function() {
_.bindAll(this, "render");
this.render();
},
visitItemPage : function() {
console.log('visiting time');
},
render : function() {
var graphicPreview = $('<img>');
graphicPreview.addClass('lightbox-preview');
graphicPreview.attr('src', this.model.get('url_m'));
var lbContent = $('<div></div>');
lbContent.attr("id", 'lb' + this.model.get('id'));
lbContent.append(graphicPreview);
var lbHider = $('<div></div>');
lbHider.css("display", "none");
lbHider.append(lbContent);
$(this.el).append(lbHider);
return this;
}
});
Lightbox库将元素从DOM中插入的位置移动。它们通常会创建一个新的容器,把你的元素放进去,然后把这个容器显示在其他所有元素的上面。
首先,在浏览器中使用Firebug或Inspector查看库的具体功能。然后,你可以在jQuery中使用普通的事件处理程序使其工作http://api.jquery.com/bind/.
initialize: function() {
$('<your-element-in-the-overlay-box> a').click(handler)
}
骨干事件不工作,因为元素不再在骨干视图的el
。
我正在使用Facebox进行类似的灯箱效果,我遇到了同样的问题。经过一些调试和切换的东西,事实证明,事件委托确实工作,但你必须渲染你的视图后,当你触发了facebox。
在我的例子中,我有一个可重用的视图,它在需要时被隐藏/显示。我必须为show()方法这样做,该方法将被另一个视图调用以显示:
show: function(model) {
$.facebox(this.el);
// now render my element
this.model = model;
$(this.el).html( ... from template ... )
}
本质上,如果你必须重新渲染你的视图,在facebox/lightbox调用之后进行,以便事件被正确地委托给视图
我同意dira所说的,但我不认为这就排除了继续使用Backbone事件处理的可能性。为什么不直接将Fancybox绑定到div周围的div,这是视图的el ?
我已经设法让这个工作在一个jsFiddle除了它一直有问题加载无论是Backbone.js或fanybox代码远程。所以这是一个很糟糕的例子,除非你愿意重新加载它六次。将代码插入到包含所有这些文件的页面中,我保证,它会工作的,我已经测试过了:
HTML:
<div style="display:none">
<div id="popupView">
This is some example stuff for the Fancybox.
It could have been generated by a template just as easily.
<a id="clickMe">Click Here!</a>
</div>
</div>
<p>
<a id="popupTrigger" href="#popupView">
Popup a Fancybox containing the results</a>
</p>
下面是相应的JavaScript:
$(document).ready(function () {
var TestView = Backbone.View.extend({
el: "#popupView",
events: {
"click #clickMe": "clickMe"
},
clickMe: function () {
alert("You clicked it! You seem like that type.");
}
});
var view = new TestView({
"el": "#popupView"
});
view.render();
$("#popupTrigger").fancybox();
});
注意:尽管没有任何额外的包装器,这段代码仍然可以工作。您可以单击Fancybox中的链接,视图中的相应代码将被触发。
- 如何使用javascript从主svg对象动态创建svg视图框
- 正在使用$location.path(.)路由ng视图
- angular.js没有'无法在PhoneGap中处理视图标记
- 如何包含特定于每个视图angularjs的javascript文件
- 通过在Dojo mobile ViewController.openExternalView中动态更改打开同一外部视图的
- Kendo:我该如何在树视图中创建一个递归的hieiarchy
- Fancybox是否将Click事件静音
- Ajax Live搜索发布到Laravel视图
- backbone.js无法渲染视图
- 根据某些条件在视图之间切换
- ng视图外的链接重定向到ng视图内的页面
- 需要帮助谷歌地图方向面板在FancyBox中显示
- 如何在Jquery中发布后将值从视图返回到控制器
- 将日期时间作为 JSON 发送将无法在我的视图中正确显示
- 使用Scala Play Framework视图中的键检索映射值
- FF视图源|脚本高亮显示为红色
- 如何使bxslider仅在移动视图中处于活动状态
- 为什么不't我的变量在我的控制器中填充后在我的视图中呈现
- 我无法让Backbone.js事件在视图位于Fancybox中时触发
- 将dropzone.js与fancybox.js结合在一起,提供上传照片的全屏视图