Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.03.2017, 10:18
Интересующийся
Отправить личное сообщение для KiberQ Посмотреть профиль Найти все сообщения от KiberQ
 
Регистрация: 01.03.2017
Сообщений: 14

Функция вызывается несколько раз
Всем привет, имеется код:

function showEdit(param) // Функция для отображения редактируемого поля
{
    x = param.id.replace(/[a-z]/ig, '');
    readOnly(x, false);
    
    document.getElementById(param.id).onkeydown = function (e) { //ENTER
    e = e || window.event;
    
        if (e.keyCode === 13) 
        {
            readOnly(x, true);
            editColumns(x); 
        }
    }
    
    $("input").blur(function(){
                editColumns(x);
        readOnly(x, true); 
    });
    
    $("textarea").blur(function(){
        editColumns(x);
        readOnly(x, true); 
    });
    
    return false;
}


Данная функция вызывается при двойном клике по input. Внизу у меня blur (если пользователь ввел что-то в поле, а после поле потеряло фокус, то вызывается функция editColumns, которая ведет уже на php скрипт. Проблема в том, что функция вызывается несколько раз, подозреваю, дело в том, что я неправильно прописываю blur (может, нужна какая-та проверка?). Если повесить в данный код alert, alert выпрыгнет раза 3-5, что я делаю не так?

Пробовал делать так:
$("textarea").focusout(function(){
		alert('qwe');
		// editColumns(x);
		// readOnly(x, true); 
    });

сначала алерт вызывается 1 раз, потом при следующем двойном клике - 2 и так дальше и дальше.
Ответить с цитированием
  #2 (permalink)  
Старый 01.03.2017, 10:28
Интересующийся
Отправить личное сообщение для KiberQ Посмотреть профиль Найти все сообщения от KiberQ
 
Регистрация: 01.03.2017
Сообщений: 14

Пробовал сделать так:

$("input").one("focusout", function(){
		alert('ewq');
		//readOnly(x, true); 
    });
	
	
	$("textarea").one("focusout", function(){
		alert('qwe');
		// editColumns(x);
		// readOnly(x, true); 
    });


но раз функция выбьет 1 алерт, при втором двойном клике два или три, и так рандомно выбивает то 1, то 5, то 3 и т.д.
Ответить с цитированием
  #3 (permalink)  
Старый 01.03.2017, 10:42
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

KiberQ, здравствуйте.

Вынесите обработчики события blur за пределы функции showEdit.
Каждый раз, вызывая showEdit, Вы назначаете новый обработчик.
Ответить с цитированием
  #4 (permalink)  
Старый 01.03.2017, 10:46
Интересующийся
Отправить личное сообщение для KiberQ Посмотреть профиль Найти все сообщения от KiberQ
 
Регистрация: 01.03.2017
Сообщений: 14

$("input").focusout(function(){
		alert('input');
    });

$("textarea").focusout(function(){
		alert('textarea');
    });	
	
function showEdit(param) // Функция для отображения редактируемого поля
{
	x = param.id.replace(/[a-z]/ig, '');
	readOnly(x, false);
	
	document.getElementById(param.id).onkeydown = function (e) { //ENTER
	e = e || window.event;
	
		if (e.keyCode === 13) 
		{
			readOnly(x, true);
				
		}
	}
	
	return false;
}


Вынес вне функций в js файл, теперь алерты вообще не появляются.

Последний раз редактировалось KiberQ, 01.03.2017 в 10:57.
Ответить с цитированием
  #5 (permalink)  
Старый 01.03.2017, 11:09
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

KiberQ,
ну, наверное, потому что элементы еще не загружены на страницу.
Используйте ready или load: https://jqbook.net.ru/jquery/Events1
Ответить с цитированием
  #6 (permalink)  
Старый 01.03.2017, 11:17
Интересующийся
Отправить личное сообщение для KiberQ Посмотреть профиль Найти все сообщения от KiberQ
 
Регистрация: 01.03.2017
Сообщений: 14

Да, спасибо, помогло, так работает:

$(document).ready(function() {
	$('title#titleText').html("Договора");
	$("input").blur(function(){
                editColumns(x);
		readOnly(x, true); 
    });
	
	$("textarea").blur(function(){
		editColumns(x);
		readOnly(x, true); 
    });
});


Но теперь назревает следующий вопрос, а как в (document).ready передать теперь x без глобальной переменной?
Ответить с цитированием
  #7 (permalink)  
Старый 01.03.2017, 11:30
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

KiberQ,
не поняла, что нужно...
Можете сделать исполняемый пример?
Ответить с цитированием
  #8 (permalink)  
Старый 01.03.2017, 11:39
Интересующийся
Отправить личное сообщение для KiberQ Посмотреть профиль Найти все сообщения от KiberQ
 
Регистрация: 01.03.2017
Сообщений: 14

HTML
<инпут двойной клик = "showEdit(this)">

JS
function showEdit(param) // Функция для отображения редактируемого поля
{
	x = param.id.replace(/[a-z]/ig, ''); //Получаем id инпута
	readOnly(x, false); // Это нам не важно
	
	document.getElementById(param.id).onkeydown = function (e) { //ENTER
	e = e || window.event;
	
		if (e.keyCode === 13) 
		{
			readOnly(x, true);
                        editColumns(x); // При нажатии на enter сохраняем
				
		}
	}
	
	return false;
}


И, собственно, то, что Вы подсказали:
$(document).ready(function() {
	$('title#titleText').html("Договора");
	$("input").blur(function(){
		alert(x); //Тот самый x из showEdit
    });
	
	$("textarea").blur(function(){
		alert(x); //Тот самый x из showEdit
    });
});
Ответить с цитированием
  #9 (permalink)  
Старый 01.03.2017, 12:16
Профессор
Отправить личное сообщение для Manyasha Посмотреть профиль Найти все сообщения от Manyasha
 
Регистрация: 21.09.2015
Сообщений: 196

KiberQ,
ну так Ваш вариант работает:
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script>
function showEdit(param) // Функция для отображения редактируемого поля
{
    x = param.id.replace(/[a-z]/ig, ''); //Получаем id инпута
    console.log(x);
     
    return false;
}
$(document).ready(function() {
    $('title#titleText').html("Договора");
    $("input").blur(function(){
        alert(x); //Тот самый x из showEdit
    });
     
    $("textarea").blur(function(){
        alert(x); //Тот самый x из showEdit
    });
});
</script>
<textarea id="test1"></textarea>
<input type="text" id="test2" ondblclick="showEdit(this)">
<input type="text" id="test3" ondblclick="showEdit(this)">
</body>

Чем не нравится?
Ответить с цитированием
  #10 (permalink)  
Старый 01.03.2017, 12:25
Интересующийся
Отправить личное сообщение для KiberQ Посмотреть профиль Найти все сообщения от KiberQ
 
Регистрация: 01.03.2017
Сообщений: 14

Так как выведется x, если он локальный, существующий только в функции showEdit?
alert(x); //Тот самый x из showEdit
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
click вызывается несколько раз SKLNSK jQuery 7 29.05.2015 13:49
Получения данных за несколько раз. mrKot Общие вопросы Javascript 1 24.11.2014 08:19
Контроллер запускается несколько раз при загрузке страницы tayrin Angular.js 4 15.07.2014 08:29
Функция javascript вызывается при загрузке страницы Juli174 Общие вопросы Javascript 1 17.12.2013 19:38
live click выполняется несколько раз hara jQuery 9 09.06.2010 10:58