Javascript.RU

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

this вызов из функции обьясните.
Вот сижу и понять не могу ... почему не отрабатывает одинаковый код в двух ситуациях.

function toogle() {
          if(document.getElementById('id1').style.display=='none') {
          	this.className =('up');
            document.getElementById('id1').style.display='block';

        }else{
        	this.className ='down';
            document.getElementById('id1').style.display='none';

        }
    }

<a onclick="if(document.getElementById('id2').style.display=='none') { document.getElementById('id2').style.display='block'; this.className ='up'; }else{ document.getElementById('id2').style.display='none'; this.className ='down'; }" href="javascript:" class="up">Нажми меня</a>
<div id="id2" style="display:none;">
    <p>тут скрытый текст</p>
</div>


проблема в том что не присваивается класс к ссылке когда пытаюсь вызвать из функции this.className ='down'; .

А когда инлайном пишу все отрабатывает. Не судите строго, только начал постигать DHTML
Ответить с цитированием
  #2 (permalink)  
Старый 22.06.2010, 02:12
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Вы забыли показать, как вызываете функцию toogle. Наверное, следующим образом:
<a onclick="toggle()" href="javascript:" class="up">Нажми меня</a>
В этом случае this внтури toggle указывает на window (глобальный объект, если быть точнее).
Почитайте статью: http://javascript.ru/tutorial/object/thiskeyword

Можно сделать так:
<a onclick="toggle.call(this)" href="javascript:" class="up">Нажми меня</a>

А лучше так:
<script>
function toggle(toggler) {
	var targetStyle = document.getElementById(toggler.getAttribute("data-target")).style;
	targetStyle.display = targetStyle.display == "none" ? "block" : "none";
	toggler.className = toggler.className == "up" ? "down" : "up";
}
</script>

<a href="#id1" class="up" onclick="toggle(this); return false;" data-target="id1">Нажми меня</a>
<div id="id1" style="display:none;">
    <p>тут скрытый текст1</p>
</div>

<a href="#id2" class="up" onclick="toggle(this); return false;" data-target="id2">Нажми меня</a>
<div id="id2" style="display:none;">
    <p>тут скрытый текст2</p>
</div>

http://javascript.ru/tutorial/events...z-obrabotchika
http://designformasters.info/posts/c...ta-attributes/
http://javascript.ru/cond


-------------
ну или вот так:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Untitled Document</title>
</head>
<body>

<style>
.toggler {
	display: block;
}
.up {
	background-color: #afa;
}
.down {
	background-color: #aaf;
}
#js .hidden {
	display: none;
}
.text {
	background-color: #fec;
}
</style>

<div>
	<a href="#id1" class="toggler up" data-target="id1">Нажми меня</a>
	<div id="id1" class="text hidden">
		<p>тут скрытый текст1</p>
	</div>
	
	<a href="#id2" class="toggler up" data-target="id2">Нажми меня</a>
	<div id="id2" class="text hidden">
		<p>тут скрытый текст2</p>
	</div>
</div>

<script>
document.documentElement.id = "js";
var utils = {
	findClass: document.querySelectorAll ? function (CSSClass, root) {
		return (root || document).querySelectorAll("." + CSSClass);
	} : document.getElementsByClassName ? function (CSSClass, root) {
		return (root || document).getElementsByClassName(CSSClass);
	} : function (CSSClass, root) {
		var list = (root || document).getElementsByTagName("*"), length = list.length, i = -1, elements = [], j = 0;
		while (++i < length) {
			if (this.hasClass(list[i], CSSClass)) {
				elements[j++] = list[i];
			}
		}
		return elements;
	},
	bind: document.addEventListener ? function (element, eventType, listener) {
		element.addEventListener(eventType, listener, false);
		return listener;
	} : function (element, eventType, listener) {
		var _listener = function () {
			listener.call(element, window.event)
		};
		element.attachEvent("on" + eventType, _listener);
		return _listener;
	}
};

(function (classList) {
	if (classList) {
		utils.addClass = function (element, CSSClass) {
			element.classList.add(CSSClass);
			return element.className;
		};
		utils.removeClass = function (element, CSSClass) {
			element.classList.remove(CSSClass)
			return element.className;
		};
		utils.hasClass = function (element, CSSClass) {
			return element.classList.contains(CSSClass);
		};		
	} else {
		utils.addClass = function (element, CSSClass) {
			CSSClass = " " + CSSClass + " ";
			if ((" " + element.className + " ").indexOf(CSSClass) == -1) {
				element.className += " " + CSSClass;
			}
			return element.className;
		};
		utils.removeClass = function (element, CSSClass) {
			element.className = (" " + element.className + " ").replace(" " + CSSClass + " ", " ");
			return element.className;
		};
		utils.hasClass = function (element, CSSClass) {
			return (" " + element.className + " ").indexOf(" " + CSSClass + " ") != -1;
		};
	}
})("classList" in document.createElement("div"));

(function (toggle) {
	var togglers = utils.findClass("toggler"), i = togglers.length;
	while (i--) {
		utils.bind(togglers[i], "click", toggle);
	}
})(function (event) {
	var target = document.getElementById(this.getAttribute("data-target"));
	if (utils.hasClass(this, "up")) {
		utils.removeClass(this, "up");
		utils.addClass(this, "down");
		utils.removeClass(target, "hidden");
	} else {
		utils.removeClass(this, "down");
		utils.addClass(this, "up");
		utils.addClass(target, "hidden");
	}
	if (event.preventDefault) {
		event.preventDefault();
	} else {
		event.returnValue = false;
	}
});
</script>

</body>
</html>

http://hacks.mozilla.org/2010/01/cla...n-firefox-3-6/

Эх… всего лишь ClassList API хотел попробовать

Последний раз редактировалось Octane, 22.06.2010 в 03:30.
Ответить с цитированием
  #3 (permalink)  
Старый 22.06.2010, 06:26
Аватар для Riim
Рассеянный профессор
Отправить личное сообщение для Riim Посмотреть профиль Найти все сообщения от Riim
 
Регистрация: 06.04.2009
Сообщений: 2,379

Сообщение от Octane
" " + element.className + " "
кажется, вместо пробелов допустимы любые пробельные символы.

Последний раз редактировалось Riim, 22.06.2010 в 06:30.
Ответить с цитированием
  #4 (permalink)  
Старый 22.06.2010, 09:14
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Да, могут быть там любые пробелы, тут погоня за сверх скоростью
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции родителя из iFrame bushstas Общие вопросы Javascript 6 13.08.2013 14:43
вызов функции из функции sharp_007 Общие вопросы Javascript 2 03.04.2010 21:13
Вызов функции из другой функции.. ?? glutton Общие вопросы Javascript 3 21.08.2009 22:33
вызов функции, из JS генерируемого на сервере subaru AJAX и COMET 1 12.07.2008 13:44
Вызов функции из файла. Phoenix Общие вопросы Javascript 2 21.11.2007 22:49