Как указать, что JavaScript должен запускаться при отображении ModalPopupExtender

Выполнение Javascript при отображении ModalPopupExtender

ASP _ NET AJAX ModalPopupExtender имеет свойства OnCancelScript и OnOkScript, но, похоже, не имеет свойства OnShowScript. Я хотел бы указать функцию javascript для запуска каждый раз, когда отображается всплывающее окно.

В прошлых ситуациях я устанавливал фиктивный элемент управления TargetControlID и предоставлял свой собственный элемент управления, который сначала выполняет некоторый код JS, а затем использует методы JS для отображения всплывающего окна. Но в этом случае я показываю всплывающее окно как из клиентского, так и из серверного кода.

Кто-нибудь знает, как это сделать?

Кстати, мне это было нужно, потому что у меня есть текстовое поле в модальном окне, которое я хочу сделать редактором TinyMCE. Но скрипт инициализации TinyMCE не работает с невидимыми текстовыми полями, поэтому мне пришлось найти способ запустить его во время показа модального окна.

Они показывают вам, как ВЫЗЫВАТЬ событие вручную, а не как к нему прикрепиться: asp _ net _ ajaxlibrary _ act_modalpopup.ashx ...бесценно.

Выполнить Javascript при отображении ModalPopupExtender

8 ответов

хм... Я почти уверен, что для MPE есть событие displayed... это спонтанно пришло мне в голову, но я думаю, что можно добавить обработчик событий к событию displayed при загрузке страницы.

function pageLoad()
{
    var popup = $find('ModalPopupClientID');
    popup.add_shown(SetFocus);
}

function SetFocus()
{
    $get('TriggerClientId').focus();
}

Я не уверен, что это поможет вам с вызовом со стороны сервера.

add_shown() только что сэкономил мне кучу усилий и сработало отлично!!

Круто! Мне также пришлось добавить Sys.Application.add_load(pageLoad); на свою страницу, чтобы она запустила pageLoad().

Просто добавлю к Jorin: я добавил свой javascript через среду выполнения, и add_shown работал, когда был выполнен частичный постбэк (с использованием панели обновления), однако, он НЕ работал, когда был выполнен полный постбэк (из-за динамических элементов управления, запускающих показ MPE). Добавление строки Sys.Application.add_load(pageLoad); непосредственно перед моим javascript заставило его работать даже при полностраничном постбэке.

Вам также может понадобиться некоторый тайм-аут в обработчике displayed, похоже, некоторая инициализация в самом popup extender происходит в тайм-ауте. Мне это было нужно для некоторых правильных расчетов размера.

Вот простой способ сделать это в разметке:

<ajaxToolkit:ModalPopupExtender 
    ID="ModalPopupExtender2" runat="server" 
    TargetControlID="lnk_OpenGame" 
    PopupControlID="Panel1" 
    BehaviorID="SilverPracticeBehaviorID"  >
    <Animations>
        <OnShown>
             <ScriptAction Script="InitializeGame();" />  
        </OnShown>
    </Animations>                
</ajaxToolkit:ModalPopupExtender>

Я получаю следующую ошибку: «Анимация TargetControlID="hiddenButtonPopup1" использует свойство AjaxControlToolkit.ModalPopupExtender.OnShown, которое не существует или не может быть задано». hiddenButtonPopup1 — это скрытая кнопка, назначенная на TargetControlID.

У меня все отлично работает, и мне нравится решение, использующее только разметку, поскольку мой JS также находится в разметке.

Вам следует использовать значение BehaviorID mpeBID вашего ModalPopupExtender.

function pageLoad() {
    $find('mpeBID').add_shown(HideMediaPlayer);
}

function HideMediaPlayer() {
    var divMovie = $get('<%=divMovie.ClientID%>');
    divMovie.style.display = "none";
}

Если вы используете кнопку, гиперссылку или что-то еще для запуска всплывающего окна, можете ли вы также добавить дополнительный обработчик к событию триггера onClick, который должен по-прежнему запускать модальное всплывающее окно и одновременно запускать JavaScript?

Вы можете показать всплывающее окно из клиентского кода JS, так что без необходимости постбэка. Я думаю, вы могли бы запустить дополнительный код JS таким образом.

ModalPopupExtender изменяет кнопку/гиперссылку, которую вы указываете как элемент "триггера". Скрипт onclick, который я добавляю, срабатывает до отображения всплывающего окна. Я хочу, чтобы скрипт срабатывал после отображения всплывающего окна.

Кроме того, у меня все еще остается проблема, когда я показываю модальное окно со стороны сервера.

TinyMCE работает с невидимым текстовым полем, если вы скрываете его с помощью css (display:none;) Вы создаете событие «onclick» для TargetControlID, для init TinyMCE, если вы также используете updatepanel.

Для двух модальных форм:

var launch = false;
var NameObject = '';

function launchModal(ModalPopupExtender) {
    launch = true;
    NameObject = ModalPopupExtender;
}

function pageLoad() {
    if (launch) {
        var ModalObject = $find(NameObject);
        ModalObject.show();
        ModalObject.add_shown(SetFocus);
                }
} 

function SetFocus() {
    $get('TriggerClientId').focus();
}

Серверная часть: behand

protected void btnNuevo_Click(object sender, EventArgs e)
{
    //Para recuperar el formulario modal desde el lado del sercidor
    ScriptManager.RegisterStartupScript(Page, Page.GetType(), "key", "<script>launchModal('" + ModalPopupExtender_Factura.ID.ToString() + "');</script>", false);
}

 

var launch = false;

function launchModal() {
    launch = true;
}

function pageLoad() {
    if (launch) {
          var ModalPedimento = $find('ModalPopupExtender_Pedimento');
          ModalPedimento.show();
          ModalPedimento.add_shown(SetFocus);
    }
}

function SetFocus() {
    $get('TriggerClientId').focus();
}

Чем это лучше ранее принятого ответа выше?

Длина объекта JavaScript

Длина объекта JavaScript

У меня есть объект JavaScript. Есть ли встроенный или общепринятый способ получить длину этого объекта? const myObject = new Object(); myObject["firstname"] = "Gareth"; myObject["lastname"] = "Simpson"; myObject["age"] = 21; Это отчасти правда, но так много людей привыкли к «ассоциативному массиву» PHP, что они могут предположить, что это означает «упорядоченную ассоциативную карту», хотя объекты JS на самом деле неупорядочены. В приведенном выше примере myObject.length не определен, по крайней мере в среде браузера. Вот почему он недействителен Варианты Object.{keys, values, entries}(obj).length были упомянуты в общей сложности 38 раз в 16 ответах плюс в комментариях к этому вопросу, и еще 11 раз в 7 удаленных ответах. Думаю, теперь достаточно. 44 ответа Обновленный ответ Вот обновление по состоянию на 2016 год и широкое распространение ES5 и далее. Для IE9+ и всех других современных браузеров…

Подробнее »

Как опубликовать и затем перенаправить на внешний URL из ASP_Net?

Размещение и последующее перенаправление на внешний URL из ASP_Net

Как опубликовать и перенаправить на внешний URL-адрес из ASP_Net? ASP_NET серверные элементы управления возвращают данные на свою собственную страницу. Это делает случаи, когда вы хотите перенаправить пользователя на внешнюю страницу, но по какой-то причине (например, для аутентификации) вам нужно сделать публикацию на этой странице, болезненными. Отлично работает HttpWebRequest , если вы не хотите перенаправлять, и JavaScript тоже хорош в некоторых случаях, но может оказаться сложным, если вам действительно нужен код на стороне сервера для сбора данных для публикации. Так как же вам одновременно разместить сообщение на внешнем…

Подробнее »

Как настроить переключатель CSS

Настроить переключатель CSS

Я работаю над сайтом, который перейдет на новый стиль в установленную дату. Встроенный семантический HTML и CSS сайта, поэтому изменение должно потребовать только изменения ссылки CSS. Я работаю с дизайнером, которому нужно будет увидеть, как он выглядит, а также с клиентом, которому нужно будет просмотреть обновления контента в текущем виде, а также ход разработки нового вида. Я планирую использовать магическое значение строки запроса и/или ссылку javascript в нижнем…

Подробнее »