Strict Standards: Resource ID#29 used as offset, casting to integer (29) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#31 used as offset, casting to integer (31) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#32 used as offset, casting to integer (32) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: Хитрости с переменными
ТвойWeb » WebMaster класс » JavaScript » Хитрости с переменными

Страниц (1): [1]
 

1. Systemnik - 18 Марта, 2008 - 08:47:39 - перейти к сообщению
И так я решил опять для себя придумать проектик Подмигивание Короче код который я представлю покажется простым но он будет усложнятся так как проблема с css
в зависимости от браузера растет я решил написать библиотеку позоляющую подуключать любой css файл для нужного браузера..
но тут конешноеще мнго будет хитростей так как одного navigator.appName
тут явно недостаточно)) Растерялся Короче возники проблемы с переменными..
я приведу код 3х файлов с именами рекомендуесят все эти файлы создать и запустить и поглядеть что куда..

Вот код основной библиотеки (brw.lbr.js).

CODE:
function brwlbr() {
var $brw;
var $opera;
var $ie;
var $firefox;
var $null;
if(navigator.appName == "Opera") {
$brw = $opera;
}
if(navigator.appName == "Microsoft Internet Explorer") {
$brw = $ie;
}
document.write('<script src="brw.lbr.config.js"></script>');
document.write("<title>"+$brw+"</title>");
}


Вот код конфиг файла библиотеки (brw.lbr.config.js).

CODE:
$opera = "Opera";
$ie = "IE";
$firefox = "Firefox";
$null = "NULL";


Вот пример подключения библиотеки (index.html).

CODE:
<html>
<head>
<!-- Start brw.lbr -->
<script src="brw.lbr.js"></script>
<script>
brwlbr();
</script>
<!-- End brw.lbr -->
</head>
<body>
Тестовая страница
</body>
</html>


Проблема с переменными.. почему то пишет undefined (потому что видимо неуспевает получить данные из файла конфига как сделать что бы успевал?)
2. Furax - 18 Марта, 2008 - 10:56:18 - перейти к сообщению
Systemnik
Почитай у Гудмана про использование переменных в JavaScript. Во-первых, $ в имени ставится в PHP, но не в JavaScript (не смешивай эти языки!).

А теперь я тебе скажу, что делает твоя функция brwlbr().

В строках 2-6 она объявляет 5 локальных переменных (ибо в JavaScript, в отличие от PHP, как раз глобальные переменные используются без объявления).

В строках 7-12 ты, в зависимости от браузера, присваиваешь локальной переменной brw одно из значений локальных же переменных.

После этого, в 13 строке, ты добавляешь в документ скрипт. Скрипт начинает грузиться.

Пока он грузится, в 14 строке ты выводишь значение локальной переменной brw.

Загрузившись (кстати, а зачем вообще нужна динамическая загрузка?), скрипт создаёт 4 глобальные переменные, которые, правда, никому уже не нужны, т. к. основная ветка уже завершилась.


Это по поводу того, что делает твой скрипт. Теперь о том, что нужно сделать, чтобы работало то, что ты хочешь.

Для начала тебе надо купить билет на самолёт в Иркутск. Вторая - найти меня. Дальше всё просто: мы запасаемся бутербродами, и в течении ... часов, начиная с самых простых вещей, начинаем обсуждать Web-программирование.


Если такой вариант не катит, то скажу кое-что конструктивное по поводу твоего скрипта (кроме того, что касается знака $).

Свой CSS-файл под каждый браузер - оно, конечно, благостно, только вот есть несколько проблем: тебе нужно создать стили действительно под каждый браузер (посмотри, например, вот этот неполный список старых браузеров; кстати, там же их можно скачать). Это нереально, так что сделай обязательно стиль по умолчанию для тех браузеров, которых нет в твоём списке.

Подгрузка списка браузеров сделана плохо. Зачем вообще нужна динамическая генерация кода в данном случае? Разве что для того, чтобы в HTML-файле подключать не два, а один скрипт. Если ты к этому стремишься, то и вызов функции можно было бы убрать в файл.

Я бы предложил сделать так. Index.html:
CODE:
<html>
<head>
<!-- Start brw.lbr -->
<script src="brw.lbr.js"></script>
<!-- End brw.lbr -->
</head>
<body>
Тестовая страница
</body>
</html>
Содержимое brw.lbr.js:
CODE:
function brwlbr()
{
var browser=browsers[navigator.appName];
if (browser)
document.write('<title>' + browser + '</title>');
else
document.write('<title>По умолчанию</title>');
}

document.write('<script src="brw.lbr.config.js"></script>');
Содержимое brw.lbr.config.js:
CODE:
var browsers = new Array();
browsers['Microsoft Internet Explorer'] = 'Ишак';
browsers['Opera'] = 'Опера';
...

brwlbr();


Что здесь происходит и чем это отличается от твоего варианта? Во-первых, ты сначала выполнял проверку на тип браузера, а потом уже подгружал список. Тут сделано наоборот: список, загрузившись, вызывает нужную функцию.

Во-вторых, ты вынес в конфиг только способы обработки разных браузеров, а не способы их определения; для добавления нового браузера тебе придётся править и конфиг, и сам скрипт библиотеки. В моём случае строки appName являются ключами массива browsers, а его значения - строками, используюмыми далее. Нужно править только конфиг.

Остальное, я думаю, тебе знакомо.
3. Systemnik - 18 Марта, 2008 - 11:40:30 - перейти к сообщению
Стоп а что символ $ что-то дает?? А?! чесно говоря я думал это сделано для удобства.. и не более.. а этот скрипт сделан не столько для определения типа сколько для набора опыта и тренировки.. а подключением стороннего скрипта я хотел сделать не список.. я хотел объявить переменные одном файле. А из другого получить их значения.. это нельзя реализовать?? Растерялся

Ваше предложение насчет прилета к вам говорит о том что вы действительно любите юных
вебпрограммистов что готовы потратить .. часов Улыбка
Простите, я еще в школе учусь если бы я все знал что преподают в школе... я бы непременно нашел деньги и прилетел Огорчение но мне в школу Подмигивание
а ваши объяснения на форуме довольно понятны и очень хороши Улыбка

Я понимаю что ваш последний скрипт делает тоже самое что и мой и кстати написан очень грамотно и даже логически правильно.. а вот насчет наличия неких глобальных перменных не совсем понял.. в php register_globals сделан для того что бы значенияе одной и той же переменной пожно было получить как через куки так через гет и пост..
а в джаваскрипт ведь никаких гет пост нет (там есть подобие $_GET и $_COOKIE)
и вообще как сделать так что бы в одном файле переменная объявлялась а в другом
получала свое значение..?? Растерялся
4. Furax - 18 Марта, 2008 - 22:46:49 - перейти к сообщению
Systemnik
Символ бакса в JavaScript не используется. Вообще. В PHP с него начинаются имена переменных, а в JS - нет.

Не надо путать глобальные переменные с суперглобальными массивами PHP. Значит, так...

Переменные делятся на 2 категории: локальные (видимые внутри одной конкретной функции) и глобальные (к которым может обращаться любая функция, а также код вне функций).

В JS локальные переменные объявляются внутри кода функции с помощью ключевого слова var. Переменные, которые не были объявлены как локальные, воспринимаются как глобальные. Например, в моём варианте brwlbr() переменная browser является локальной, потому что она объявлена с помощью слова var внутри кода функции; переменная browsers объявлена вне функций (кстати, в этом случае можно было опустить слово var, но с ним код лучше читается, т. к. ясно, что переменная объявлена только здесь и искать объявление в другом месте не надо), поэтому она является глобальной. Ещё пример:
CODE:
var name="Вася";//Глобальная переменная

function f()
{
var name; //Локальная переменная
name = 'Ваня'; //Используется локальная переменная
}

function g()
{
name = 'Петя'; //Используется глобальная переменная
}

function h()
{
nick = 'Furax'; //Создаётся и используется глобальная переменная
}


В PHP ситуация несколько иная: переменные, объявленные вне любых функций, как и в JS, являются глобальными, а вот те, значение которым присвоено в теле функции - локальными. Для того, чтобы функция получила доступ к глобальной переменной, необходимо объявить эту переменную в теле функции с ключевым словом global. Например:
CODE:
$name = 'Вася'; //Глобальная переменная

function f()
{
$name = 'Петя'; //Локальная переменная!
}

function g()
{
global $name; //Объявление, означающее, что переменная $name - глобальная
$name = 'Саша'; //Работа с глобальной переменной
}


Массивы $_GET, $_POST и т. д. в PHP называются суперглобальными потому, что они являются глобальными, но при этом для использования в функции их не требуется объявлять как глобальные.

register_globals просто позволяет, помимо суперглобальных массивов, наплодить ещё и глобальных переменных с именами, совпадающими с ключами этих массивов, что позволяет короче обращаться к ним ($name, а не $_GET['name']). Но это дурной тон, поскольку приводит к многочисленным проблемам, в т. ч. к проблемам с безопасностью.


Объявить переменные в одном файле JS, а использовать в другом можно, только надо придерживаться двух правил:
1. Оба файла должны загружаться на одной html-странице (не важно, динамически или нет). Ясно, что иначе будет не хватать либо объявления, либо использования.
2. Сначала нужно объявить переменные, а потом уже использовать их, но не наоборот.

Обрати внимание, что мой вариант так и делает: сначала грузится файл brw.lbr.config.js, в котором объявлена переменная browsers, а потом уже вызывается функция brwlbr(), использующая эту переменную.


Люблю я не только молодых Web-дизайнеров, но скорее людей, которые хотят чему-то научиться и учатся, прикладывая к этому свои усилия. Сам я просто знаю многие вещи, связанные с программированием (не только Web-) и охотно делюсь этим знанием. Так, курсовик свой я сейчас делаю на C++... А школа - это правильно! Забивать на неё тоже не следует.


И ещё. Кончай писать мне "вы" - я ведь сам всего ещё только четверокурсник, и есть на этом форуме люди куда старше меня. Это Интернет, и люди здесь Братья (и Сёстры, конечно же).
5. Systemnik - 19 Марта, 2008 - 03:12:06 - перейти к сообщению
Да нет ты вопрос про бакс не понял, я имел виду если я напишу без ничего стращного не будет..
CODE:
<?php
a = "Привет";
echo a;
?>

А?! А?! А?! написал такой код... не работает А?!
я я думал что $ только для отличения другим кодером и для более понятного кода сделано.. оказывается обязательно надо.. понял.. буду знать..
а если я напишу имя переменной в джаваскрипт с $ чтото изменится?? Растерялся

Дальше

Цитата:
И ещё. Кончай писать мне "вы" - я ведь сам всего ещё только четверокурсник

Спасибо буду на "ты"

С JS перемеными стало понятно после твоего объяснения.
Только с димамической загрузкой..
вот я пишу код ( работающий)

brw.lbr.js
CODE:
function brwlbr() {
$brw;
if(navigator.appName == "Opera") {
$brw = $opera;
}
if(navigator.appName == "Microsoft Internet Explorer") {
$brw = $ie;
}
document.write("<title>"+$brw+"</title>");
}

brw.lbr.config.js
CODE:
$opera = "Opera";
$ie = "IE";
$firefox = "Firefox";
$null = "NULL";

index.html
CODE:
<html>
<head>
<!-- Start brw.lbr -->
<script src="brw.lbr.js"></script>
<script src="brw.lbr.config.js"></script>
<script>
brwlbr();
</script>
<!-- End brw.lbr -->
</head>
<body>
Тестовая страница
</body>
</html>

РАБОТАЕТ
А вот так
brw.lbr.js
CODE:
function brwlbr() {
$brw;
document.write("<script src="brw.lbr.config.js"></script>");
if(navigator.appName == "Opera") {
$brw = $opera;
}
if(navigator.appName == "Microsoft Internet Explorer") {
$brw = $ie;
}
document.write("<title>"+$brw+"</title>");
}

brw.lbr.config.js
CODE:
$opera = "Opera";
$ie = "IE";
$firefox = "Firefox";
$null = "NULL";

CODE:
<html>
<head>
<!-- Start brw.lbr -->
<script src="brw.lbr.js"></script>
<script>
brwlbr();
</script>
<!-- End brw.lbr -->
</head>
<body>
Тестовая страница
</body>
</html>

Не работает... почему?
6. Furax - 19 Марта, 2008 - 07:29:25 - перейти к сообщению
В PHP бакс - первый символ в имени любой переменной. Иначе там нельзя.

В JavaScript бакс не используется вообще (в т. ч. он не является допустимым символом в имени переменной). Работает? Хорошо, что работает. Ишак, помнится, даже кириллические имена переменных переваривает. Но не всегда это будет работать и не везде. Лучше писать по стандарту, а по стандарту в JS имена переменных могут состоять из букв a-z, A-Z, символа '_' и цифр 0-9, причём цифра не может быть первым символом имени.

Не смешивай 2 этих языка! В каждом языке есть свой набор правил, и, применяя правила одного языка в другом, ничего хорошего не добьёшься.

По поводу динамической загрузки. Ты добавляешь в документ тег <script>, который обрабатывается браузером. Но браузер ведь не знает, что перед тем, как продолжить выполнять функцию, надо дождаться окончания загрузки файла, правильно? Вот он и идёт дальше, и использует неинициализированные переменные. В тот момент, когда файл-таки догружается и глобальные переменные преобретают значения, но уже поздно.

JS не умеет "остановиться, подождать чего-то и продолжить". Поэтому действия твоего скрипта нужно разбить на 2 стадии (которые логично превращаются в 2 функции): первое подгружает скрипт, а второе (уже после завершения загрузки) обрабатывает содержищиеся в нём значения переменных. Такое поведение легче всего организовать, поместив в конец динамически подгружаемого скрипта вызов нужной функции.

Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0368]     [ Gzipped ]