Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.12.2014, 16:40
Кандидат Javascript-наук
Отправить личное сообщение для vuler Посмотреть профиль Найти все сообщения от vuler
 
Регистрация: 16.02.2012
Сообщений: 109

Вопрос по синтаксису в объектах
Решил начать пользоваться объектами в js, но хочется знать, корректный ли синтаксис использую.
Вот пример кода. Код в целом рабочий.
Тут зоздаю класс arr_gen в конструкторе запоминаю все DOM елементы с которыми буду работать и переменные. И запускаю обработчик событий например на клик по дереву.
Если срабатывает обработчик запускается метод Arr_gen.prototype.tree_sel_elem, а в нем вызваю другой метод Arr_gen.prototype.test того же класса.
Смущает следующее: в методе tree_sel_elem идет прямое обращение к tree_block не Arr_gen.tree_block или что-то подобное не получится ли конфликт имен, если будет еще одна переменная tree_block в методе?
Функция тест из метода запускается Arr_gen.prototype.test(); ее короче никак нельзя записать? или это такой синтаксис. И по записе Arr_gen.tree_se -тоже корректно?

function Arr_gen() {
	this.tree_block=$('#arr_gen_tree');
	this.last_id=this.tree_block.attr('last_id');
	shape_block=$('#arr_gen_shapes');
	this.shape_line=shape_block.find('.arr_gen_inp_line');
	this.shape_arr_but=shape_block.find('.arr_gen_arr_but');
	
	$("body").on('click','#arr_gen_tree .js_tree_folder', Arr_gen.prototype.tree_sel_elem);
	
} 

Arr_gen.prototype.test=function(){
	Arr_gen.tree_se.remove();
	alert('test');
}


Arr_gen.prototype.tree_sel_elem = function(){
	if ($(this).hasClass('selected')) return;
	Arr_gen.tree_se=$(this).closest('li');
	tree_block.find('.js_tree_folder.selected').removeClass('selected');
	$(this).addClass('selected');
	Arr_gen.prototype.test();
};

$(document).ready(function() {

var arr_gen=new Arr_gen();

})
Ответить с цитированием
  #2 (permalink)  
Старый 26.12.2014, 16:52
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

когда срабатывает событие, то выполняется функция в контексте window, вам тогда надо прописать как то так:
$("body").on('click','#arr_gen_tree .js_tree_folder', Arr_gen.prototype.tree_sel_elem.bind(this));
Ответить с цитированием
  #3 (permalink)  
Старый 26.12.2014, 16:58
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

накидал рабочий пример
<html>
	<head>
	</head>
    <body><div>123123</div></body>
	
			<script>
function Cl (selector) {
	this.obj = document.querySelector(selector);
	this.obj.onclick = Cl.prototype.method.bind(this);
}

Cl.prototype.method = function (e) {
	console.log(e);
	console.log(this);
}

var obj = new Cl('div');
		</script>
</html>
Ответить с цитированием
  #4 (permalink)  
Старый 26.12.2014, 17:21
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,588

skrudjmakdak, не window, а элемента над которым уловлено событие.
__________________
29375, 35
Ответить с цитированием
  #5 (permalink)  
Старый 26.12.2014, 17:34
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

Aetae,
да, сори
Ответить с цитированием
  #6 (permalink)  
Старый 27.12.2014, 11:59
Кандидат Javascript-наук
Отправить личное сообщение для vuler Посмотреть профиль Найти все сообщения от vuler
 
Регистрация: 16.02.2012
Сообщений: 109

этот обработчик работает -
$("body").on('click','#arr_gen_tree .js_tree_folder', Arr_gen.prototype.tree_sel_elem);
Если сделать так -
$("#arr_gen_tree").on('click','.js_tree_folder', Ag.prototype.tree_sel_elem), то tree_block - будет андефайнед.
Ag.prototype.tree_sel_elem.bind(this) - Не помогает.
Ответить с цитированием
  #7 (permalink)  
Старый 27.12.2014, 14:55
Кандидат Javascript-наук
Отправить личное сообщение для vuler Посмотреть профиль Найти все сообщения от vuler
 
Регистрация: 16.02.2012
Сообщений: 109

ну в принципе то я понял фишку с bind(this), Но есть вопрос -
в переменную this- передается текущий объект, а до этого там в ней был DOM элемет. Как можно передать в функцию DOM по которому кликнули и объект в контексте которого он исполняется? $(e.target) - не совсем подходит, т.к. берет элемент самый нижний при клике, не факт что на нем стоит обработчик.
Ответить с цитированием
  #8 (permalink)  
Старый 29.12.2014, 11:47
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

<html>
	<head>
	</head>
    <body>
		<div>123123</div>
		<div>123123</div>
	</body>
	
			<script>
function Cl (obj, color1, color2) {
	this.color1 = color1;
	this.color2 = color2;
	this.obj = obj;
	obj.style.backgroundColor = color1;
	this.obj.onclick = Cl.prototype.method.bind(this.obj, this);
}

Cl.prototype.method = function (obj, e) {
	console.log(obj);
	console.log(e);
	console.log(this);
	
	this.style.backgroundColor = this.style.backgroundColor == obj.color2 ? obj.color1 : obj.color2;
}

var divs = document.querySelectorAll('div'),
	div1 = divs[0],
	div2 = divs[1];

var obj1 = new Cl(div1, 'red', 'yellow');
var obj2 = new Cl(div2, 'white', 'green');
		</script>
</html>
Ответить с цитированием
  #9 (permalink)  
Старый 29.12.2014, 13:25
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от skrudjmakdak
this.obj.onclick = Cl.prototype.method.bind(this.obj, this)
Нафига, если можно писать this.method.bind...?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #10 (permalink)  
Старый 29.12.2014, 13:46
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

можно
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по синтаксису (массивы) Skriptor Ваши сайты и скрипты 6 14.12.2014 22:00
вопрос по синтаксису alexkaskaskas AJAX и COMET 4 19.11.2013 11:20
Всплытие событий или что то не так... Кирюха =) jQuery 6 30.03.2013 12:56
вопрос по синтаксису php+javascript+html dm-tlt Общие вопросы Javascript 5 16.11.2009 11:22
Вопрос по синтаксису mootools skyfish Общие вопросы Javascript 1 11.01.2009 17:15