Как вызвать обработчик jQuery через атрибуты элемента

Главные вкладки

Аватар пользователя postgres postgres 3 мая 2015 в 19:48

Необходимо навесить валидатор на элемент input (не форма, просто октрытый элемент)
Элемент создается кодом

<?phpecho 'label>Для ввода <input id="mytext" type="text" onkeypress="my_handler(this)" size="30"></label>';
    ?>

Все работало пока не решил в соответствии со стандартом написания скрипта в Drupal 7
Сделать обертку скрипта:

(function($){

function my_handler(e){
/* что то проверяем по введенному тексту

}

})(jQuery);  

Как правильно вызывать обработчики jQuery (javascript) из маркапа?
Или надо писать команды по фрэймфорку ajax?
Хотелось минимальными средствами обойтись.

Комментарии

Аватар пользователя sg85 sg85 4 мая 2015 в 3:23

Вам не помешает подучить JavaScript и jQuery, ибо у Вас проблемы с основами, функция my_handler будет недоступна за пределами анонимной функции, простейший способ в Вашем случае - определить её как метод объекта window - window.my_handler = function(e){ ..., работать будет, но так делать нельзя - это типичный "индусский код", правильно будет навесить событие через jQuery в attach behavior друпала.

Аватар пользователя postgres postgres 6 мая 2015 в 8:01

"sg85" wrote:
Вам не помешает подучить JavaScript и jQuery, ибо у Вас проблемы с основами

Браво! Такой типичный олдскульный рунет. Могли ли в рунете родиться такие сокращения как IMHO или что то подобное? о нет, конечно нет. ок.

"sg85" wrote:
правильно будет навесить событие через jQuery в attach behavior друпала.

Я бы не назвал это "правильно", я бы назвал это вынужденно. В какой момент будет повешено событие?
$.documnt.ready? Если так, то знаете ли, до этого ready надо еще дожить...
Собственно вопрос был как это сделать через markup.
... а вот уже нашел вот прямо сейчас в голову две мысли пришло - пишу прямо здесь:
1. А что собственно мешает мне вынести определение функции из обертки? Боязнь многоверсионности, которую Drupal поддерживает через обертку?
2. А что вообще мешает мне определить функцию в самом маркапе в тэгах ? Если уж мне этот маркап так сдался, то может это и резонно? Ну хорошо, ладно, разносить код - это конечно страшно неудобно но ведь мой вопрос был о том как?
В моем случае я сделал так:

function my_handler(e){
/* что то делаем пока страница грузится */
 jQuery(#sisi)......
}
function($){
 
/*...
ну а здесь пишут только заматерелые и важные drupalисты
*/

})(jQuery);

Я конечно понимаю что делаю. behaivor еще даже не родился... а тут такое

Ну а когда я подучу немного Jquery и javascript я сделаю замыкание, в том случае если понадобиться функционал из обертки. Вот так:

var my_handler;

function($){
 
/*...
ну а здесь пишут только заматерелые и важные drupalисты
*/

my_handler =  function(){

$('sisi').animate(...);
};

})(jQuery);

и теперь свободно в маркапе могу писать
<input type="button" onclick="my_handler()" >

Спасибо.

Аватар пользователя sg85 sg85 6 мая 2015 в 22:02

"postgres" wrote:
Браво! Такой типичный олдскульный рунет. Могли ли в рунете родиться такие сокращения как IMHO или что то подобное? о нет, конечно нет. ок

wtf?
"postgres" wrote:
Я бы не назвал это "правильно", я бы назвал это вынужденно.

есть такое понятие, как дизайн кода
"postgres" wrote:
В какой момент будет повешено событие?

наберите в гугле "drupal ajax behaviors"
"postgres" wrote:
$.documnt.ready? Если так, то знаете ли, до этого ready надо еще дожить...

выполнение скриптов, связанных с манипуляцией DOM, до полной загрузки этого самого DOM в 99.9999999% случаев не самая разумная идея.
"postgres" wrote:
Собственно вопрос был как это сделать через markup.

ответ был дан в 1м комменте
"postgres" wrote:
1. А что собственно мешает мне вынести определение функции из обертки? Боязнь многоверсионности, которую Drupal поддерживает через обертку?

На самом деле, в Вашем случае - ничего
"postgres" wrote:
2. А что вообще мешает мне определить функцию в самом маркапе в тэгах ? Если уж мне этот маркап так сдался, то может это и резонно? Ну хорошо, ладно, разносить код - это конечно страшно неудобно но ведь мой вопрос был о том как?

есть такое понятие, как дизайн кода, а ответ был дан в 1м комменте

а вообще, есть такое понятие, как дизайн кода, он присутствует в любой нормальной системе, разве что кроме битрикса, там что ни проект, то собрание тараканов разработчика(по крайней мере из того, что попадалось мне)

P.S. на прочтение руководств по основам JS с того же javascript.ru ушел бы час, мой ответ появился на следующий день после появления топика, Ваш вариант появился через 3 дня, что довольно иррационально, не находите?

Аватар пользователя postgres postgres 6 мая 2015 в 23:13

"sg85" wrote:
есть такое понятие, как дизайн кода

Ну тут надо уточнить, что писал свой плагин.
есть также понятие инкапсуляции, безотносительно к чему либо. Далее дело личного стиля. Мне лично во всех смыслах нравится способ навешивать события через маркап. Буквально во всех. Это на 200% браузеро- и библиотеко- независимо. Когда можно через маркап всегда так делаю.

"sg85" wrote:
выполнение скриптов, связанных с манипуляцией DOM, до полной загрузки этого самого DOM в 99.9999999% случаев не самая разумная идея.

Нет ну конечно если пойти на принцип то можно и подождать полной загрузки DOM. Загрузка DOM на мобильных устройствах может идти до полминуты. Будем ждать? Мне лично совсем не нужно чтобы Яндекс поймал статистику отказа от посещения страниц.

"sg85" wrote:
наберите в гугле "drupal ajax behaviors"

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

В последнем примере я привел способ заведения функции в обертку без behaviors. Более короткий, более понятный, более лаконичный и ничем не противоречащий никаким принципам.

Если бы мне надо было таскать данные со страницы на сервер и обратно, то ... вообщем байк в автобус затаскивать не нужно, он тоже ездит Smile

Аватар пользователя drupby drupby 7 мая 2015 в 0:01

"postgres" wrote:
function($){
 
/*...
ну а здесь пишут только заматерелые и важные drupalисты
*/
my_handler = function(){
 
$('sisi').animate(...);
};
 
})(jQuery);

(function ($) {
  Drupal.mymodule = Drupal.mymodule || {
    my_handler: function () {
      $('sisi').animate(...);
    }
  };
})(jQuery);

ну а потом
onkeypress="Drupal.mymodule.my_handler()"

Аватар пользователя postgres postgres 7 мая 2015 в 10:13

Отличие в том, что объект Drupal уже объявлен и его не нужно замыкать. Но в целом суть та же. Плюс открытые перспективы к расширению.

Ссылки по теме кому интересно:
https://www.drupal.org/node/756722
http://habrahabr.ru/post/161039/

не могу найти материал по описанию javascript объекта Drupal - как формируется, как живет и т.п.

behaviors никто не отменял! он не только заменит $docement.ready, но и навесит событие на динамически загруженные блоки.

НО!!!
http://graker.ru/news/2011/02/10/neskolko_slov_o_drupalbehaviors_i_docum...

Аватар пользователя sg85 sg85 7 мая 2015 в 13:08

"postgres" wrote:
Ну тут надо уточнить, что писал свой плагин.

плагин к чему? собственному фреймворку?
"postgres" wrote:
есть также понятие инкапсуляции, безотносительно к чему либо. Далее дело личного стиля. Мне лично во всех смыслах нравится способ навешивать события через маркап. Буквально во всех. Это на 200% браузеро- и библиотеко- независимо. Когда можно через маркап всегда так делаю.

Судя по всему написанному, инкапсуляцию Вы понимаете чуть больше, чем ни хрена
"postgres" wrote:
не могу найти материал по описанию javascript объекта Drupal - как формируется, как живет и т.п.

Исходники открыть религия не позволяет?
"postgres" wrote:
А вот принципиально не хочу. Система живая - сегодня так а завтра по другому будет. Смысл? Спросить да, это много времени не отнимет

Тогда зачем веб разработкой заниматься? Система живая - сегодня так а завтра по другому будет(телепатию изобретут или еще какую хрень), а тем более Drupal...
"postgres" wrote:
В последнем примере я привел способ заведения функции в обертку без behaviors. Более короткий, более понятный, более лаконичный и ничем не противоречащий никаким принципам.

мне приходится очень часто сталкиваться с подобными чужими трудами в работе, когда это "коротко, понятно и локанично" со временем превращается в "длинно, непонятно и убого" даже для его автора, при том до такой степени, что автор попросту делает ноги, а глядя на все это, становится непонятно, зачем заканчивать институты и даже школы, ибо лично у меня еще в начальной школе код был еще более "краток, понятен и локаничен"
"postgres" wrote:
Нет ну конечно если пойти на принцип то можно и подождать полной загрузки DOM. Загрузка DOM на мобильных устройствах может идти до полминуты. Будем ждать? Мне лично совсем не нужно чтобы Яндекс поймал статистику отказа от посещения страниц.

то есть, по Вашему мнению, если посетитель в момент загрузки страницы увидит "анимацию сисек"(судя по Вашему примеру кода), и по фиг, что на странице до сих пор нет остального контента, да и не факт, что будет, то обязательно останется на странице?

Аватар пользователя postgres postgres 7 мая 2015 в 14:10

sg85!

Вы ничего не ответили по существу вопроса. НИ-ЧЕ-ГО.
Молчите уж.
Собственно самопиар - это единственная мотивация Ваших постов.

ПО поводу sisi (по французски да-да) каждый читает в меру своей озабоченности.

Аватар пользователя sg85 sg85 7 мая 2015 в 16:44

"postgres" wrote:
Вы ничего не ответили по существу вопроса. НИ-ЧЕ-ГО.

"sg85" wrote:
window.my_handler = function(e){

Очки лучше заказывать у окулиста, а не покупать за 1 евро у цыган

"postgres" wrote:
Собственно самопиар - это единственная мотивация Ваших постов.

Отнюдь, мне всего лишь доставляет удовольствие общение с Вами, а параллельно пытаюсь предостеречь Вас от этого

"postgres" wrote:
ПО поводу sisi (по французски да-да) каждый читает в меру своей озабоченности.

Случаем не Вы являетесь разработчиком модуля ePayment(Paybox) для престы?

Аватар пользователя postgres postgres 7 мая 2015 в 16:54

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

Аватар пользователя sg85 sg85 7 мая 2015 в 16:55

"postgres" wrote:
Данный вами код вы сами же и раскритиковали как плохой.

я таки отметил Ваш код знаком качества? Или Вы считаете, если его же написать по другому/взять из другого источника, он станет таки лучше?
"postgres" wrote:
Вы считаете что откровенным хамством можно достичь поставленных целей?

а Вы ничего не путаете?