Вызов функций JavaScript пользовательского элемента управления из нового окна (где пользовательские элементы управления находятся в открывателе) - PullRequest
1 голос
/ 31 марта 2011

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

Чтобы иметь уникальное имя функции обратного вызова в пользовательском элементе управления (оно может иметь несколько экземпляров на одной странице), я добавил идентификатор пользовательского элемента управления в имя функции следующим образом (определено в файле ascx):

function OnItemSelection_<%=this.ID%>(selectedItemID)
{
    OnItemSelection("<%=SomeControl.ClientID%>", selectedItemID)
}

Где OnItemSelection определяется во внешнем js-файле:

function OnItemSelection(controlID, selectedItemID)
{
    $(controlID).do_something(selectedItemID);
}

Проблема в том, что теперь я не уверен, как новая страница может вызывать «правильную» функцию (экземпляра пользовательского элемента управления, откуда она была открыта).

Единственная идея, которую я имею в виду, это передача имени функции обратного вызова в строке запроса:

var CallbackFunction = function(selectedItemID)
{
    window.opener.<%=Request.QueryString["CallbackFunctionName"]%>(selectedItemID);
}

или, может быть, просто ввод идентификатора пользовательского элемента управления:

var CallbackFunction = function(selectedItemID)
{
    window.opener.OnItemSelection_<%=Request.QueryString["UserControlID"]%>(selectedItemID);
}

Мои вопросы:

1) Это плохая практика передачи имен функций javascript (или идентификаторов пользовательских элементов управления), как это (я подозреваю, что это так)?

2) Какой может быть лучший способ справиться с этим сценарием?


Edit:

Другой способ, который я сейчас рассматриваю, - объявить глобальную переменную в пользовательском элементе управления (зарегистрировать ее из кода, чтобы она появлялась только один раз). Затем при открытии нового окна можно назначить ему соответствующую функцию (OnItemSelection _ <% = this.ID%>) и вызвать ее из нового окна.

Кажется, намного чище, чем передача пользовательских данных управления через строку запроса.

1 Ответ

1 голос
/ 01 апреля 2011

Как я знаю, лучшая практика в таких ситуациях - открывать модальное окно, которое будет возвращать только идентификатор с установкой возвращаемого значения окна.

Вы можете легко принять решение, используя возвращенный параметр Id (возвращаемое значение).

в родительском окне:

var returnValue = window.showModalDialog("modalUrl.htm", "", sFeatures);
// use returned parameter

в модальном окне:

window.returnValue = 12; //your Selected Item Id or etc

это достаточно просто, а также наиболее используемая практика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...