На этой неделе Док в отличной форме, присматривая за всеми видами болезней. Здесь он рассматривает SSI, всплывающие окна и многое другое … но если у вас есть вопрос, который не охвачен, напишите ему и дайте ему знать . Он будет рад помочь!
Закрытие всплывающего окна на Onunload
Доктор, мой вопрос похож на вопрос Анны , но мне нужна ссылка во фрейме контента, которая загружает страницу, чтобы выгрузить всплывающее окно. На этой странице есть ссылки, которые открывают другие окна, и когда открывается новое окно, я хочу разгрузить всплывающее окно со ссылкой.
Шуан
Шуан это не проблема. Как вы, несомненно, знаете, всплывающее окно требует немного JavaScript для начала работы. Вот пример javascript, который у вас будет в документе frameset, который откроет всплывающее окно при загрузке frameset.
В следующем примере у нас есть код для frameset (frameset.html) и один из его дочерних фреймов top.html
frameset.html
<script language="javascript">
// var settings holds the settings for the popup window
var settings = "toolbar=1, scrollbars=1, location=1, status=1, menubar=1,
resizable=1, width=640, height=400";
// windowUrl holds the url for the popup window
windowUrl = "url/to/popup.html";
// now let's open the popup window.
outerName = window.open(windowUrl, 'innerName', settings);
// function closepopup will be called to close the popup
function closepopup() {
outerName.close();
}
</script>
<frameset rows="200,*">
<frame src="top.html">
<frame src="bottom.html">
</frameset>
Как видите, в frameset.html появится новое окно. Функция closepopup закроет всплывающее окно при вызове. Теперь вот сложная часть. Мы собираемся вызвать функцию из дочернего фрейма.
top.html
<HTML>
<HEAD>
<TITLE>TITLE>
</HEAD>
<BODY>
<a href="#" onclick="parent.closepoup()">close pop</a>
</BODY>
</HTML>
В моем примере (top.html) я использовал якорь и событие onclick для запуска функции javascript closepopup в родительском документе, который представляет собой frameset.html.
Однако вы можете увидеть этот принцип здесь и применить его к вашей ситуации, вызвав parent.closepopup () для события onunload документа. Возможно, вы также захотите проверить этот удобный учебник по всплывающему окну JavaScript . Надеюсь это поможет!
Больше магии SSI
Эй, доктор Дизайн,
У меня два вопроса. Во-первых, в своей последней статье вы сказали, что используете SSI, вы используете <!--#include file="menu.txt"-->
Есть ли разница между этим и <!--#include virtual="menu.txt"-->
Во-вторых, я создал шаблон для клиента и стараюсь сделать обновления как можно более легкими для себя или для любого веб-мастера. Поэтому я подумал, что буду использовать серверные включения для верхнего и нижнего колонтитула.
Однако изображение с заголовком страницы находится в таблице и намного «выше» содержимого. Итак, я решил использовать переменные в SSI. Вот что я придумал:
<!--#set var="which" value="blah.blah" --
<!--#echo $which-->
Однако, когда я пытаюсь запустить этот код, на экране ничего не появляется. Куда я иду не так? Кроме того, могу ли я сделать то же самое для вывода атрибутов в другие теги (например, <IMG SRC="[variable here]">
Спасибо доктор! Мэтт? Кевин?
Corbb
На чьей ты стороне, Корбб? Вы действительно хотите, чтобы я раскрыл свою истинную сущность и раскрыл себя врагу? Кроме того, я посчитал три вопроса в твоем письме — но это нормально, я буду брать с тебя только два 😉
Существует разница между атрибутом virtual и file в команде включения SSI.
virtual сообщает серверу, что путь к документу является виртуальным путем, и он обычно используется, когда мы хотим вставить результаты скрипта CGI. Что такое виртуальный путь? Виртуальные пути указываются вашим веб-хостом в файле конфигурации apache.
Примеры виртуальных путей:
DocumentRoot /home/webusers/yourdomain.com/public_html
ScriptAlias / cgi-bin / usr / local / httpd / cgi-bin
Таким образом, пример использования виртуального пути в команде включения будет:
<!--#include virtual="cgi-bin/some_script.cgi"-->
Файл сообщает серверу, что путь к файлу выражается как относительный путь. Так,
<!--#include file="menu.txt"-->
сообщает серверу, что документ menu.txt находится в том же каталоге, что и текущий документ.
Теперь по второму вопросу. Директивы SSI состоят из команды, за которой следуют пары атрибут / значение.
<!--#command attribute1=value1 attribute2=value2 -->
Таким образом, правильный код для вашего примера будет
<!--#set var="which" value="blah.blah" -->
<!--#echo var="which" -->
Наконец, Corbb, вы можете сделать так, как вы предлагаете, и вставить переменную в тег HTML.
Например:
<!--#set var="myimage" value="imagename.gif" -->
<img src="<!--#echo var="myimage" -->">
Для получения дополнительной информации обратитесь к учебному пособию по Apache SSI, а также к учебному пособию по серверной части NCSA HTTPd.
Распространение данных формы и доступ к объекту запроса ASP
Привет, Док, у меня проблема с разделением длинных форм ввода. Я прочитал то, что ты хотел сказать Джеффу, и сначала это звучало так просто, но когда я это сделал, я понял, что что-то упустил … что я делаю не так?
1) форма 1 имеет проверку формы (проверка достоверности данных) на. Это верно?
2) У меня есть кнопка отправки (как показано в шаге 1 ваших заметок), и действие формы 1 заключается в создании формы 2 (страница называется reg2).
<FORM ACTION = "reg2.asp" METHOD = "post"
onsubmit = "return Validator(this)" name="Form1" LANGUAGE=javascript
onsubmit="return Form1_onsubmit()">
3) Моя проблема связана со сбором информации о pg2 из pg1 … Я пробовал это с переменной сеанса в global.asa …
Sub Session_OnStart
'**Put your code here **
Session( "LCode" ) = Request( "LCode" )
Session( "LName" ) = Request( "LName" )
etc etc...
End Sub
Затем я занес эти переменные сессии в базу данных (после отправки формы 2)…
insert = "INSERT INTO Learner VALUES ( '" & _
Session( "LCode" ) & "','" & _
Session( "LSurname" ) & "','" & _
Session( "LName" ) & "','" & _
etc etc...
Пожалуйста помоги! Что я делаю неправильно?
Дженис
Дженис, глядя на твой код, может быть просто упустить оператор точки «.» при попытке доступа к свойствам объекта запроса.
Например:
Request("Lcode")
Должно быть
Request.("Lcode")
Выше все еще является ярлыком, и документация MSDN рекомендует обращаться к переменной Request через ее коллекцию. В вашем случае коллекция — это данные формы, поэтому вы можете получить к ним доступ как:
Request.Form("Lcode")
Почему это рекомендуется?
Во-первых, объект Request состоит из нескольких «коллекций», которые сами состоят из различных переменных, отправляемых клиентом, или которые являются предопределенными переменными среды сервера. Эти коллекции:
Коллекции
- ClientCertificate: значения полей, хранящихся в сертификате клиента, который отправляется в HTTP-запросе.
- Cookies: значения куки, отправленные в HTTP-запросе.
- Форма: значения элементов формы в теле HTTP-запроса.
- QueryString: значения переменных в строке HTTP-запроса.
- ServerVariables: значения предопределенных переменных среды.
Когда вы не указываете, к какой коллекции относится переменная, к которой вы хотите получить доступ, ASP должен просмотреть все из них, чтобы найти нужную.
Это также менее двусмысленно, поскольку вы указываете, что хотите получить данные формы, а не данные строки запроса URL и т. Д.
Использование скрытых полей
Если сеансы ставят вас в тупик, альтернативой является распространение данных путем встраивания данных формы из первой формы во вторую форму с использованием скрытых входных тегов. Исходя из вашего кода, и пример будет:
<FORM ACTION = "reg2.asp" METHOD = "post" onsubmit = "return Validator
(this)" name="Form1" LANGUAGE=javascript onsubmit="return
Form1_onsubmit()">
<%
Response.Write "<input type='hidden' name='Lcode' value='"
& Request.Form("Lcode") & "'></input>"
%>
Если у вас возникли проблемы с отладкой всего кода, вы всегда можете обратиться за помощью к дружной толпе на форуме SitePoint Forums ASP .
Отладка вашего кода
Независимо от того, какой язык сценариев на стороне сервера вы выберете, в наши дни доступно множество мощных интегрированных сред разработки (IDE), которые помогут вам писать и отлаживать код. Однако, давайте посмотрим правде в глаза, многие из нас любят взламывать в текстовом редакторе по нашему выбору. Это подводит меня к простой технике отладки, которую вы можете использовать, чтобы найти причину вашего кода. Техника проста: распечатайте переменные и сообщения в браузере, чтобы увидеть, что происходит за кулисами, когда ваш скрипт выполняется. Для изменения декораций, давайте использовать PHP для примеров ниже.
Досадные ошибки в моем SQL всегда сбивают меня с толку. Я думаю, что мой сценарий работает, и протестируйте его, но, увы, все, что должно было быть вставлено в базу данных, вместо этого исчезает в воздухе. Операторы SQL часто сложно написать, особенно когда вы встраиваете в них переменные (и особенно при конкатенации строки SQL с использованием VBScript и путанице в кавычках). Когда я отлаживаю, я всегда сначала обращаюсь к своему SQL, потому что именно здесь я больше всего склонен проскальзывать.
Шаг 1. Всегда присваивайте свою строку SQL переменной, чтобы вы могли легко добавить строку, чтобы распечатать ее в браузере.
Например, не пишите:
$result = mysql_query("SELECT * FROM TableName WHERE foo=$myFoo");
но напиши:
$sql = " SELECT * FROM TableName WHERE foo=$myFoo";
$result = mysql_query($sql);
Шаг 2. В целях отладки вы можете временно добавить следующую строку в ваш код:
// hmm, why isn't this working?
// let's see what that SQL string ended up looking like
echo $sql;
Когда вы запускаете скрипт, вы даже можете вырезать и вставлять в окно браузера оператор SQL как вывод вашего скрипта и запускать MySQL из командной строки (при условии, что в этом случае вы используете MySQL).
Вставьте запрос в MySQL и посмотрите, соответствуют ли результаты запроса ожидаемым, или что-то не так с состоянием данных в базе данных. Если это так, мы знаем, что нам нужно искать в другом месте нашего скрипта или модели данных, чтобы понять, почему данных, которые мы ожидаем увидеть в нашей базе данных, там нет.
В качестве альтернативы, когда мы выводим SQL в браузер, мы можем обнаружить простую синтаксическую ошибку; или мы можем обнаружить, что переменная, встроенная в строку SQL, имеет значение, отличное от ожидаемого, или не имеет значения вообще! Часто это происходит потому, что мы случайно используем неправильное имя для переменной, которую мы хотим встроить в SQL.
Возможно, это была просто типографская ошибка, или, возможно, некоторые данные, которые, как мы думали, отправлялись в сценарий (в данных POST из формы или в строке запроса URL), не попали в сценарий с ожидаемым атрибутом имени. Итак, как мы узнаем, что данные, которые мы ожидали отправить из клиентского браузера в сценарий, действительно есть? Вы догадались: мы выводим значения из нашего скрипта для отладки!
Например, допустим, у нас есть страница на page1.php, которая имеет поле ввода:
<form action="page2.php" method="POST">
<input type="text" name="firstName"></input>
</form>
Теперь на page2.php мы хотим проверить, что это значение действительно там. Поэтому мы добавляем отладочный код в начало скрипта.
// start debugging code -- don't forget to remove!
echo '<br />firstName : ';
echo $_POST['firstName'];
echo '<br />';
// end debugging code
Не забудьте удалить весь ваш код отладки из вашего скрипта, как только вы закончите отладку!
Вот и все на этой неделе, увидимся в следующий раз, и не забудьте прислать ваши вопросы для моего оперативного внимания!
Распространять любовь!