Javascript-форум (https://javascript.ru/forum/)
-   Internet Explorer (https://javascript.ru/forum/css-html-internet-explorer/)
-   -   Неясен момент в коде (https://javascript.ru/forum/css-html-internet-explorer/11203-neyasen-moment-v-kode.html)

Golovastik 12.08.2010 17:17

Неясен момент в коде
 
Есть код:
Код:

<html><head>
<title>Тренировочный документ</title>
<script type='text/javascript'>

var bounty_obj;
window.onload = function () {
bounty_obj = document.getElementById('hint');
};

function bounty_show() {
    if (bounty_hide.T) {
        clearTimeout(bounty_hide.T);
        bounty_hide.T = 0;
    };
    bounty_obj.style.display = 'block';
};

function bounty_hide() {
    if (bounty_hide.T) {
        clearTimeout(bounty_hide.T);
        bounty_hide.T = 0;
    };

    bounty_hide.T = setTimeout(function(){
        bounty_obj.style.display = 'none';
        bounty_hide.T = 0;
    }, 1000);
};

</script>
</head>
<body>

<a href='page.html' onMouseOver='bounty_show()' onMouseOut='bounty_hide()'>Переход в будующее</a>
<div id="hint" style="display:none; position:absolute; left:10px; top:35px;"><img src='1.gif' alt=''></div>
Когда-то в студенную зимнюю пору,<br> я из лесу вышел, был сильный мороз,
Гляжу,поднимается <br> высоко в гору, кто? Лошадка несущая хворосту воз

</body>
</html>

По поводу кода:
В функции bounty_show()
Там делается сравнение
Код:

if (bounty_hide.T) {
clearTimeout(bounty_hide.T);
bounty_hide.T = 0;

Что будет означать вот это с точкой bounty_hide.T в сравнении?
Это значит доступ через мою созданную функцию с именем bounty_hide к какой-то другой переменной находящейся в другой функции что ли?
Меня смущает .Т, почему она может ещё и добавлятся к названию любой функции где угодно?

B@rmaley.e><e 12.08.2010 19:20

Через точку идет обращение к свойствам объектов (object.property). А в JS все - объект (кроме разве что null'а).

Golovastik 12.08.2010 19:26

Идёт обращение к свойству метода bounty_hide.?
А что это за такое свойтсво с именем .Т и где оно определено?

subzey 12.08.2010 19:29

Вот тут определено
bounty_hide.T = setTimeout(…
Это идентификатор таймаута (вызова кода через определенное время), чтобы потом его можно было очистить.

Golovastik 12.08.2010 19:31

Что означает вот это если что:

if (bounty_hide.T) { ????

subzey 12.08.2010 19:36

Если таймаут установлен

Golovastik 12.08.2010 19:47

То есть если свойство с именем Т которое получило значение от анонимной функции, то есть если оно его получило,которая что-то возвратила не равна нулю, а чему-то равна? Вот это имеется ввиду в этом месте?
if (bounty_hide.T) {

2)Как можно обращаться к свойству Т, если оно определено ниже, а сравнение идёт выше, использование свойства с именем Т, объекта bounty_hide

Kolyaj 12.08.2010 22:37

Цитата:

Сообщение от B@rmaley.e><e
А в JS все - объект

Да не всё, не всё.

Golovastik 13.08.2010 17:22

Ответьте пож. на 7-ой пост. Заранее благодарю.

maxbarbul 13.08.2010 18:47

2Golovastik:
bounty_hide - глобальный объект функция (функция - это, грубо говоря, наследник-расширение Object);
bounty_hide.T - создается при первом вызове функции bounty_hide;

Конструкция if (bounty_hide.T) не сработает (и не выдаст ошибку), поскольку неинициализированное свойство bounty_hide.T == undefined

К нему можно обращаться, его даже можно передать в функцию:
var a = 10

function dd(f)
{
    if (f)
        alert(1)
    else
        alert(0)
}

dd(a.s)


2 B@rmaley.e><e:

typeof null === "object"

B@rmaley.e><e 13.08.2010 18:54

Цитата:

Сообщение от maxbarbul
typeof null === "object"

var t = null;
t.property = 5;
alert(t.property);
Про typeof забудьте, он врет.

maxbarbul 16.08.2010 12:40

Ок, согласен, действительно спецификация указывает простые типы, в их числе - Null
Просветили :)

Простите за оффтоп, но как же тогда бороться, например с проверкой строк:
s1 = "123string123"
s2 = new String("123string123")

alert(typeof s1) // string
alert(typeof s2) // object

Kolyaj 16.08.2010 15:12

Цитата:

Сообщение от maxbarbul
но как же тогда бороться, например с проверкой строк:

Бороться-то зачем?
function isString(v) {
    return {}.toString.call(v) == '[object String]';
}

Если уж сильно надо объекты String определять.

Golovastik 16.08.2010 18:24

Вот упрощённый код:
Код:

<html>
<head><title>Document</title>
<script type='text/javascript'>
var a,timeoutik;

function f1(){
if(timeoutik){
clearTimeout(timeoutik);
timeoutik = 0;
};
if(!a) a = document.getElementById('tik_tak');
a.style.display = 'block';
};

/*_____________________________________________________________*/

function f2(){
if(timeoutik){
clearTimeout(timeoutik);
timeoutik = 0;
};

timeoutik = setTimeout(function(){
if(!a) a = document.getElementById('tik_tak');
a.style.display = 'none';
},2000);

};
</script>

</head>
<body>
<a href='page.html' onMouseOver='f1()' onMouseOut='f2()'>Жми на меня</a>
<div id="tik_tak" style="display:none;
position:absolute; left:10px; top:35px;">
<img src='1.gif' alt='фотка'></div>

</body>
</html>

1)А почему обработчик событий onMouseOut='bounty_hide()'>
засовывается в онлоад,то есть когда пользователь увёл мышку от текста?

2)Как может в этой функции

Код:

function bounty_show() {
        if (bounty_hide_timeout) {
                clearTimeout(bounty_hide_timeout);
                bounty_hide_timeout = 0;
        };
        if (!bounty_obj) bounty_obj = document.getElementById('hint');
        bounty_obj.style.display = 'block';
};

происходит проверка if (bounty_hide_timeout) { на то, содержит ли переменная bounty_hide_timeout что нибудь, если bounty_hide_timeout получает своё значение в теле совсем другой функции,которая находится ниже?

3)clearTimeout(timeoutik); Без этой строки также работает, значит можно её убрать просто написав
timeoutik = 0; ?


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