Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Функции срабатывают по несколько раз (https://javascript.ru/forum/jquery/71972-funkcii-srabatyvayut-po-neskolko-raz.html)

Samsam 26.12.2017 08:55

Функции срабатывают по несколько раз
 
Подгружаю поле ввода по клике на ссылку.

$(div).load('pole.php');

если прописывать дополнительные функции в самом pole.php
допустим

if(event.keyCode == 13){ alert('Ураа'); }

то функция повторяется столько же сколько будет и полей . а функции вне файла pole.php ни срабатывают. как поступить ?

рони 26.12.2017 09:39

Samsam,
ставить обработку событий на то что присутствует всегда через $('...').on('click', 'input',)

Samsam 26.12.2017 09:46

$( "textarea" ).keyup(function(event) {.. } - Такой вариант не пойдёт ? он будет выбирать все textarea ?

Samsam 26.12.2017 09:51

а вообще нормально что коде будет дублироваться несколько раз одна и та же функция но с разными $('...'). ?

рони 26.12.2017 09:58

Samsam,
:-?

$('body').on('keyup', 'textarea',function(event) {if(event.keyCode == 13){ alert('Ураа'); }})

Samsam 02.01.2018 11:22

Этот вариант не срабатывает.

Сейчас вот так $( ".textarea" ).on('keypress', function(event) { ... });

Подгруженные блоки $( ".textarea" ) не работают. Подскажите выход

рони 02.01.2018 11:31

Samsam,
ставить обработчик на то что есть всегда (родителя и т.д. до window)
$('body').on('keypress', '.textarea', function(event) { ... }
или после создания элемента

$(div).load('pole.php',function() { $( ".textarea" ).on('keypress', function(event) { ... });}
);

Samsam 02.01.2018 11:49

Спасибо ! всё заработало. Ещё вопрос подскажите с фокусом.

$(div).html('длинный текст');
$(div).focus();

как сделать что бы фокус попадал в конец текста ?

рони 02.01.2018 12:15

contenteditable курсор в конец текста
 
Samsam,
может есть другой способ
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
var str = "длинный текст" , pos = str.length;
$("div").html(str);
var range = document.createRange();
range.setStart($("div")[0].childNodes[0], pos);
range.collapse(true);
var sel = window.getSelection();
sel.removeAllRanges();
sel.addRange(range);
});
  </script>
</head>

<body>
<div id="slider" contenteditable ></div>

</body>
</html>

Samsam 03.01.2018 13:21

Спасибо. А вообще будет ли замедляться работа сайта если вызов функций такого формата ( $('body').on('...', function(){...} ) будет очень много ?

рони 03.01.2018 15:48

Samsam,
нет, но лучше поискать ближайшего постоянного родителя, вместо 'body'

Samsam 06.01.2018 18:38

Спасибо. Подскажите пожалуйста ещё один момент.
Как узнать элементы которые находятся в блоке.

<div onclick=elem(this);>
<img src=1.jpg>
<i>текст</i>
<b>текст 2</b>
</div>


function elem(id) {
как узнать атрибуты элементов находящиеся в этом блоке 
}

рони 06.01.2018 18:50

Samsam,
что должно быть на выходе?

Samsam 06.01.2018 18:59

кажется разобрался .
$(div).find("img").attr('src') или $(div).find("i").text()
Такой способ правильный ?

рони 06.01.2018 19:25

Samsam,
да если img или i одни в div иначе нужно указать индекс через селектор или методы jquery, по умолчанию индекс ноль

Samsam 06.01.2018 22:39

Ясно. Хотелось бы уточнить вопрос который я публиковал в другом посте. по поводу блока contenteditable.
как сделать так что бы что бы весь текст попадая в блок форматировался без html тегов. Но была возможность добавления смайликов.

рони 06.01.2018 23:28

Samsam,
по input менять текст на смайлы и
вырезать лишние теги по blur ... как-то так

рони 06.01.2018 23:31

Samsam,
3 пост по ссылке ниже
https://javascript.ru/forum/showthre...772#post326190

Samsam 07.01.2018 02:28

Сейчас почитаю. спс. И ещё если можно. Проблема с onclick в дочерних элементах.

<a href=# onclick=start() return false;>
<div>1</div>
<div>2</div>
<div class=noactive>3</div>
</a>

function start() {
alert('Ура');
.. как запретит срабатывание оnclick в блоке noactive ?
}

рони 07.01.2018 03:06

Samsam,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css"> a div.noactive{
    background-color: rgba(211, 211, 211, 1);

  }
  a div{
    background-color: rgba(238, 232, 170, 1);
    height: 100px
  }
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
  $("a").on("click", function(event) {
    event.preventDefault();
  if(!$(event.target).closest(".noactive").length) {alert('Ура');}
})
});
  </script>
</head>

<body>
<a href=# >
 <div>1</div>
 <div>2</div>
 <div class=noactive>3</div>
 </a>

</body>
</html>

Samsam 07.01.2018 10:52

А что если у меня onclick повешан на саму ссылку <a href=# onclick=start()></a>

как тогда использовать это в функции

function start() {
...
}

рони 07.01.2018 11:01

Samsam,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css"> a div.noactive{
    background-color: rgba(211, 211, 211, 1);

  }
  a div{
    background-color: rgba(238, 232, 170, 1);
    height: 100px
  }
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
 function st(event) {
    event.preventDefault();
  if(!$(event.target).closest(".noactive").length) {alert('Ура');}
};

  </script>
</head>

<body>
<a href=#  onclick="st(event)">
 <div>1</div>
 <div>2</div>
 <div class=noactive>3</div>
 </a>

</body>
</html>

Samsam 07.01.2018 11:45

спасибо! а можно было бы узнать event в самой функции не передавая её в onclick(event) а через $(this)...

рони 07.01.2018 12:38

Samsam,
можно не передавая, но только не в Mozilla Firefox

Samsam 07.01.2018 13:09

Понятно. А по поводу вашего ответа в #18 посту. Такой же метод я и использую, но сталкиваюсь с проблемой что сам блок contenteditable становится уязвим к html тегам которые мне не нужны. мне нужно исключить все html теги, но при этом сделать возможным добавлять в блок определённые изображения смайликов.

P.S Это нужна для поля ввода комментарий на подобии вконтакте

рони 07.01.2018 13:17

Samsam,
чем вас плагин не устроил? из поста №18?

Samsam 07.01.2018 13:57

http://kwolfy.github.io/KEmoji/ - попробуйте перенести текст в поле. Он переносится вместе со стилими

Samsam 07.01.2018 15:17

$('body').on('mousemove', '.textarea', function(event) {
		var a = $(this).text();
		$(this).html(a);
	});


можно так но тогда и смайлики не вставить. Как сделать исключение ?

рони 07.01.2018 15:40

Samsam,
плагин давно не обновлялся, содержит ошибки.
лучше поискать по новее. тема слишком тяжёлая, не могу помочь.

Samsam 07.01.2018 16:17

Ясно. а вообще это скорее надо делать методом unwrap или replace ?

рони 07.01.2018 16:20

replace и replaceChild

Samsam 07.01.2018 20:04

а можно пример ? допустим как удалить теги <b>

Samsam 07.01.2018 20:07

А вообще как вы думаете заменять все теги кроме img с классом class=smile будет правильней либо запретить все теги кроме img с классом class=smile ?

рони 07.01.2018 21:29

Samsam,
можно заменять, как можно запретить для меня загадка.

Samsam 07.01.2018 21:30

если можно приведите пример

рони 07.01.2018 22:05

Samsam,
<!DOCTYPE html>

<html>
<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

  <script>
$(function() {
$('body').on('input', '.editor', function() {
   this.innerHTML = this.innerHTML.replace(/<[^>]*?>/g , '')
})

});
  </script>
</head>

<body>
<div class="editor" contenteditable>test</div>

</body>
</html>

рони 07.01.2018 22:06

Samsam,
https://javascript.ru/forum/job/6497...tml#post428912

Samsam 09.01.2018 12:16

Используя ваши подсказки сделал так .

('body').on('input', '.textarea', function() {
var msg = $(this).html();

//Ищи Img и меняю если это смайл

var a = msg.replace(/<img[^>]+>/g, function(i) { 
	var tag = i.match(/src="([^"]+)"/)[1];
	if (tag == 'http://domen.ru/smiles/1.png') return ':)' ;
        if (tag == 'http://domen.ru/smiles/2.png') return ':(' ;
......

else return '' ;
});  


//Потом удаляю все теги 
var b = a.replace(/<[^>]*?>/g , '');

//Обратно меняю символы на img через функцию
var d = vozvratIMG(b);

// И вывожу
$(this).html(d);
});


Насколько это правильно и годно не знаю но работает. Как вы думаете ?
Проблема в данный момент с кареткой которая после каждого обновления $(this).html(d); становится в конец что приводит к проблеме если нудно изменить текст где то по середине.
Подскажите как мне это решить ?

рони 09.01.2018 12:43

Цитата:

Сообщение от Samsam
Подскажите как мне это решить ?

запоминать позицию курсора, потом возвращать на это место и хорошо бы ничего не менять, если менять нечего.
медитировать можно на томже плагине, с курсором там вроде всё в порядке
#L232

Samsam 09.01.2018 16:29

Цитата:

Сообщение от рони (Сообщение 474550)
запоминать позицию курсора, потом возвращать на это место и хорошо бы ничего не менять, если менять нечего.
медитировать можно на томже плагине, с курсором там вроде всё в порядке
#L232

ни как не могу найти решение :help:


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