我刚刚决定使用Firebug,当创建Fancybox窗口时,它实际上需要我的所有ASP.NET控件(包含在DIV标记中)并将它们放在FORM标记之外。所以我想这就是为什么然后ASP.NET按钮不做任何事情 - 它被放置在窗体之外。
那么,除了使用完全不同的模态对话框之外,你有什么建议我可以阻止这个(或使ASP.NET按钮工作)吗?
编辑:好的,人们报告某些修补程序在某些版本上适用于他们。所以,请务必阅读所有答案/滚动到底部,了解如何在不同的Fancybox版本上解决此问题。
答案 0 :(得分:33)
你需要改变它(在jquery.fancybox-1.3.1.js的第719行附近):
$('body').append(
tmp = $('<div id="fancybox-tmp"></div>'),
loading = $('<div id="fancybox-loading"><div></div></div>'),
overlay = $('<div id="fancybox-overlay"></div>'),
wrap = $('<div id="fancybox-wrap"></div>')
);
到
$('form').append(
tmp = $('<div id="fancybox-tmp"></div>'),
loading = $('<div id="fancybox-loading"><div></div></div>'),
overlay = $('<div id="fancybox-overlay"></div>'),
wrap = $('<div id="fancybox-wrap"></div>')
);
答案 1 :(得分:19)
对于需要使用Fancybox版本2来解决此问题的简单方法的人来说,这是一种更简单的方法。您所要做的就是在代码中添加parent:“form:first”,例如
$(document).ready(function () {
$(".various").fancybox({
parent: "form:first",
fitToView: true,
width: '300px',
height: '100px',
autoSize: false,
closeClick: false,
openEffect: 'none',
closeEffect: 'none',
modal: false
});
});
然后这会将fancybox元素附加到表单标记内的dom中,而不是在body标记内。
答案 2 :(得分:5)
Fancybox版本2.1.4
更改这两行
2069行左右:
document.all && !document.querySelector ? $('html') : $('body');
到
document.all && !document.querySelector ? $('html') : $('form:first');
在1960线附近:
this.overlay = $('<div class="fancybox-overlay"></div>').appendTo('body');
到
this.overlay = $('<div class="fancybox-overlay"></div>').prependTo('form');
您也可以使用appendTo,但这取决于您。在我的情况下,我需要prependTo。
答案 3 :(得分:4)
我整个星期都试图弄清楚这个问题,我真的没有运气
我刚看到这篇文章
http://usmanshabbir.blogspot.com/2010/10/click-server-button-problem-in-jquery.html
这解释了如何使用jQuery UI对话框进行回发。
如果不是100%使用花式盒子,那么这种方法绝对值得一试,今天给我带来了很多麻烦。
答案 4 :(得分:4)
在不改变FancyBox源的情况下,将它放在FancyBox脚本之后(在任何加载事件之外!!!):
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/#.#/jquery.min.js"></script>
<script type="text/javascript" src="/fancybox/jquery.fancybox-#.#.#.pack.js"></script>
<script type="text/javascript">
// Override $.fancybox.init to fix ASP.NET PostBack bug;
var fancyboxInitOld = $.fancybox.init;
$.fancybox.init = function () {
fancyboxInitOld.apply(arguments);
$("#fancybox-tmp, #fancybox-loading, #fancybox-overlay, #fancybox-wrap").appendTo("form:first");
};
// Your code ...
</script>
答案 5 :(得分:2)
以上更新对我不起作用,fancybox仍然在表单之外添加。然后我在jquery.fancybox-1.3.2.js中注释掉了那6行,发现它们在我的代码中根本没有被使用。
我在fancybox js文件中对'body'进行了搜索,并将其更改为'form':
jquery.fancybox-1.3.2.js(ln 484)
jquery.fancybox-1.3.2.pack.js(ln 27,ln 41)
现在,fancybox已添加到表单中,服务器控件正在运行。
答案 6 :(得分:2)
jquery.fancybox-1.3.4.js第1040行
//$('body').append(
$('form').append(
tmp = $('<div id="fancybox-tmp"></div>'),
loading = $('<div id="fancybox-loading"><div></div></div>'),
overlay = $('<div id="fancybox-overlay"></div>'),
wrap = $('<div id="fancybox-wrap"></div>')
);
在FF和IE9上为我工作(我的asp:Button会回发),谢谢你的解决方案
答案 7 :(得分:1)
Fancybox版本:2.1.2
jquery.fancybox.js的第1782行
改变这个:
this.el = document.all && !document.querySelector ? $('html') : $('body');
对此:
this.el = document.all && !document.querySelector ? $('html') : $('form:first');
答案 8 :(得分:1)
我使用Fancybox 1.3.4将一个aspx页面显示为fancybox iframe中的弹出页面。但是弹出页面中的按钮不会导致回发。我没有像你之前说的那样改变任何东西。相反,我做了以下。
function check()
{
var validated = Page_ClientValidate();
if (validated) {
__doPostBack('<%=bur.ClientID%>','');
parent.$.fancybox.close();
return true;
}
else
{
return false;
}
}
<asp:Button ID="bur" runat="server" Text="ser"
OnClientClick="check()" />
protected void bur_Click(object sender,Eventargs e)
{ //put breakpoint here.
}
答案 9 :(得分:0)
Fancybox 1.3.4实际上是回发。
但是如果OnClientClick在服务器端点击事件之前关闭它就不会回发。所以上面是解决这个问题的方法。(在javascript函数中添加doPostBack)。
通常Fancybox 1.3.4会回发而不会对其.Js文件进行任何更改。但要关闭它,需要在服务器端单击事件中写入此行ScriptManager.RegisterClientScriptBlock(this, GetType(), "", "parent.$.fancybox.close();", true);
。只有这样才会调用两个服务器端事件,并且fancybox也会关闭。
但是Fancybox 2.1.3(最新版)在OnClientClick关闭后会发回回事件。
答案 10 :(得分:0)
如果刷新父级是一个用于此目的的解决方案,则可以刷新onClosed:
$(".fancybox").fancybox({
'onClosed': function() {
parent.location.reload(true);
}
});
答案 11 :(得分:0)
fancybox js库文件没有任何变化,对我来说有用的是
$('.your-selector').fancybox({
afterShow: function () {
$('.fancybox-overlay').appendTo('form');
}
});
我已经在表单标签内移动了fancybox div,现在,服务器端按钮就像魅力一样:) 一切都很好..我希望这对你也有用。 :)
答案 12 :(得分:0)
您无需更改任何代码或任何库...只需尝试此操作..
$('.fancybox').fancybox({
parent: "form:first", // jQuery selector
});
答案 13 :(得分:0)
可能是最糟糕的解决方案,但它对我有用。我需要同时使用faceybox和codebehind。设置您的精美框以在单击按钮时加载。然后onClosed将值传递给另一个C#页面并在页面加载后执行代码。
<script type="text/javascript">
$(document).ready(function () {
$(".fancy").fancybox({
onClosed: function () {
window.location.href = "worker_addcarrier.aspx?name=" + document.getElementById('<%=txt_carriername.ClientID%>').value +
"&password=" + document.getElementById('<%=txt_password.ClientID%>').value +
"&email=" + document.getElementById('<%=txt_email.ClientID%>').value;
}
});
});
然后只是“class =”的事情:
<asp:Button ID="Button1" href="logo.png" runat="server" class="fancy" Text="Create" Width="109px" BorderColor="#009933" OnClick="Button1_Click" />