Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Пишу плагин редактирования дерева (https://javascript.ru/forum/jquery/74423-pishu-plagin-redaktirovaniya-dereva.html)

micscr 10.07.2018 10:37

Пишу плагин редактирования дерева
 
Привет.
Для практики начал создавать плагин - редактируемое дерево.
Смысл - редактировать дерево (меню), перетаскиванием листьев в новые позиции.
Потом планирую его как часть yii расширения выставлять, поэтому хотелось бы чтобы по js коду было "по чище", начал делать, пока константы, начальные настройки и обработка ошибок, все пока нормально?

;( function( $, window ){
	$.fn.editabletree = function(options) {

		options = options || {};
		
		var MOVE_WITH_SUBTREE_MODE = 'move-with-subtree-mode';
		var MOVE_WITHOUT_SUBTREE_MODE = 'move-without-subtree-mode';

		var mode = MOVE_WITHOUT_SUBTREE_MODE;
		
		if (options.mode) {
			if ($.inArray(options.mode, [MOVE_WITH_SUBTREE_MODE, MOVE_WITHOUT_SUBTREE_MODE]) !== -1) {
				mode = options.mode;
			} 
		}
		
		var idAttributeName = options.idAttributeName || 'data-id';
		
		try {
			var $tree = this.first();
			var $lis = $tree.find('li');
			
			$lis.each(function(){
				var $li = $(this);
				var attr = $li.attr(idAttributeName);
				if (attr === undefined) {
					throw new Error('One of the tree leaves misses the data attribute');
				} 
				$li.data({id: attr});
			});
			
			var $spans = $tree.find('span');
			
			$spans.on('click', function(){
				alert($(this).closest('li').data('id'));
			});
		
		} catch(e) {
			alert('The next error occured during processing the tree: \n\n' + e.message);
		}
		
		return this;
	};	
})( jQuery, window );


<head>
<meta charset="UTF-8" />
<script src="../0_lib/jquery-3.3.1.js"></script>
<script src="editabletree.js"></script>
<script>
$(document).ready(function(){
	$('#tree').editabletree({
	    mode : 'move-with-subtree-mode9',
		//idAttributeName : 'id'
	});
	
});
</script>
<style>
 li {border:1px solid red;}
</style>
</head>
<body>

<ul id="tree">
<li data-id="1"><span>11111</span></li>

<li data-id="2"><span>22222</span></li>

<li data-id="3">
	<span>33333</span>

	<ul>
	<li data-id="31"><span>33333-11111</span></li>
	<li data-id="32"><span>33333-22222</span></li>	
	</ul>

</li>

<li data-id="4"><span>44444</span></li>

<li data-id="5">
	<span>55555</span>

	<ul>
	<li data-id="51">
		<span>55555-11111</span>
		
		<ul>
		<li data-id="511"><span>55555-11111-11111</span></li>
		<li data-id="512"><span>55555-11111-22222</span></li>	
		<li data-id="513"><span>55555-11111-33333</span></li>	
		</ul>		
		
	</li>
	
	<li data-id="52"><span>55555-22222</span></li>	
	</ul>

</li>

<li data-id="6"><span>66666</span></li>

</ul>

Rise 10.07.2018 12:14

И что это работает?) Смысл какой-то неясный - перетаскивать листья. А зачем? А контент в них редактируется? А ветки что? А создать новую или удалить? А как? Что значит редактируемое дерево? Надо как-то описать по пунктам весь функционал - редактируемое дерево. Это первое с чего следует начать. Второе это полная html-разметка в возможных состояниях и сопутствующие css. Третье почитать букварь https://learn.jquery.com/plugins/. А вот затем уже можно начать что-то кодить на jquery.

Nexus 10.07.2018 12:34

Цитата:

Сообщение от micscr
все пока нормально?

Вы код запускали?

Если в опциях не передать параметр "mode", то скрипт ваш упадет.
У контекста в строке 20 разве есть метод "first"?
Зачем перезаписывать data-атрибут "id"?

micscr 10.07.2018 12:54

Цитата:

Сообщение от Rise (Сообщение 489388)
И что это работает?) Смысл какой-то неясный - перетаскивать листья. А зачем?

Только изменение взаимного расположения. А потом информация о новом расположении будет на сервер передаваться для перестройки.

micscr 10.07.2018 12:57

Цитата:

Сообщение от Nexus (Сообщение 489389)
Вы код запускали?

Если в опциях не передать параметр "mode", то скрипт ваш упадет.
У контекста в строке 20 разве есть метод "first"?
Зачем перезаписывать data-атрибут "id"?

1) Конечно запускал, ничего не падает, там же есть проверка , только если if (options.mode) {.

2) this там - это jQuery объект.

3) А метод data не переписывает атрибуты

micscr 10.07.2018 13:00

Скажите, нормально будет в конце метода пообъявлять свои служебные функции?:

} catch(e) {
			alert('The next error occured during processing the tree: \n\n' + e.message);
		}
		
		return this;
		
		function getStatus() {
			return status;
		};		
		
	};
})( jQuery, window );

micscr 10.07.2018 13:03

А что с jsfiddle.net?
Захожу на "Your public fiddles", она там есть, захожу по ссылке внутрь нее.
Там почему то написано "Add title to make the fiddle public", хотя 2 поля выше заполнены.
И в рез-те по ссылке глобально она недоступна

Nexus 10.07.2018 13:09

Цитата:

Сообщение от micscr
1) Конечно запускал, ничего не падает, там же есть проверка , только если if (options.mode) {.

Пропустил строку 4, прошу прощения.

Цитата:

Сообщение от micscr
А метод data не переписывает атрибуты

Атрибуты не перезаписываются, но данные доступные из атрибута будут сохранены еще и в ram. Имеет ли это смысл?

j0hnik 10.07.2018 13:13

Цитата:

Сообщение от micscr
А что с jsfiddle.net?

Не чихает вроде.

Где будет применяться этот плагин?

micscr 10.07.2018 13:26

Цитата:

Сообщение от j0hnik (Сообщение 489397)
Не чихает вроде.

Это почему то в IE11 jsfiddle не работает.

Вот ссылка

Цитата:

Сообщение от j0hnik (Сообщение 489397)
Где будет применяться этот плагин?

Редактирование меню сайта (расположения позиций).


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