Области применения переменных JavaScript - PullRequest
0 голосов
/ 09 августа 2010

Я нашел кучу других вопросов по этой теме, но по какой-то причине они не решили мою "проблему" .

У меня есть этот маленький сценарий, который я сделал из чистого интереса - и он работает просто отлично, но что-то беспокоит меня. Скрипт очищает текстовое поле onFocus и набирает «Write here», если ничего не вводится на Blur. Сценарий выглядит следующим образом:

<html>
<head>
    <title>JavaScript</title>
    <!--Scripts-->
    <script type="text/javascript">
    <!--

    function noValue() {    
    var _value = document.getElementById('input').value;
    if (_value == "Write here") {
    document.getElementById('input').value='';
    }
    }

    function changeValue() {
    var _value = document.getElementById('input').value;
    if (_value == "") {
        document.getElementById('input').value='Write here';
    }
    }

    function dontLeave() {
        var c_box = confirm("Do you want to leave?");
        if (c_box == true) {
            die;
        }
        else {
            history.back;
        }
    }
    //-->
    </script>
    </head>

<body onUnload="dontLeave()">
<form>
<input id="input" type="text" value="Write here" onFocus="noValue()" onBlur="changeValue()">
</form>
</body>

</html>

Как видите, переменная _value используется дважды - в "noValue ()" и "changeValue ()". Это то, что я хочу изменить.

Я думал, что вы можете получить доступ к глобальной переменной внутри функции, не объявляя ее внутри функции fx:

var i = 1;  
function foo(){  
i++;  
return;  
}

и вывод будет 2, если вы вызовете функцию. Но когда я объявляю и инициализирую переменную вне функции, переменная не работает изнутри функций. Почему? Я что-то здесь неправильно понял? :)

У меня также есть другой вопрос:
Как вы можете видеть, я добавил окно подтверждения, когда вы покидаете страницу (я знаю, что это раздражает, я не собираюсь его использовать, это всего лишь эксперимент), но я не знаю, как не покинуть страницу, если клиент нажимает «Отмена». Как мне это сделать? :)

РЕДАКТИРОВАТЬ Первая часть моей проблемы теперь решена - спасибо!
Но есть все еще последняя часть о раздражающей коробке подтверждения; Кто-нибудь из вас знает, как остановить, так сказать, клиента?

Ответы [ 3 ]

1 голос
/ 09 августа 2010

Если поставить эту строку ...

var _value = document.getElementById('input').value;

... вне функций, оно будет находиться в области действия внутри функций. Я думаю, что проблема, с которой вы столкнулись, заключается в том, что ее размещение приведет к ее выполнению до того, как DOM будет готов, и, следовательно, ваш элемент input еще не существует. Попробуйте либо дождаться события загрузки dom, либо поместить этот скрипт в самый конец страницы (прямо внутри тега </body>).

1 голос
/ 09 августа 2010

Чтобы ответить на ваш первый вопрос, ваша проблема с инициализацией _value, вероятно, связана с синхронизацией.Помещая _value вне функции, эта строка javascript будет выполнена немедленно.Поскольку JavaScript находится в разделе заголовка, он будет выполнен до того, как элемент ввода был загружен в документ.Вы можете поместить эту одну строку javascript в конец документа после загрузки элемента ввода, например:

<body onUnload="dontLeave()">
<form>
<input id="input" type="text" value="Write here" onFocus="noValue()" onBlur="changeValue()">
</form>
<script type="text/javascript">
    var _value = document.getElementById('input').value;
</script>
</body>

Теперь переменная javascript "_value" будет установлена ​​правильно и доступна длявсе ваши функции JavaScript "глобально".

1 голос
/ 09 августа 2010

Ну, вы можете объявить вне функций, но вам нужно обновлять значение при каждом вызове функции (то есть при каждом событии).Если нет, то как ваши обработчики событий узнают, что это такое?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...