Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Почему колбек функция передается всего один раз / 25 сообщений из 25, страница 1 из 1
06.12.2012, 16:48
    #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
06.12.2012, 17:16
    #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
06.12.2012, 17:36
    #38068425
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
Сорри, это только здесь ошибка. Когда тестировал со скобками все впорядке было, иначе колбек бы, вообще, ни разу не передался
...
Рейтинг: 0 / 0
06.12.2012, 17:44
    #38068438
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
что значит "не передется"?
ругается что options.callback не функция?
...
Рейтинг: 0 / 0
06.12.2012, 18:11
    #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
06.12.2012, 18:12
    #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
06.12.2012, 18:53
    #38068557
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
Работает... http://jsfiddle.net/nJX5g/1/
Непонятно, почему вывод в лог срабатывает только один раз, хотя текстовых поля три.

Но у меня все равно не работает. Возможно из-за того, что текстовые поля генерируются динамически (изначально есть только одно). Странно, что в этом случае обычные параметры передаются. Попробую дополнить пример
...
Рейтинг: 0 / 0
06.12.2012, 19:01
    #38068576
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
Shitbox2Непонятно, почему вывод в лог срабатывает только один раз, хотя текстовых поля три.поместите этот вывод внутрь each :)
...
Рейтинг: 0 / 0
06.12.2012, 19:18
    #38068606
Яростный Меч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
Shitbox2что текстовые поля генерируются динамическинадеюсь, они добавляются на форму до вызова $("#myForm textarea").tarea(...) ?
...
Рейтинг: 0 / 0
06.12.2012, 19:31
    #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
06.12.2012, 19:46
    #38068638
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
запомнить options в переменную и заюзать в нескольких местах не будет считаться дублированием ?
...
Рейтинг: 0 / 0
06.12.2012, 19:50
    #38068642
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
P.S. Пробовал window.MutationObserver и HTMLTextAreaElement.prototype, но не подошли (слишком радикальные), тут скорее что-то типа если элементы находятся в одном контейнере, то нужно использовать для них одинаковые настройки. Тогда при генерации можно просто написать .tarea() без параметров. Хотя, думаю, есть лучшие способы...
...
Рейтинг: 0 / 0
06.12.2012, 19:56
    #38068648
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
Можно просто сохранить, да. Хотя, будет больше мусора в коде. Идеально написать наблюдатель, который будет отслеживать все вставки в dom, правда, не доходит как это реализовать, чтобы не писать после каждой вставки funcReportToObserver(). Смотрел Бэкбон и Нокаут, но пока не догнал как у них...
...
Рейтинг: 0 / 0
06.12.2012, 20:04
    #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
06.12.2012, 20:05
    #38068657
Паганель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
автор уже тут про такое спрашивал или у меня дежавю?
...
Рейтинг: 0 / 0
06.12.2012, 20:12
    #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
06.12.2012, 20:18
    #38068669
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
авторавтор уже тут про такое спрашивал или у меня дежавю?
Спрашивал) и написал, что window.MutationObserver и HTMLTextAreaElement.prototype (что тогда советовали) не прижились. А тут пример перед глазами и может более простое решение придет.

live, on и т.п. не подходят (или я не верно их понимаю) потому что они не обрабатывают создание элемента. Вот если бы нужно было, чтобы tarea привязывался сразу же после щелчка на контейнере с полями, тогда да... В принципе, именно в этом случае такое будет работать, но вариант не универсальный совсем.
...
Рейтинг: 0 / 0
06.12.2012, 20:29
    #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
06.12.2012, 20:53
    #38068697
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
Эх, все что нахожу сводится к MutationObserver или реализации Наблюдателя...
...
Рейтинг: 0 / 0
07.12.2012, 07:21
    #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
07.12.2012, 12:31
    #38069408
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
а не судьба посмотреть исходники jQuery, чтобы понять как там отслеживается появление новых элементов на странице?
...
Рейтинг: 0 / 0
07.12.2012, 13:15
    #38069579
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
А там отслеживается появление новых элементов на странице? О_о
...
Рейтинг: 0 / 0
07.12.2012, 13:31
    #38069630
iConst
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
skyANA а не судьба посмотреть исходники jQuery, чтобы понять как там отслеживается появление новых элементов на странице?:)
...
Рейтинг: 0 / 0
07.12.2012, 15:40
    #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
07.12.2012, 17:21
    #38070212
Shitbox2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему колбек функция передается всего один раз
Код: javascript
1.
$(document).on('blur', 'textarea', function() { alert($(this).val()); });


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


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