powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Почему колбек функция передается всего один раз
25 сообщений из 25, страница 1 из 1
Почему колбек функция передается всего один раз
    #38068300
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
jQuery.fn.tarea = function(options) {

    return this.each(function() {
        var $textarea = $(this);
        $textarea.on('blur', function (e) {
            ...
            options.callback(e, $textarea.val());			
        });
    });
};

$("#myForm textarea").tarea({
    ...
    callback: function(e, value) {
        $.ajax({
            'url': 'action.php',
            'data': {'text': value, 'id': $(e.target).data('id')}
        });
    });
});


Смысл в том, что после перехода фокуса с текстового поля, его значение сохраняется в БД. Так вот, если мы применяем плагин tarea к нескольким полям, то параметр callback передается лишь первому. Остальные параметры (не функции) передаются каждому элементу коллекции без проблем. В чем проблема?
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068379
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
$("#myForm textarea").tarea({
    ...
    callback: function(e, value) {
        $.ajax({
            'url': 'action.php',
            'data': {'text': value, 'id': $(e.target).data('id')}
        });
    });
});

лишнее
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068425
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорри, это только здесь ошибка. Когда тестировал со скобками все впорядке было, иначе колбек бы, вообще, ни разу не передался
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068438
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что значит "не передется"?
ругается что options.callback не функция?
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068495
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ставлю вывод в консоль в плагине
Код: javascript
1.
2.
3.
jQuery.fn.tarea = function(options) {
    console.log(options)
    ...



И получаю
{param1, param2, function(e value)}
{param1, param2}
{param1, param2}
{param1, param2}
...
и т. д. по количеству текстовых полей

Если больше никакие параметры не передавать, то остальные строки просто будут пустыми
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068496
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вроде всё работает
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8" />
	<script src="../common/jquery.js" type="text/javascript"></script>
	<script type="text/javascript">
		jQuery.fn.tarea = function(options) {

			return this.each(function() {
				var $textarea = $(this);
				$textarea.on('blur', function (e) {
					options.callback(e, $textarea.val());			
				});
			});
		};
		
		$(function() {
			$("textarea").tarea({
				callback: function(e, value) {
					alert(e.target.id + ' ' + value);
				}
			});
		});
	</script>
</head>
<body>
	<textarea id="textarea1">text</textarea>
	<textarea id="textarea2">text</textarea>
	<textarea id="textarea3">text</textarea>
</body>
</html>

...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068557
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Работает... http://jsfiddle.net/nJX5g/1/
Непонятно, почему вывод в лог срабатывает только один раз, хотя текстовых поля три.

Но у меня все равно не работает. Возможно из-за того, что текстовые поля генерируются динамически (изначально есть только одно). Странно, что в этом случае обычные параметры передаются. Попробую дополнить пример
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068576
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2Непонятно, почему вывод в лог срабатывает только один раз, хотя текстовых поля три.поместите этот вывод внутрь each :)
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068606
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2что текстовые поля генерируются динамическинадеюсь, они добавляются на форму до вызова $("#myForm textarea").tarea(...) ?
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068618
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разобрался! Сейчас расскажу, почему набил шишек. У меня был такой код... Т.е. должен быть таким:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
jQuery.fn.tarea = function(options) {
    return this.each(function() {
        var $textarea = $(this);
        $textarea.on('blur', function (e) {
            options.callback(e, $textarea.val());            
        });
    });
};       

$("#ta textarea").tarea({
    callback: function(e, value) {
        alert(e.target.id + ' ' + value);
    }
});

for (var i = 1; i<4; i++) {
    $("<textarea id='textarea"+ i +"'>text"+ i +"</textarea>").appendTo("#ta").tarea({
        callback: function(e, value) {
            alert(e.target.id + ' ' + value);
        }
    });
}


Рабочий пример: http://jsfiddle.net/nJX5g/3/

Т.е. я генерировал новое поле и сразу же привязывал к нему tarea. И конечно, когда добавил callback, забыл его прописать в месте генерации новых полей. Честно говоря, такая ситуация совсем не нравится, как сделать так, чтобы tarea работала для любых полей, в т.ч. и вновь созданных без дублирования кода в нескольких местах?
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068638
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
запомнить options в переменную и заюзать в нескольких местах не будет считаться дублированием ?
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068642
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Пробовал window.MutationObserver и HTMLTextAreaElement.prototype, но не подошли (слишком радикальные), тут скорее что-то типа если элементы находятся в одном контейнере, то нужно использовать для них одинаковые настройки. Тогда при генерации можно просто написать .tarea() без параметров. Хотя, думаю, есть лучшие способы...
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068648
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно просто сохранить, да. Хотя, будет больше мусора в коде. Идеально написать наблюдатель, который будет отслеживать все вставки в dom, правда, не доходит как это реализовать, чтобы не писать после каждой вставки funcReportToObserver(). Смотрел Бэкбон и Нокаут, но пока не догнал как у них...
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068656
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2, а зачем писать плагин, если можно .on() использовать, что с версии JQuery 1.7 заменяет .live(), что attach an event handler for all elements which match the current selector, now and in the future ?
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068657
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор уже тут про такое спрашивал или у меня дежавю?
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068661
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот к примеру:
Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<!DOCTYPE HTML>
<html>
  <head>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
  </head>
  <body>
    <button onclick="$('body').append('<textarea></textarea>')">Add textarea</button>
    <br/>
    <textarea></textarea>
    <script>
      $('body').on('blur', 'textarea', onTextareaBlur);

      function onTextareaBlur() {
        alert($(this).val());
      }
    </script>
  </body>
</html>


Жми кнопку, добавляй textarea! Событие срабатывает :)
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068669
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторавтор уже тут про такое спрашивал или у меня дежавю?
Спрашивал) и написал, что window.MutationObserver и HTMLTextAreaElement.prototype (что тогда советовали) не прижились. А тут пример перед глазами и может более простое решение придет.

live, on и т.п. не подходят (или я не верно их понимаю) потому что они не обрабатывают создание элемента. Вот если бы нужно было, чтобы tarea привязывался сразу же после щелчка на контейнере с полями, тогда да... В принципе, именно в этом случае такое будет работать, но вариант не универсальный совсем.
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068683
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA, вот как раз эта ситуация. Мы слушаем body и спускаемся до textarea. Конкретно в этой ситуации это работает, но если посмотреть плагин tarea в полной версии, понятно, что такое работать не будет, т.к. просто некуда воткнуть on и т.п.
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
jQuery.fn.autoGrow = function(options) {

	// context
    var self = this;
    
	// default settings
	self.options = $.extend({
		'editor': true,
		'toggle': false,
        'callback': false
	}, options || {});

	return self.each(function() {

		var $textarea = $(this)
			.css('overflow','hidden')
			.css('minHeight',this.rows+'em');
			
		if ($textarea.next('.autogrow-textarea-mirror').length) {
			$mirror = $textarea.next('.autogrow-textarea-mirror').eq(0)
		} else {
			var $mirror = $('<div class="autogrow-textarea-mirror"></div>')
				.css('wordWrap', 'break-word')
				.css('borderColor', 'transparent')
				.css('fontFamily',        $textarea.css('font-family'))
				.css('fontSize',          $textarea.css('font-size'))
				.css('lineHeight',        $textarea.css('line-height'))
				.css('borderTopStyle',    $textarea.css('borderTopStyle')) //for cross-browser compatibility don't use shorthand properties
				.css('borderBottomStyle', $textarea.css('borderBottomStyle'))
				.css('borderLeftStyle',   $textarea.css('borderLeftStyle'))
				.css('borderRightStyle',  $textarea.css('borderRightStyle'))
				.css('borderTopWidth',    $textarea.css('borderTopWidth'))
				.css('borderBottomWidth', $textarea.css('borderBottomWidth'))
				.css('borderLeftWidth',   $textarea.css('borderLeftWidth'))
				.css('borderRightWidth',  $textarea.css('borderRightWidth'))
				.css('marginTop',         $textarea.css('marginTop'))
				.css('marginBottom',      $textarea.css('marginBottom'))
				.css('margingLeft',       $textarea.css('margingLeft'))
				.css('marginRight',       $textarea.css('marginRight'))
				.css('paddingTop',        $textarea.css('paddingTop'))
				.css('paddingBottom',     $textarea.css('paddingBottom'))
				.css('paddingLeft',       $textarea.css('paddingLeft'))
				.css('paddingRight',      $textarea.css('paddingRight'))
				.hide().insertAfter($textarea);
		}
			
		var sendContentToMirror = function () {
			$mirror.html($textarea.val().replace(/\n/g, '<br/>') + '&nbsp').show() //incorrect calculation of height if mirrow is hidden
			if ($textarea.height() !== $mirror.height()) {
				$textarea.height($mirror.height());
            }
			$mirror.hide();
		}

		var growTextarea = function () {
			sendContentToMirror();
		}
				
		// Fire the event for text already present
		sendContentToMirror();
				
		// Bind the textarea's event
		this.onkeyup = growTextarea;
		
		// Use settings
		if (!self.options.editor) {
			$mirror.show()
			$textarea.hide()
		}
		
		if (self.options.toggle) {
			$mirror.on('click', function (e) {
				$textarea.show()[0].focus()
				$mirror.hide()				
			});

			$textarea.on('blur', function (e) {
				if(!self.options.editor || $textarea.val()){
					$textarea.hide()
					$mirror.show()
					
                    self.options.callback(e, $textarea.val());
				}				
			});
		}
	});
};
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068697
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эх, все что нахожу сводится к MutationObserver или реализации Наблюдателя...
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38068928
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделаю так и пофиг, что не у всех будет работать. У правильных ребят должны быть правильные браузеры :-)

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
jQuery.fn.tarea = function(options) {
    return this.each(function() {
        var $textarea = $(this);
        $textarea.on('blur', function (e) {
            options.callback(e, $textarea.val());            
        });
    });
};       

var observer = new WebKitMutationObserver(function(mutations) {
    mutations.forEach(function(mutation) {
        $("#ta textarea").tarea({
            callback: function(e, value) {
                alert(e.target.id + ' ' + value);
            }
        });
    });    
});
observer.observe(document.querySelector('#ta'), {childList: true});
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38069408
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а не судьба посмотреть исходники jQuery, чтобы понять как там отслеживается появление новых элементов на странице?
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38069579
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А там отслеживается появление новых элементов на странице? О_о
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38069630
Фотография iConst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA а не судьба посмотреть исходники jQuery, чтобы понять как там отслеживается появление новых элементов на странице?:)
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38069973
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shitbox2А там отслеживается появление новых элементов на странице? О_оНу не то, чтобы прям отслеживается :)

Короче. Если Вы напишете так:
Код: javascript
1.
$(document).on('blur', 'textarea', function() { alert($(this).val()); });

То после динамического добавления элемента <textarea> в документ, событие будет обрабатываться для него.

А если так:
Код: javascript
1.
$('textarea').on('blur', function() { alert($(this).val()); });

То событие будет обрабатываться только для тех элементов, что были в документе на момент подписки.
...
Рейтинг: 0 / 0
Почему колбек функция передается всего один раз
    #38070212
Shitbox2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: javascript
1.
$(document).on('blur', 'textarea', function() { alert($(this).val()); });


Хм... Вроде бы даже работает, хотя тоже не срабатывает первый раз и лишних колбеков навешивает, но настроить можно, думаю. Как вариант покатит!
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Почему колбек функция передается всего один раз
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]