Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Изменить событие по клику (https://javascript.ru/forum/misc/81680-izmenit-sobytie-po-kliku.html)

Ubivectel 12.01.2021 20:05

Изменить событие по клику
 
Добре товарищи!

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

Вот фрагмент кода который как я понимаю формирует юзер лист:

kide.insert_sesion = function(user) {
	var div = document.createElement('div');
	div.setAttribute('style', 'cursor:pointer');
	div.setAttribute('class', user._class);
	div.onclick = function() { kide.mostrar_usuario(user.id, user.name, user.rango, user.sesion, user.profile, user.img) };
	div.innerHTML = user.name;
	this.$('KIDE_usuarios').insertBefore(div, this.$('KIDE_usuarios').firstChild);
};


а вот код который умеет вставлять в в окно ввода текста ники (первоначально вставляет код смайликов):

<a href="javascript:kide.insertSmile(' Выводимый текст ')">
		Отображаемый текст
		</a>


На всякий случай ссылка на файл JS: https://noviy-kovcheg.ru/components/...ult/js/kide.js

рони 12.01.2021 20:28

Цитата:

Сообщение от Ubivectel
вставлять по клику ник юзера с запятой в окно ввода текста,

kide.insertSmile(user.name  + ', ');

вместо
kide.mostrar_usuario(user.id, user.name, user.rango, user.sesion, user.profile, user.img)

рони 12.01.2021 20:46

Ubivectel,
kide.insert_sesion = function(user) {
	var div = document.createElement('div');
	div.setAttribute('style', 'cursor:pointer');
	div.setAttribute('class', user._class);
	div.onclick = function() { kide.mostrar_usuario(user.id, user.name, user.rango, user.sesion, user.profile, user.img) };
	div.innerHTML = user.name;
    div.addEventListener('contextmenu', function(event) {
    event.preventDefault();
    kide.insertSmile(user.name  + ', ');
    }, true);
	this.$('KIDE_usuarios').insertBefore(div, this.$('KIDE_usuarios').firstChild);
};

Ubivectel 12.01.2021 20:55

спасибо рони, как всегда все работает, и правда профессор! :)

Ubivectel 12.01.2021 22:37

Все, окончательно все сделал, только поменял местами события, левый клик вставляет ник, а правый вызывает меню. Хотел проделать тоже самое с никами в окне сообщений, но похоже, что там клик обрабатывает не JS а PHP, и по образу и подобию сделать не прокатило :(

Ubivectel 12.01.2021 23:33

На случай если кто-то php понимает не хуже JS:

echo '<span style="cursor: pointer" title="'.$tiempo.'" onclick="kide.mensaje(\''.addslashes($r->name).'\','.$r->userid.','.$r->id.',\''.$r->url.'\',\''.$tiempo.'\',\''.$r->sesion.'\','.$r->rango.',\''.$r->img.'\')" class="'.KideHelper::getRango($r->rango, 'KIDE_').'">';

laimas 12.01.2021 23:37

Цитата:

Сообщение от Ubivectel
там клик обрабатывает не JS а PHP

PHP этого делать не может, да и не нужно ему это.

Ubivectel 12.01.2021 23:43

Спасибо, понял, полез искать где оно в скрипте)

рони 13.01.2021 00:04

Цитата:

Сообщение от Ubivectel
На случай если кто-то php понимает не хуже JS:

да это именно эта строка, формат могу путать но будет что-то типа
echo '<span style="cursor: pointer" title="'.$tiempo.'" onclick="kide.insertSmile(\''.addslashes($r->name).'\')">';

Ubivectel 13.01.2021 00:23

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

Ubivectel 13.01.2021 01:14

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

echo '<span style="cursor: pointer" title="'.$tiempo.'" onclick="kide.insertSmile(\''.addslashes($r->name), ', '.'\')" class="'.KideHelper::getRango($r->rango, 'KIDE_').'">';


Осталось повесить меню на правый клик, и счастье станет полным ))))

рони 13.01.2021 07:53

Цитата:

Сообщение от Ubivectel
а первоначальный код вызывать по правому клику

oncontextmenu="прежний код onclick"

Ubivectel 13.01.2021 09:02

Однако вот что выяснил в ходе экспериментов, код PHP отвечает за сообщения отправленные в чат до последнего обновления страницы, сейчас вписал: oncontextmenu и все заработало как надо, но, сообщения поступающие вновь по прежнему открывают меню, и если я правильно понял отвечает за это опять таки JS, вот этот фрагмент:

kide.insertNewContent = function(uid,name,text,url,ti,color,rango,id,sesion,yo,hora,img) {
	if (text.replace(/ /g, "") != "") {
		var c = color.length>0 ? 'style="color:#'+color+'" class="KIDE_msg"' : 'class="KIDE_dc_'+this.rangos[rango]+' KIDE_msg"';
		var div = this.$('KIDE_msgs');
		var nodo = document.createElement('div');
		var insertO = this.$("KIDE_output");
		var s_hora;
		nodo.setAttribute('id', 'KIDE_id_'+id);
		nodo.setAttribute('class', 'KIDE_msg_top');
		if (this.show_hour)
			s_hora = '<span title="'+ti+'" class="KIDE_msg_hour">'+hora+'</span> ';
		else
			s_hora = '';
		var tmp = '';
		if (img && kide.show_avatar) {
			var style = kide.avatar_maxheight ? 'style="max-height:'+kide.avatar_maxheight+'" ' : '';
			tmp = '<img '+style+'src="'+img+'" class="KIDE_icono" alt="" /> ';
		}
		nodo.innerHTML = s_hora+tmp+'<span style="cursor: pointer" class="KIDE_'+this.rangos[rango]+'" onclick="kide.mensaje(\''+name+'\', '+uid+', '+id+', \''+url+'\', \''+ti+'\', \''+sesion+'\', '+rango+', \''+img+'\')">'+name+'</span>: <span '+c+'>'+this.filter_smilies(text)+'</span>';
		if (this.order == 'bottom') {
			this.insertAfter(nodo, insertO.lastChild);
		}
		else
			insertO.insertBefore(nodo, insertO.firstChild);
		if (!yo && this.sound == 1) 
			this.play_msg_sound();
		this.ajustar_scroll();
	}
};


Попытался сделать так, заменил это:

onclick="kide.mensaje(\''+name+'\', '+uid+', '+id+', \''+url+'\', \''+ti+'\', \''+sesion+'\', '+rango+', \''+img+'\')">'+name+'</span>: <span '+c+'>'+this.filter_smilies(text)+'</span>';


На это:

onclick=kide.insertSmile(user.name  + ', ');


Но видимо напутал с синтаксисом, такая конструкция "ломает" юзерлист и пользователи вообще не отображаются, да и с правым/левым бы лучше сразу правильно сделать.

Рони, в php все верно: oncontextmenu заработал как надо по правому клику, хотя интересно, что в отличии от JS не удаляет штатное, контекстное меню браузера. Впрочем бог с ним php, поскольку очевидно что главное, что бы левый клик - ник, правый - меню работали именно на вновь поступающих сообщениях.

laimas 13.01.2021 09:21

Цитата:

Сообщение от Ubivectel
в отличии от JS не удаляет штатное, контекстное меню браузера

Не надо путать хрен с пальцем, для РНР, это просто строка формируемая им для клиента. Нет в ней ни контекстных меню, никаких событий и т.п.

рони 13.01.2021 09:52

Цитата:

Сообщение от Ubivectel
хотя интересно, что в отличии от JS не удаляет штатное, контекстное меню браузера.

так сделайте чтоб не было ))) пример вам был показан, надо добавить в начале фразу: горшочек не вари точка с запятой, перед кодом kide...

Ubivectel 13.01.2021 10:34

Я уяснил, что надо добавить это:

div.addEventListener('contextmenu', function(event) {
	event.preventDefault();


к этому:

nodo.innerHTML = s_hora+tmp+'<span style="cursor: pointer" class="KIDE_'+this.rangos[rango]+'" onclick="kide.mensaje(\''+name+'\', '+uid+', '+id+', \''+url+'\', \''+ti+'\', \''+sesion+'\', '+rango+', \''+img+'\')">'+name+'</span>: <span '+c+'>'+this.filter_smilies(text)+'</span>';


Но как я это не впихиваю, оно ломает юзерлист, по примеру нифига не понимаю как сделать, строки слишком разные (

рони 13.01.2021 10:46

Ubivectel,
:-?

oncontextmenu="event.preventDefault();прежний код onclick"

рони 13.01.2021 10:51

Ubivectel,
onclick="kide.insertSmile(\''+name+\', ')";

Ubivectel 13.01.2021 10:56

Как же неприятно чувствовать себя тупым)))
Этот ведь для PHP строка, если я правильно понимаю?

oncontextmenu="event.preventDefault();прежний код onclick"

Ubivectel 13.01.2021 10:58

Не судите строго, я пока только по учебнику в JS "привет мир" вывожу, в самом начале я )

Ubivectel 13.01.2021 11:02

Сечас выглядит вот так:

onclick="kide.insertSmile(\''+name+\', ')";

																							 nodo.innerHTML = s_hora+tmp+'<span style="cursor: pointer" class="KIDE_'+this.rangos[rango]+'" onclick="kide.mensaje(\''+name+'\', '+uid+', '+id+', \''+url+'\', \''+ti+'\', \''+sesion+'\', '+rango+', \''+img+'\')">'+name+'</span>: <span '+c+'>'+this.filter_smilies(text)+'</span>';


Хоть убей не понимаю как вот это:

oncontextmenu="event.preventDefault();прежний код onclick"


добавить :(

Ubivectel 13.01.2021 11:07

Сейчас выглядит вот так:

onclick="kide.insertSmile(\''+name+\', ')";

																							 nodo.innerHTML = s_hora+tmp+'<span style="cursor: pointer" class="KIDE_'+this.rangos[rango]+'" onclick="kide.mensaje(\''+name+'\', '+uid+', '+id+', \''+url+'\', \''+ti+'\', \''+sesion+'\', '+rango+', \''+img+'\')">'+name+'</span>: <span '+c+'>'+this.filter_smilies(text)+'</span>';


ничего конечно не работает, хоть убей не пойму как правильно это:

oncontextmenu="event.preventDefault();прежний код onclick"


добавить. :(

рони 13.01.2021 11:10

Ubivectel,
сначала php сделайте, там нужно было добавить event.preventDefault();

Цитата:

Сообщение от Ubivectel
Хоть убей не понимаю как вот это:

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

рони 13.01.2021 11:14

Ubivectel,
копируйте полностью и заменяйте

nodo.innerHTML = s_hora+tmp+'<span style="cursor: pointer" class="KIDE_'+this.rangos[rango]+'" onclick="kide.insertSmile(\''+name+', \')" oncontextmenu="event.preventDefault();kide.mensaje(\''+name+'\', '+uid+', '+id+', \''+url+'\', \''+ti+'\', \''+sesion+'\', '+rango+', \''+img+'\')">'+name+'</span>: <span '+c+'>'+this.filter_smilies(text)+'</span>';

Ubivectel 13.01.2021 11:15

Аааааа, я просто выше написал, что в php делать необходимости нет, поскольку никто же постоянно не обновляет страницу, то есть там вполне можно оставить как есть. По сути сейчас единственная задача заставить это работать в JS.
В юзерлисте сейчас идеально работает, левый клик - ник, правый - меню. То есть сделать тоже самое с никами в окне сообщений и задача завершена )

Ubivectel 13.01.2021 11:52

oncontextmenu="event.preventDefault();прежний код onclick"
Это сделал, теперь в php все корректно и красиво)

Ubivectel 13.01.2021 12:08

Цитата:

Сообщение от рони (Сообщение 532672)
Ubivectel,
копируйте полностью и заменяйте

Все, кажется окончательно все заработало как надо! Рони еще раз спасибище, пошел дальше штурмовать учебник )

рони 13.01.2021 12:42

Цитата:

Сообщение от Ubivectel
пошел дальше штурмовать учебник )

Отмена действия браузера

Ubivectel 13.01.2021 12:45

Вот это полезно, записал в моск


Часовой пояс GMT +3, время: 00:34.