Статьи

Dr Design — Закрытие всплывающих окон и распространение данных

На этой неделе Док в отличной форме, присматривая за всеми видами болезней. Здесь он рассматривает 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

Не забудьте удалить весь ваш код отладки из вашего скрипта, как только вы закончите отладку!

Вот и все на этой неделе, увидимся в следующий раз, и не забудьте прислать ваши вопросы для моего оперативного внимания!

Распространять любовь!