Fancybox - кнопка ASP.NET не работает

Я только что определил использование Firebug, что при создании окна Fancybox он фактически принимает все мои элементы управления ASP.NET(содержащиеся в теге DIV) и помещает их вне тега FORM. Поэтому я предполагаю, что это причина, почему тогда кнопка ASP.NET ничего не делает - она ​​помещается вне формы.

Итак, есть ли у вас какие-либо предложения о том, как я могу предотвратить это (или заставить эту кнопку ASP.NET работать), кроме использования совершенно другого модального диалога?

EDIT: ОК, люди сообщают, что некоторые из предлагаемых исправлений работают на них в определенных версиях. Поэтому обязательно прочтите все ответы/прокрутите страницу вниз, чтобы исправить эту проблему в разных версиях Fancybox.

Ответ 1

Вам нужно изменить это (где-то вокруг строки 719 jquery.fancybox-1.3.1.js):

$('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>')
        );

to

$('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>')
);

Ответ 2

Для тех, кому нужен простой ответ на эту проблему, используя Fancybox версии 2, гораздо проще это сделать. Все, что вам нужно сделать, это добавить родителя: "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.

Ответ 3

Fancybox Version 2.1.4

Измените эти 2 строки

Вокруг строки 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, но это зависит от вас. В моем случае мне нужно было сделать preendTo.

Ответ 4

Я пытался выяснить эту проблему всю неделю, мне действительно не повезло

Я только что наткнулся на эту статью

http://usmanshabbir.blogspot.com/2010/10/click-server-button-problem-in-jquery.html

Это объясняет, как получить обратную связь с диалоговым окном jQuery UI.

Если это не 100% необходимо использовать причудливый бокс, то этот метод определенно стоит попробовать, он спас мне много хлопот сегодня.

Ответ 5

Без изменения источника FancyBox поместите это после FancyBox script (вне любых событий загрузки!!!):

<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>

Ответ 6

Приведенное выше обновление не сработало для меня, fancybox все еще добавлялся вне формы. Затем я прокомментировал эти 6 строк в jquery.fancybox-1.3.2.js и обнаружил, что они вообще не используются в моем коде.

Я сделал поиск в 'body' в файлах fancybox js и изменил его на 'form' в:

jquery.fancybox-1.3.2.js(ln 484)
jquery.fancybox-1.3.2.pack.js(ln 27, ln 41)

Теперь в форму добавляется fancybox, и серверные элементы управления работают.

Ответ 7

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>')
        );

Работает (мой asp: Button делает postback) для меня на FF и IE9, спасибо за решение

Ответ 8

Fancybox Version: 2.1.2

Строка 1782 из jquery.fancybox.js

Измените это:

this.el     = document.all && !document.querySelector ? $('html') : $('body');

Для этого:

this.el     = document.all && !document.querySelector ? $('html') : $('form:first');

Ответ 9

Я использую 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.

}

Ответ 10

Fancybox 1.3.4 фактически выполняет обратную передачу.

Но если он закрыт в OnClientClick, который находится перед событием на стороне сервера, он не будет возвращать. Так вышесказанное является решением этой проблемы. (Добавление doPostBack в функцию javascript).

Обычно Fancybox 1.3.4 выполняет обратную передачу без каких-либо изменений в своих .Js файлах. Но чтобы закрыть его, нужно написать эту строку ScriptManager.RegisterClientScriptBlock(this, GetType(), "", "parent.$.fancybox.close();", true); в событии клика на стороне сервера. Только тогда вызываются и события serveride, и fancybox также закрывается.

Но Fancybox 2.1.3 (последнее) делает событие обратной передачи после закрытия в OnClientClick.

Ответ 11

Если обновление родителя является решением, которое служит этой цели, вы можете обновить onClosed:

$(".fancybox").fancybox({
  'onClosed': function() {
   parent.location.reload(true);
  } 
});

Ответ 12

Без изменения файла библиотеки fancybox js, то, что работает для меня, было ниже,

$('.your-selector').fancybox({ 
        afterShow: function () {
            $('.fancybox-overlay').appendTo('form');
        }
});

Я переместил fancybox div внутри тега формы, и теперь кнопка на стороне сервера работает как шарм:) Все лучшее.. Надеюсь, это сработает и для вас..:)

Ответ 13

Вам не нужно менять какой-либо код или какую-либо библиотеку... Просто попробуйте это.

$('.fancybox').fancybox({
     parent: "form:first", // jQuery selector
});

Ответ 14

Это худшее решение, но это сработало для меня. Мне одновременно нужны были faceybox и codebehind. Настройте свой причудливый ящик для загрузки при нажатии кнопки. Затем onClosed передать значения на другую страницу С# и сделать код на странице Load.

<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" />

Ответ 15

Для любого другого бедного человека, который все еще вынужден использовать WebForms, вот мой ответ, который сработал (я нашел его после того, как почти бросил и прочитал модальную документацию jquery):

$(".pensionPartnerEdit").fancybox({
    //fancystuff
}).parent().appendTo('form');