Kamrad.ru
 
 
дневники | кабинет | регистрация | календарь | участники | faq | правила | поиск | фотоальбом | каська | выйти
Kamrad.ru Kamrad.ru » Авторские форумы » Веб-дизайн, вёрстка и веб-программирование » JavaScript: problems..
новая тема  ответить следующая тема | предыдущая тема
Автор
 
LazyFox - offline LazyFox
15-09-2006 17:23 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад



JavaScript: problems..

Проблема примерно следующая:
некоему INPUT-элементу страницы (IE5+) меняется value в тексте страницы (по BUTTON, или из внешней программы через setAttribute(,,) от IHTMLElement-интерфейса.. но метод onChange напрочь не перехватывается, даже при пропихивании фокуса ввода предварительно на этот элемент и куда-то дальше потом..
я чего-то недопонял, или это фича?

примерный текст:

...
<SCRIPT language="JavaScript">
function fSwitchTitle(text)
{
document.title=text;
// ну или alert()
}
function OnMyPress()
{
// смена фокуса добавлена от бехысходности, но не помогла
test_form.spyer.focus();
test_form.spyer.value='are changed';
test_form.button2.focus();
}
</SCRIPT>
...

<!-- элемент hidden, но на text та же фигня -->
<input type="hidden" value="nothing" name="spyer" onChange="fSwitchTitle('Hidden element changed...');">
...
<input type="button" value="Показать" name="button2" OnClick="OnMyPress();">

Хватается по потере фокуса, но никак не по смене значения, а фокус мне не подходит - из внешней программы на смену фокуса подходящего объекта для приспособления не нашел
Да, элементы, соответсвенно, в форме text_form (там не ошибка, а сокращенный пример )

Anafay - offline Anafay
15-09-2006 18:47 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать




LazyFox
я чего-то недопонял
Два раза

onchange Event
...
Remarks
This event is fired when the contents are committed and not while the value is changing. For example, on a text box, this event is not fired while the user is typing, but rather when the user commits the change by leaving the text box that has focus. In addition, this event is executed before the code specified by onblur when the control is also losing the focus.

The onchange event does not fire when the selected option of the select object is changed programatically
...
Applies To
INPUT type=text, SELECT, TEXTAREA

(c)

Хватается по потере фокуса, но никак не по смене значения, а фокус мне не подходит - из внешней программы на смену фокуса подходящего объекта для приспособления не нашел
Расскажи про задачу, возможно, есть другие способы. В частности, что мешает все, что требуется, делать по нажатию кнопки?

LazyFox - offline LazyFox
15-09-2006 20:34 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад



Anafay
дык, по первому разу из вроде как непонятых - я же написал: "даже при пропихивании фокуса ввода предварительно на этот элемент и куда-то дальше потом.." - т.е. на экпериментальной страничке я одной функции ставлю на input фокус, меняю value, и перегоняю фокус дальше куда-нибудь, чтобы создать ситуацию из твоей цитаты "Remarks".. но за событие onblur при этом обработчик цепляется, а onchange - не возникает
по второму - так в тексте в комментарии я так же указал: <!-- элемент hidden, но на text та же фигня -->, т.е. с text ровно та же трабла..

Задача - умеренно дурацкая. Надо обмениваться неотображаемыми в общем случае данными между программой, в которую встроен ActiveX Internet Explorer, и собственно этим ActiveX-окном браузера. Программа-оболочка - моя, содержимое (страница со скриптами, локальная или с удаленного сервера) - чужое.
В окне браузера крутится какой-то скрипт по показу клиенту информации и по последовательной подготовке набора данных, которые должны по событиям скидываться в оболочку. Оболочка начинает "заготовку", и должна получать эти данные по готовности, и иметь возможность прервать сценарий (не просто прихлопнуть, а дать возможность корректно завершить возможные начатые операции с сервером).

Для начала решил сделать так:
1) загрузка стартовой страницы и запуск сценария - оболочка даст команду через IWebBrowser->Navigate(2)
2) готовность данных - оболочку легко повесить на событие изменения статусной строки (невидимой в моем случае), куда скрипт может пихать уведомление о готовности, а я уже отыщу нужный невидимый элемент и выколупаю оттуда текстик, записанный сценарием (можно видимый элемент, но в невидимом фрейме - потому и не обязательно hidden, годится text. не суть важно). Ну, может, в перспективе повешусь не на событие для IWebBrowser2, а куда-нибудь пониже - на IHTMLDocument(2), IHTMLElement, хотя там похлопотней - глубже копать придется..
3) подтверждение от оболочки сценарию о получении очередной порции данных, об отказе или о другой какой команде - я могу задать любому элементу страницы новое значение value, или еще какой именованный атрибут, но при такой смене значения событие onchange в окне браузера не возникает (см.выше), и, если в макетном скриптике я могу обрамить перебрасыванием фокуса, и повеситься в итоге не на onchange, а на onblur, то как заставить скакать фокус из оболочки - не сыскал. А почему не возникает onchange - так и не понял
Так что варианты - или понять, как заставить возникать onchange, либо искать что-то другое. Прикинул варианты - могу, в принципе, имитировать click на элемент, тогда можно за onclick зацепиться, или выполнить джаваскрипт-функцию с оговоренным заранее именем, но это дополнительные ходы, не очень красивое решение - просто замена фокуса со перестановкой фокуса (каламбурчик ). Ну, еще можно написать свой ActiveX, который вкрячивать в страницу, и все гонять через него. Такое решение выглядит более универсальным, но в условиях сильно сжатых сроков начинать писать и отлаживать ActiveX, чего я никогда раньше не делал - не очень бы хотелось..

Anafay - offline Anafay
15-09-2006 22:28 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать




LazyFox
Так ты же ставишь value из скрипта, а событие отрабатывает, когда это делает пользователь.
Замени
test_form.spyer.value='are changed';
на
test_form.spyer.createTextRange().text='are changed';
И все поедет.

подтверждение от оболочки сценарию о получении очередной порции данных, об отказе или о другой какой команде - я могу задать любому элементу страницы новое значение value, или еще какой именованный атрибут
Вызов метода допускается? Если да, и если принципиально делать именно таким способом, то, возможно, помогут IHTMLInputTextElement::createTextRange, IHTMLTxtRange::text, IHTMLElement2::focus и IHTMLElement2::blur.

Опять же, можно считать код onChange и выполнить его после простановки value и т.д.

LazyFox - offline LazyFox
17-09-2006 21:00 URL сообщения      K-Mail    Профиль    Поиск    Контакт-лист   Редактировать
Камрад



спасибо, поковыряюсь утром за рабочим компом

Текущее время: 16:30
новая тема  ответить следующая тема | предыдущая тема
 
Перейти:

версия для печати   отправить эту страницу по e-mail   подписаться на эту тему

 
Powered by: vBulletin Version 2.0.1
Copyright ©2000, 2001, Jelsoft Enterprises Limited.
Любое использование материалов сайта
возможно только с разрешения его администрации.


 

Рейтинг@Mail.ru
Рейтинг@Mail.ru