X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

3 страниц V   1 2 3 >
Открыть тему
Тема закрыта
> onKeyPress из подключаемого файла JS
Лёлик2
Лёлик2
Topic Starter сообщение 11.9.2010, 14:30; Ответить: Лёлик2
Сообщение #1


Нашел такой скрипт для запрета нажатия Ctrl+C, A, U:

function b(event){
var code=event.keyCode ? event.keyCode : event.which ? event.which : null;
if (event.ctrlKey){
// Ctrl+U
if (code == 117) return false;
if (code == 85) return false;
// Ctrl+C
if (code == 99) return false;
if (code == 67) return false;
// Ctrl+A
if (code == 97) return false;
if (code == 65) return false;
}
}
.....
<body onkeypress="return b(event)">

ВОПРОС: Хотелось бы избавится от <body onkeypress="return b(event)"> и написать все в подключаемом файле рядом с самим скриптом.
Написал так:

function b(event){
var code=event.keyCode ? event.keyCode : event.which ? event.which : null;
if (event.ctrlKey){
// Ctrl+U
if (code == 117) return false;
if (code == 85) return false;
// Ctrl+C
if (code == 99) return false;
if (code == 67) return false;
// Ctrl+A
if (code == 97) return false;
if (code == 65) return false;
}
}
[B]document.getElementsByTagName("body").onKeyPress=b(event);[/B]

Не работает! Как правильно написать?
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
MetSerp
MetSerp
сообщение 13.9.2010, 21:41; Ответить: MetSerp
Сообщение #2


ява скрипт регистрозависимый язык и он не знает что такое onKeyPress зато знает onkeypress.
Упс, не заметил сразу что вы по тегу берете, getElementsByTagName возвращает не объект а массив. Массив не имеет свойства onkeypress потому вам надо обратится непосредственно к элементу массива, например по индексу (в вашем случае 0) либо присвоить body id и брать по нему так как там возвращается объект
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Лёлик2
Лёлик2
Topic Starter сообщение 13.9.2010, 21:57; Ответить: Лёлик2
Сообщение #3


(MetSerp @ 14.9.2010, 00:41) *
ява скрипт регистрозависимый язык и он не знает что такое onKeyPress зато знает onkeypress
не заметил сразу что вы по тегу берете, getElementsByTagName возвращает не объект а массив. Массив не имеет свойства onkeypress потому вам надо обратится непосредственно к элементу массива, например по индексу (в вашем случае 0) либо присвоить body id и брать по нему так как там возвращается объект

Попробовал и так:
document.getElementsByTagName("body")[0].onkeypress=b(event);
и так
document.getElementsByTagName("body")[0].onkeypress=return b(event);
и большими буквами не хочет!
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
MetSerp
MetSerp
сообщение 13.9.2010, 23:47; Ответить: MetSerp
Сообщение #4


есть подозрение что проблема в самой функции так как
[PHP]<html>
<head>

</head>
<body>
<script>
document.getElementsByTagName('body')[0].onkeypress= function(event){
(event.ctrlKey)?alert('yes'):alert('no');
}
</script>
<textarea></textarea>
</body>
</html>[/PHP]
работает (проверял в хроме), но при этом стандартные сочетания по прежнему выполняют стандартное поведение, т.е. если нажать ctrl + A произойдет выделение всех элементов на странице, а алерт при этом не среагирует
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Лёлик2
Лёлик2
Topic Starter сообщение 13.9.2010, 23:54; Ответить: Лёлик2
Сообщение #5


(MetSerp @ 14.9.2010, 02:47) *
есть подозрение что проблема в самой функции

Извините я вас не понял, если вы о функции b то она работает, так как если написать <body onkeypress="return b(event)"> то все блокируется. А вот если это событие определяешь в самом файле JavaScript, а в HTML документе пишешь просто <body> то не работает почему-то!
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
MetSerp
MetSerp
сообщение 14.9.2010, 0:32; Ответить: MetSerp
Сообщение #6


немного освежил в голове javascript и вот что получилось[PHP]<html>
<head>

</head>
<body>
<script>
function b(event){
var code=event.keyCode||window.event;
if (event.ctrlKey){
alert('it\'s work!')
// Ctrl+U
if (code == 117) return false;
if (code == 85) return false;
// Ctrl+C
if (code == 99) return false;
if (code == 67) return false;
// Ctrl+A
if (code == 97) return false;
if (code == 65) return false;
}
}
document.onkeypress= b;
</script>
<textarea></textarea>
</body>
</html>[/PHP]
реакция происходит (в хроме точно, других браузеров сейчас нет так как я за 1500км от дома) например если нажать ctrl +Z то выскочит alert который и должен выскакивать при любом сочетании с кнопкой ctrl, но на хоткеи хром по прежнему реагирует четко, и видимо это не обойти, так как хоткеи хрома имеют более высокий приоритет над пользовательскими скриптами.
Ошибок в вашем скрипте было 2 (помимо названных раннее):
1. При присвоении свойству объекта on+некое_событие скобки необходимо опускать, так как в случае добавления скобок при первом ее вызове через событие произойдет присвоение результата функции и в дальнейшем функция не будет вызываться (хотя тут могу ошибится).
2. тернарный оператор.
Почему работало при вызове в html:
при вызове из html, содержимое атрибута браузер оборачивает в анонимную функцию, в итоге вышеперечисленные проблеммы отпадали
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Alcorn
Alcorn
сообщение 14.9.2010, 8:13; Ответить: Alcorn
Сообщение #7


Можно покороче -
[PHP]
document.onkeydown=function(e) {
e=e||window.event;
if (e.ctrlKey) {if ((e.keyCode=='85') || (e.keyCode=='67') || (e.keyCode=='65')) return false;}
}
[/PHP]

Вот только Опере на все эти запреты пофиг.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Лёлик2
Лёлик2
Topic Starter сообщение 14.9.2010, 19:37; Ответить: Лёлик2
Сообщение #8


По поводу тернарного оператора:
с вашим вариантом не работает в firefox, начальный вариант работает везде.
Остальное:
document.onkeypress= b;
document.onkeypress=function(event){...);
document.onkeydown=function(event){...);
не работает вообще либо в опере не работает.
А начальный вариант <body onkeypress="return b(event)"> в опере все блокирует! Попробуйте.

Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
MetSerp
MetSerp
сообщение 14.9.2010, 21:05; Ответить: MetSerp
Сообщение #9


проверил в изначальном варианте в хроме (т.е. с вызовом из html) ему вселенски пофигу, хоткеи работают в любом случае. На опере проверить не могу. По факту, полным аналогом вызова из html является просто оборот функции вашей в анонимную функцию, ну или в целом замещение функции анонимной т.е. так:
[PHP]
document.onKeyPress=function (event){
var code=event.keyCode ? event.keyCode : event.which ? event.which : null;
if (event.ctrlKey){
// Ctrl+U
if (code == 117) return false;
if (code == 85) return false;
// Ctrl+C
if (code == 99) return false;
if (code == 67) return false;
// Ctrl+A
if (code == 97) return false;
if (code == 65) return false;
}
}[/PHP]
обращение к тегу тут опущено так как вам по факту интересно любое нажатие кнопки
если просто эмулировать поведение браузера то ваш код можно переделать вот так:
[PHP]function b(event){
var code=event.keyCode ? event.keyCode : event.which ? event.which : null;
if (event.ctrlKey){
// Ctrl+U
if (code == 117) return false;
if (code == 85) return false;
// Ctrl+C
if (code == 99) return false;
if (code == 67) return false;
// Ctrl+A
if (code == 97) return false;
if (code == 65) return false;
}
}
document.getElementsByTagName("body")[0].onKeyPress=function (){return b(event)};
[/PHP]
примерно это и делает браузер с вашим кодом при вызове из тела документа.
Возможно вам будет полезно прочесть это
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
Лёлик2
Лёлик2
Topic Starter сообщение 15.9.2010, 1:13; Ответить: Лёлик2
Сообщение #10


(MetSerp @ 15.9.2010, 00:05) *
проверил в изначальном варианте в хроме (т.е. с вызовом из html) ему вселенски пофигу, хоткеи работают в любом случае

Да на хроме я не поверял, я только на Опере, IE8 и Firefox.
(MetSerp @ 15.9.2010, 00:05) *
Возможно вам будет полезно прочесть это

Прочел написано что только два варанта вызова обработчика, вы их указали но они не работают почему-то, я даже просто написал:

function ff (event){alert('нажата клавиша');}
document.getElementsByTagName("body")[0].onKeyPress=ff;

и не появляется alert ни в одном браузере (из моих трех)!
Я думаю тему можно закрыть проблема небольшая, буду вызывать с html, я просто не думал что это окажется такой сложный вопрос когда тему создавал. Хотя если кому интересно докопаться до сути то я буду рад выслушать предложения.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
3 страниц V   1 2 3 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Исправить ошибку при загрузке файла и добавить google recaptcha
0 Serg1991 3043 18.2.2015, 18:21
автор: -Serg1991-
Открытая тема (нет новых ответов) Ищу Копипастера 3р файл картинка+текст+кач файла и закач ко мне на хостинг
0 dimka1109 3209 21.1.2015, 20:13
автор: dimka1109
Открытая тема (нет новых ответов) Написать скрипт для внесение данных из файла
1 andre69 1216 6.11.2013, 17:35
автор: Slava1988
Открытая тема (нет новых ответов) Нужна помощь (при тыке на рекламу, скачивание файла).
0 Царь 2601 1.9.2013, 16:07
автор: -Царь-
Открытая тема (нет новых ответов) Просмотр рекламы перед скачкой файла
0 spudi 2621 28.5.2013, 12:04
автор: -spudi-


 



RSS Текстовая версия Сейчас: 23.4.2024, 12:38
Дизайн