Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Возбуждение собственных событий


Автор: funasian 25.7.2005, 15:47
Вот есть такой код.

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Untitled</title>
<script>
    function test1(){
        tx11 = document.getElementById("txt1");
        tx11.focus();
        event.keyCode = 65;
        event.keyCode = 66;
        event.keyCode = 67;
    }
    
    function t1(){
        //Проверка нажатия клавиш
        //alert(event.keyCode);
        window.status = event.keyCode;
    }
</script>
</head>
<body onload="test1()"  onkeydown="t1();">
<input type="Text" id="txt1">
</body>
</html>


Хочу чтоб после загрузки в инпуте напечатолось abc.
Неинтересуют примеры с value и innerHTML.
Нужно чтобы было именно иметация нажатия клавиш от пользователя.

Автор: Sardar 26.7.2005, 02:11
Копать в сторону DOM2 document.createEvent/element.dispatchEvent или IE document.createEventObject/element.fireEvent.

Первое найдёшь здесь: http://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-interface
Второе на MSDN: http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/fireevent.asp

Автор: funasian 26.7.2005, 13:46
Пытался разобратся но ничего не получается.
Может какой-нить примерчик?
smile

Автор: funasian 26.7.2005, 15:13
Ещё вопрос.
Вот сдесь http://msdn.microsoft.com/library/default.asp?url=/workshop/author/dhtml/reference/properties/returnvalue_1.asp написано что параметр event.ctrlKey можно читать и устанавливать.
Код

<script>
 event.ctrlKey = true;
</script>

Пишет ошибку "Член группы не найден".

Автор: Sardar 26.7.2005, 19:13
По идее вот так должно быть:
Код
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    <title>Untitled</title>
<script type="text/javascript">
<!--

function processText() {
  var txt=document.getElementById("src").value;
  var t=document.getElementById("tgt");
  for(var i=0; i<txt.length; i++) {
    if(document.createEventObject) { //IE
       var e=document.createEventObject()
       e.type="keypress";
       e.keyCode=txt.charCodeAt(i);
       e.returnValue=true;
       e.cancelBubble=false;
       t.fireEvent("onkeypress", e);
    } else { //Mozilla(DOM2) case 
       var e=document.createEvent("keypress"); //здесь мозилла кидает ошибку
       e.keyCode=e.charCode=txt.charCodeAt(i);
       t.dispatchEvent(e);
    }
  }
}
//-->
</script>
</head>

<body>
<input type="text" id="src" /><button onclick="setTimeout(processText,1000);">Process</button><br>
<textarea id="tgt" onkeypress="alert(event.keyCode);"></textarea>

</body>
</html>

При этом чёрт его знает почему Мозилла кидает "NOT SUPPORTED" исключение. Думал потому что в событии onclick кнопки создаём, поставил на таймату, нет не пашет. Но по теории должно быть так как в примере.

Для ИЕ всё работает, события зажигаються, НО текст в текстовое поле не добавляеться, и не знаю почему...

Цитата(funasian @ 26.7.2005, 14:13)
Ещё вопрос.

Просто у тебя обьект event не найден. У ИЕ свои тараканы smile

Автор: funasian 26.7.2005, 19:50
Вот именно что события срабатывают, но действия не выполняются.
Вот такой код по идее должен перейти на другую страницу.
Событие onclick срабатывает, а действие не происходит.

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Untitled</title>
<script>
    function t1(){
        var t=document.getElementById("ah1");
        var e=document.createEventObject()
        e.type="click";
        e.keyCode=13; //Код Enter для подстраховки
        e.returnValue=true;
        e.cancelBubble=false;
        t.fireEvent("onclick", e);
    }
</script>
</head>
<body onload="t1();">
<a id="ah1" href="http://microsoft.com/" onclick="alert(event.keyCode);">Micro</a>
</body>
</html>


Цитата

Просто у тебя обьект event не найден. У ИЕ свои тараканы 


Проверять то я его могу, значит event найден.

Автор: Sardar 26.7.2005, 20:04
Вообще это странно. Никогда мне не требовалось, потому обьяснить такое поведение(как ИЕ так и Мозиллы) не могу. Под ИЕ можно генерить любое событие и устанавливать обьекту события любые свойства.

В DOM2 можно создавать только специальные события, поддерживаемые платформой. Других ограничений не знаю.

Под ИЕ должен быть механизм отвечающий за выполнение дефолтовых действий, вообще за это отвечает returnValue, но похоже ИЕ на свойство забил...
Поищи на MSDN, я пока в затруднении smile

Цитата(funasian @ 26.7.2005, 14:13)
Пишет ошибку "Член группы не найден".

Цитата(funasian @ 26.7.2005, 18:50)
Проверять то я его могу, значит event найден.

Потому как скрипт у тебя выполняеться во время загрузки, в этот момент обьект события null, проще говоря никаких осбытий не было. Убедись в этом написав alert(event), заменив: event.ctrlKey = true;
В других местах, например в обработчике события event естественно существует.

Автор: funasian 26.7.2005, 22:41
Да искал я в MSDN, ничего путного нет. smile


Цитата

Потому как скрипт у тебя выполняеться во время загрузки, в этот момент обьект события null, проще говоря никаких осбытий не было. Убедись в этом написав alert(event), заменив: event.ctrlKey = true;
В других местах, например в обработчике события event естественно существует.


Вот страница полностью загрузилась. Кликаем где угодно в теле. И получаем ошибку после алерта.
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Untitled</title>
<script>
    function t15(){
    alert("aa");
    window.event.ctrlKey = true;
    }
</script>
</head>
<body onclick="t15();">
</body>
</html>


Кстати вот такой код работает. Заменяет при вводе * на точку.

Код

<html>
<script>
function Test()
{
 //alert("1");
 if (event.keyCode==42) {event.keyCode=8226;}
}

</script>
<input type=text name=F3 onkeypress=Test() style="font-family: tahoma,verdana,sans-serif;font-size:18px;">
</html>

Автор: Sardar 26.7.2005, 23:13
В MSDN написанно "Sets or retrieves the state of the CTRL key.", проверяю твой код, не пашет. Поставил на таймаут, как и следует event=null, другие события(onkeydown, onkeypress) тоже не позволяют менять свойство.

У ИЕ такая ошибка возникает когда он не может найти геттера/сеттера свойства обьекта.

Пиши MS, жалуйся что их дока ошибочна smile Xотя возможно установить поле можно только для собственных событий.

Цитата(funasian @ 26.7.2005, 21:41)
Кстати вот такой код работает. Заменяет при вводе * на точку.

Угу, так транслит на translit.ru работает.

Автор: funasian 26.7.2005, 23:16
Получается что никак это сделать невозможно?

Цитата

Угу, так транслит на translit.ru работает.


Может быть при вводе с клавы возникает ещё какое-то событие, которое не документированно. И оно разрешает показывать ту клавишу которую пытаешся сымитировать?

Автор: Sardar 27.7.2005, 00:02
Цитата(funasian @ 26.7.2005, 22:16)
Получается что никак это сделать невозможно?

Если поискать хорошо, может что нибудь найдёться. Я своим проектом занят, беглым взглядом по MSDN'ну ничего не нашёл.

Цитата(funasian @ 26.7.2005, 22:16)
Может быть при вводе с клавы возникает ещё какое-то событие, которое не документированно. И оно разрешает показывать ту клавишу которую пытаешся сымитировать?

Пробуем зажечь всю цепочку onkeydown, up, press.
Код
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    <title>Untitled</title>
<script type="text/javascript">
<!--

function processText() {
  var txt=document.getElementById("src").value;
  var t=document.getElementById("tgt");
  for(var i=0; i<txt.length; i++) {
       var e=document.createEventObject()
       e.keyCode=txt.charCodeAt(i);
       e.returnValue=txt.charAt(i);
       e.cancelBubble=false;
       t.focus();
       t.fireEvent("onkeydown", e);
       t.fireEvent("onkeyup", e);
       t.fireEvent("onkeypress", e);
  }
}
//-->
</script>
</head>

<body>
<input type="text" id="src" /><button onclick="setTimeout(processText,1000);">Process</button><br>
<textarea id="tgt"></textarea>

</body>
</html>

У меня результат тот же, поле пустое.
Добавлено @ 00:08
Интересно, попробовав такой изврат, получаю ошибку в 15 строке, поле keyCode только для чтения smile
Код
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
    <title>Untitled</title>
<script type="text/javascript">
<!--
var gevent=null;
function processText() {
  var txt=document.getElementById("src").value;
  var t=document.getElementById("tgt");
  for(var i=0; i<txt.length; i++) {
       alert(gevent);
       var e=gevent? gevent: document.createEventObject();
       e.keyCode=txt.charCodeAt(i);
       e.returnValue=txt.charAt(i);
       e.cancelBubble=false;
       t.focus();
       t.fireEvent("onkeydown", e);
       t.fireEvent("onkeyup", e);
       t.fireEvent("onkeypress", e);
  }
}
//-->
</script>
</head>

<body>
<input type="text" id="src" onkeypress="gevent=event; alert(gevent);"/><button onclick="setTimeout(processText,1000);">Process</button><br>
<textarea id="tgt"></textarea>

</body>
</html>

Автор: funasian 27.7.2005, 14:43
Хорошо. Пойдем от противного. smile

Есть ли возможно перехватить полностью все события, не только те которые описаны. А полностью все и выводить их куда-то? То есть всех ементов и вывод что ето за евент.

Автор: Sardar 27.7.2005, 14:58
"Перехватить все события" можно если установить обработчиков событий на все события, иначе никак. А что ты понимаешь под "выводить" не понятно, можно например распечатать свойства обьекта события.

Автор: funasian 27.7.2005, 19:08
Я имею ввиду вот какой перехват. Это приблизительный код.

Код

<script to="event">
 
 //Пробежатся по всем event который произошли, влаг ведь у них должен быть
 //Даллее собрать всю инфу и вывести в текст арею или простов в код иннером.
 //Информацию о всех которые установленны и какие у них в данный момент установленны параметры
</script>


Вот что имелось ввиду. smile

Автор: sergejzr 27.7.2005, 19:28
Цитата(Sardar @ 26.7.2005, 18:13)
При этом чёрт его знает почему Мозилла кидает "NOT SUPPORTED" исключение. Думал потому что в событии onclick кнопки создаём, поставил на таймату, нет не пашет. Но по теории должно быть так как в примере.

Это глюк новой мозиллы до 1.0.4 (включительно) всё работает. Пока я тоже не нашёл хвостов, глюк это или фича smile
Скорее всего отключили суппорт по соображением секьюрити, что так же означает, что придётся транслит переписывать через одно место, с гашением события и переписыванием value.

Сардару:
Кстати в новой мозилле по моему ещё больше глюков по событиям. Например горячие клавиши всё ещё передают события системе на моём компе... В старых версиях проверял, всё отлично работает...

Автор: Sardar 28.7.2005, 01:22
Цитата(funasian @ 27.7.2005, 18:08)
Я имею ввиду вот какой перехват. Это приблизительный код.

Нет, дефолтных событий нет на сколько я знаю. Есть у <script> аттрибут http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/event.asp, но конструкция по сути заменяет inline события для элементов. Удобная кстати штука, даже в http://www.w3.org/TR/2000/WD-DOM-Level-1-20000929/level-one-html.html#ID-81598695 вошла. Кстати в XHTML по моему нельзя писать inline события, вот конструкция будет удобной.


Цитата(sergej @ 27.7.2005, 18:28)
Это глюк новой мозиллы до 1.0.4 (включительно) всё работает.

У меня тоже такое предчувствие было...

Цитата(sergej @ 27.7.2005, 18:28)
по соображением секьюрити

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

Автор: sergejzr 30.7.2005, 00:02
Мдя-.. видимо мозиловцы ставят нам подножку по отношению к генерации собсвенных событий...
Вот тут я с ними пытался дискутировать.
https://bugzilla.mozilla.org/show_bug.cgi?id=302546

Получается, что (так как dispatchEvent вызывается перед вызовом нашего листенера)

Добавлено @ 00:06
Мдя-.. видимо мозиловцы ставят нам подножку по отношению к генерации собственных событий...
Вот тут я с ними пытался дискутировать.
https://bugzilla.mozilla.org/show_bug.cgi?id=302546
  • Получается, что dispatchEvent вызывается перед вызовом нашего листенера. После однократного прохождение через dispatchEvent, событие становится read only.
    Значит менять браузерные события больше нельзя.
  • А самогенерированные можно, но браузер их проигнорирует.

Хороша петрушка, не правда ли? Посмотрим, чем закончится дискуссия, но у меня дурное предчувствие, что initKeyEvent можно забыть smile

Автор: Sardar 30.7.2005, 00:52
Да, согласно DOM2 Event инициализировать событие нужно до его возбуждения. В обработчике событий событие уже возбужденно, initKeyEvent вызывать нельзя, что ставит крест на подходе к транслиту, на подмене кодов символов.

Тоже подумал что можно preventDefault() текущее событие и попытаться создать своё, которое инициализировать небоходимыми значениями и возбудить на текстовом поле. Код кидает исключение, по моему даже мозилловцы не смогут обьяснить зачем это было нужно smile В спецификации не стоит что запрещенно создавать и возбуждать события внутри обработчика другого события.

Ёлки не умно мозилловцы что то поступили smile

Автор: sergejzr 30.7.2005, 01:00
Цитата(Sardar @ 29.7.2005, 23:52)
Тоже подумал что можно preventDefault() текущее событие и попытаться создать своё, которое инициализировать небоходимыми значениями и возбудить на текстовом поле. Код кидает исключение, по моему даже мозилловцы не смогут обьяснить зачем это было нужно


Там в тикете я опубликовал второй пример, где исключение не кидается, но... там вступает в силу второй пункт:

самогенерированные keyevents браузер игнорирует smile

Вот оба примера:

http://files.vingrad.ru/sergej.z/bugs/initevent.html
http://files.vingrad.ru/sergej.z/bugs/createevent.html

Автор: Sardar 30.7.2005, 01:37
Цитата(sergej @ 30.7.2005, 00:00)
самогенерированные keyevents браузер игнорирует

А у меня всё равно кидаються события на initKeyEvent, хотя обьект события был только что создан и не возбуждался, Mofilla Firefox 1.0.6

Автор: sergejzr 30.7.2005, 01:43
Этот код тоже?
http://files.vingrad.ru/sergej.z/bugs/createevent.html

Странно.. У меня тоже 1.0.6. Исключений нет. Как впрочем и толку smile

Кстати, обрати внимание, как пришлось извратится, чтобы не попасть в вечную рекурсию smile

Автор: Sardar 30.7.2005, 16:13
Цитата(sergej @ 30.7.2005, 00:43)
Странно.. У меня тоже 1.0.6. Исключений нет. Как впрочем и толку

Верно, я генерил Events, а не KeyEvents, потому initKeyEvent давало исключение в любом случае. Твой код "работает" без ошибок. Попробовал откладывать возбуждение на таймаут, без результатно.

Был на xulplanet.com, девелопеских страничках мозиллы, не пойму где взять полный список всех типов событий, что можно создать через createEvent. Пока опытным путём нашёл: Events, UIEvents, KeyEvents.

Автор: Ciber SLasH 16.3.2006, 02:06
Интересно стало. smile
Так что, есть какое-нить решение создать своё событие?
Я вот выгуглил такой код:
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script type='text/javascript'>
onload = function () {
    evt = document.createEvent('KeyEvents');
    //evt.initKeyEvent('keypress', true, true, window, false, false, false, false, 0, evt.DOM_VK_F11);
    evt.initKeyEvent("keypress", true, true, document.defaultView,
        evt.ctrlKey, evt.altKey, evt.shiftKey,
        evt.metaKey, 122, 122);
    evt.preventDefault();
    document.dispatchEvent(evt);
    //evt.target.dispatchEvent(evt);
}
</script>
</head>

<body>

</body>
</html>

но не работает, хотя ошибок в консоли FireFox не пишет, а Opera'тивная консоль говорит "Unhandled exception: [Object DOMException]" (по идеи должен был создаться ивент, который нажимает кнопку F11 для того, чтобы браузер переходил в полноэкранный режим).

Автор: Sardar 16.3.2006, 11:49
А разве не ты сам отключил дефолтовое действие (разворот на fullscreen) строчкой evt.preventDefault(); ?
Также по моему в фуллскрин только сам пользователь перейти может, скриптами запрещено.

Автор: Ciber SLasH 16.3.2006, 22:45
А можно таким макаром нажать программно на Ctrl+U ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)