Страниц (1): [1] |
|
Без описания |
Поиск в теме | Версия для печати |
Furax |
Отправлено: 18 Марта, 2008 - 10:56:18
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
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, а его значения - строками, используюмыми далее. Нужно править только конфиг.
Остальное, я думаю, тебе знакомо. |
|
|
Furax |
Отправлено: 18 Марта, 2008 - 22:46:49
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
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++... А школа - это правильно! Забивать на неё тоже не следует.
И ещё. Кончай писать мне "вы" - я ведь сам всего ещё только четверокурсник, и есть на этом форуме люди куда старше меня. Это Интернет, и люди здесь Братья (и Сёстры, конечно же). |
|
|
Systemnik |
Отправлено: 19 Марта, 2008 - 03:12:06
|
ExBB Developer Team
Покинул форум
Сообщений всего: 778
Дата рег-ции: Дек. 2007
Карма 0
|
Да нет ты вопрос про бакс не понял, я имел виду если я напишу без ничего стращного не будет..
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>
Не работает... почему? |
|
|
Furax |
Отправлено: 19 Марта, 2008 - 07:29:25
|
Бледнотик
Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007
Откуда: Иркутск, Сибирь, СССР
Карма 32
|
В PHP бакс - первый символ в имени любой переменной. Иначе там нельзя.
В JavaScript бакс не используется вообще (в т. ч. он не является допустимым символом в имени переменной). Работает? Хорошо, что работает. Ишак, помнится, даже кириллические имена переменных переваривает. Но не всегда это будет работать и не везде. Лучше писать по стандарту, а по стандарту в JS имена переменных могут состоять из букв a-z, A-Z, символа '_' и цифр 0-9, причём цифра не может быть первым символом имени.
Не смешивай 2 этих языка! В каждом языке есть свой набор правил, и, применяя правила одного языка в другом, ничего хорошего не добьёшься.
По поводу динамической загрузки. Ты добавляешь в документ тег <script>, который обрабатывается браузером. Но браузер ведь не знает, что перед тем, как продолжить выполнять функцию, надо дождаться окончания загрузки файла, правильно? Вот он и идёт дальше, и использует неинициализированные переменные. В тот момент, когда файл-таки догружается и глобальные переменные преобретают значения, но уже поздно.
JS не умеет "остановиться, подождать чего-то и продолжить". Поэтому действия твоего скрипта нужно разбить на 2 стадии (которые логично превращаются в 2 функции): первое подгружает скрипт, а второе (уже после завершения загрузки) обрабатывает содержищиеся в нём значения переменных. Такое поведение легче всего организовать, поместив в конец динамически подгружаемого скрипта вызов нужной функции. |
|
|
|
Поиск в теме | Версия для печати |
Страниц (1): [1] |
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0) |
« JavaScript » |
Все гости форума могут просматривать этот раздел. Только администраторы и модераторы могут создавать новые темы в этом разделе. Только администраторы и модераторы могут отвечать на сообщения в этом разделе.
|
|
|