Xpoint
   [напомнить пароль]

Программирование::JavaScript::Разное - F.A.Q.

Как запретить пользователю просмотреть код страницы?
Никак.
Существующие способы, базирующиеся на языке JavaScript, не позволяют достичь принципиальной защиты. Они приемлемы лишь для защиты от неопытных пользователей.
Как с помощью JavaScript подгрузить произвольный file.js?
<script language="JavaScript">
document.write("<"+"script language=\"JavaScript\" src='...'></"+"script>")
</script>

тег </script> необходимо разбить, чтобы браузер не думал, что внешний скрипт закончился на этом теге.
Как сделать, чтобы вокруг нажатых ссылок в MSIE не рисовались рамочки?
<a href="..." onfocus="this.blur()">...</a>
Можно пройтись по всем ссылкам:
if(document.all && document.all.item){ // MSIE
  var i,l=document.links
  for(i=0;i<l.length;i++){
    l[i].onfocus=function(){this.blur()}
  }
}
Как работать с cookie?
Cookie позволяют хранить данные подобно глобальным переменным. Работать с cookie можно с помощью таких функций:
cookieName - имя cookie
cookieContent - что записываем
cookieExpireTime - сколько времени будут жить cookie в часах. Если 0 - то помрут вместе с закрытием браузера.
function setCookie(cookieName, cookieContent, cookieExpireTime){
    if(cookieExpireTime>0){
        var expDate=new Date()
        expDate.setTime(expDate.getTime()+cookieExpireTime*1000*60*60)
        var expires=expDate.toGMTString()
        document.cookie=cookieName+"="+escape(cookieContent)+"; path="+escape('/')+"; expires="+expires
    }else{
        document.cookie=cookieName+"="+escape(cookieContent)+"; path="+escape('/')+"";
    }
}

function getCookie(cookieName){
    var ourCookie=document.cookie
    if(!ourCookie || ourCookie=="")return ""
    ourCookie=ourCookie.split(";")
    var i=0
    var Cookie
    while(i<ourCookie.length){
        Cookie=ourCookie[i].split("=")[0]
        if(Cookie.charAt(0)==" ")
                Cookie=Cookie.substring(1)
        if (Cookie == cookieName){
            var res = ourCookie[i].split('=')[1];
            return (typeof res != 'undefined') ? unescape(res) : '';
        }
        i++
    }
    return ""
}
Как узнать или изменить проскролленность страницы?
Explorer 4-6:
document.body.scrollLeft
document.body.scrollTop
Netscape 4-6, Opera 5:
pageXOffset
pageYOffset
Изменить - либо обратиться к этим переменным, либо вызвать стандартную функцию scroll(x,y)
Как запросить подтверждение у пользователя при переходе по ссылке?
<a href="url" onclick="return confirm('Sure ?')">...</a>
Как отследить события клавиатуры?
Рассмотрим это на примере отслеживания нажатия кнопки "S"
Netscape 4:
function kdown(e){ 
if(e.which=='S'.charCodeAt(0)) alert('S pressed')
}
document.captureEvents(Event.Keydown); 
document.onkeydown=kdown;
Internet Explorer, Netscape 6:
<body onkeypress="if (String.fromCharCode(event.keyCode)=='S') alert('S pressed')">
Естественно, все примеры условны и иллюстрируют только общие идеи.
Не получается обратиться к свойству другого фрейма/окна.

Если содержимое другого фрейма (окна) представляет собой документ с чужого сервера (домена), то ничего сделать нельзя из соображений безопасности. Если странички лежат на разных доменах (например, a.site.ru и b.site.ru) и вы имеете доступ до тех и других, пропишите в них document.domain="site.ru"

Соображения безопасности тут такие: К примеру, вы работаете с каким-нибудь администраторским интерфейсом или читаете почту через веб-форму. Некто присылает вам ссылку "приколись, чувак, новый секретный мультик про Масяню", вы открываете ее, а там страница, которая грузит к себе во фрейм этот самый ваш запароленный интерфейс и делает с ним, что хочет - ведь браузер запомнил ваш пароль.

Может быть, что вы просто неправильно пишете путь к фрейму. Правильный путь - top.название окна.frames.имя фрейма. Если окно - текущее, то название окна можно опустить, получится top.frames.имя фрейма.

У меня сайт с фреймами, но человек может загрузить какой-то фрейм отдельно. Как подсунуть ему фреймсет?

У объекта window есть свойства parent и top, которые ссылаются на содержащие его окна (top ссылается на окно самого верхнего уровня). Если страница загружена не во фреймсете, эти свойства ссылаются на само окно

В результате получаем что-то вроде if(parent==this) location="адрес страницы с фреймсетом"

Также, у окна есть свойство frames, ссылающееся на массив фреймов. Если мы уверены, что страницы, подгружающиеся во фреймы основного окна сайта, не являются в свою очередь фреймсетами - можно проверить parent.frames.length. В этом случае получится следующее if(!parent.frames.length) location="адрес страницы с фреймсетом"

О том, как сделать, чтобы в этом фреймсете открывалась нужная страница, читайте здесь

Все вышесказанное касается и страниц, подгружаемых в iframe

Как сделать прокрутку в Netscape 4.x, если динамически созданное содержимое страницы выходит за пределы документа?
В Netscape 4.x можно изменять значения переменных document.width и document.height, причем появляются линии прокрутки, соответствующие выставленным размерам.
Как сэмулировать HOVER в Netscape 4?
Пример:
Click this
<span id=link style="position: relative">
<a href="#" onmouseover="highlight()" onmouseout="lowlight()">link</a>
</span>
to do nothing

<div id=link1 style="position: absolute; visibility: hidden">
<a href="#" onmouseover="highlight()" onmouseout="lowlight()"><font
color=red>link</font></a>
</div>

<script>
function highlight(){
        document.layers.link1.left=document.layers.link.pageX
        document.layers.link1.top=document.layers.link.pageY
        document.layers.link.visibility="hide"
        document.layers.link1.visibility="show"
}

function lowlight(){
        document.layers.link.visibility="show"
        document.layers.link1.visibility="hide"
}
</script>
Как передать параметр в загружаемый документ и прочитать его там?
Через строку запроса, как это происходит при передаче данных серверу методом GET. Можно написать - <a href=file.html?123>, тогда в файле file.html можно будет прочитать переменную location.search, которая будет содержать "?123". Остается взять часть строки со второго по счету символа - location.search.substring(1).

Для передачи нескольких параметров, к примеру так: file.html?x=1&y=2, можно предложить несложную функцию, которая, будучи записана в file.html, вернет значение переменной с указанным именем:

function getVariable(varName){
        var arg=location.search.substring(1).split('&')
        var variable=""
        var i
        for(i=0;i<arg.length;i++){
                if(arg[i].split('=')[0]==varName){
                        if(arg[i].split('=').length>1){
                                variable=arg[i].split('=')[1]
                        }
                        return variable
                }
        }
        return ""
}
Как вызвать функцию JavaScript при нажатии на ссылку или кнопку в форме?

Можно записать в атрибут HREF тега <A> вызов кода JavaScript: <a href="javascript:f()">. Либо можно записать код JavaScript в атрибуты обработчиков событий, например ONCLICK, ONMOUSEOVER, ONSUBMIT. При этом префикс "javascript:" писать не следует.

Если хочется, чтобы вызов события не привел к действию, например нажатие на ссылку не привело к переходу по ней, следует возвратить false, иначе возвратить true.

Пример: <a href="target.html" onclick="alert('HELLO'); return false"> - при нажатии на ссылку переход по ней осуществлен не будет, вместо этого появится окошко со словом "HELLO". Но если открыть эту ссылку в новое окно, то загрузится target.html.

Можно, к примеру, сделать проверку правильности заполнения формы - <form action=... onsubmit="return check()">. Функция же "check()" должна будет либо вернуть true, тогда форма отправится, либо false, тогда нет.

По поводу протокола javascript:

1) javascript: есть протокол (как http:, mailto: и т. д.)

2) ссылка c javascript-протоколом имеет вид javascript:выражение (в отличие от event handler'oв - не содержимое функции, поэтому она не может содержать return)

3) при клике на эту ссылку браузер поступает следующим образом:

   3а) вычисляет выражение. Если имеются побочные эффекты (напр. window.open), они выполняются

   3б) если выражение возвращает результат, отличный от undefined...

   3c) ...результат преобразуется к типу string и используется в качестве контента для новой страницы (введите, к примеру, в адресную строку javascript:1+1)

Почему у меня не получается впечатать в документ с помощью document.write SSI-инструкцию?
Вопрос:
Я пытаюсь впечатать в документ SSI-инструкцию такой строчкой: document.write("<!--#include virtual=\""+file+".shtml\" -->"), но она почему-то не исполняется? Что я делаю неправильно?
Ответ:
Дело в том, что SSI (Server Side Includes) исполняются на сервере. Т.е. когда сервер уже отдал документ клиентскому браузеру, то он (сервер) уже не властен над этим документом. И когда вы пытаетесь впечатать в документ SSI-инструкцию, ее уже некому исполнять.
Как добавить страницу в Избранное или сделать стартовой?
Добавить в Избранное - window.external.AddFavorite(URL,TITLE) (IE 4+)
Пример - window.external.AddFavorite(location.href, document.title)

Сделать стартовой - <a href="#" style="behavior:url(#default#homepage)" onclick="this.setHomePage(URL);return false"> (IE 5+)
Как убрать оформление текущего окна?
Никак. Если не считать различных "хакерских" трюков, работающих в отдельных браузерах на отдельных платформах.
Как запретить выделение текста мышкой?
MSIE: <body onselectstart="return false">
Mozilla: document.onmousedown=function(){return false} или указав для body стиль -moz-user-select: none
Не получается обратиться к картинке, лежащей в слое, в Netscape 4
Если картинка находится в слое, например
<div id=lay1 style="position: absolute">
<img src="..." name="img1">
</div>
или
<layer name=lay1>
<img src="..." name="img1">
</layer>
то обращаться к картинке следует так:
document.layers["lay1"].document.images["img1"].
Работа с textarea. Как переместить каретку? Как получить выделенный текст?
Чистое javascript-решение возможно только в MSIE 4 и выше. Для манипуляций с выделенной областью существует объект TextRange. Пример:
<textarea id=myTextArea>The text</textarea> 
<button onclick="test()">Test</button> 
<script> 
function test() 
{ 
        // убедиться, что каретка находится в текстовом поле 
        myTextArea.focus(); 
        // создать объект TextRange на основе текущего выделения 
        var rng=document.selection.createRange(); 
        // расширить выделение на 3 символа вправо 
        rng.moveEnd('character',3); 
        // сделать выделение текущим 
        rng.select(); 
        // достать выделенный текст 
        alert(rng.text); 
} 
</script> 
Ссылки по теме:
Как распечатать один из фреймов?
Если просто написать top.frames[3].print(), то, скорее всего, распечатается не тот фрейм, который нужен. Необходимо сначала передать нужному фрейму фокус: top.frames[3].focus(), после чего можно вызывать функцию print всего окна: top.print()
В HTA-приложении есть фрейм, но на него разрешения HTA не распространяются.
<iframe APPLICATION=yes></iframe>
Я задал вопрос, а мне вместо конкретного ответа дают разные ссылки и советуют их изучать. Но мне нужен ответ на мой вопрос, я не хочу ничего изучать и искать!
Вот неплохая ссылочка

А еще

Притча

Жили 2 богатых человека. И решили они отдать свое богатство на праведные цели.

Первый ходил по улицам, переходам метро и вокзалам, подходил к нищим, бомжам и беспризорникам, и давал каждому из них по 1000$. Нищие радовались, благодарили, говорили ему "Спаси тебя Бог", а сами шли и пропивали и всячески прожигали столь легко доставшиеся деньги.

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

Теперь скажите, кто из двух богатых людей употребил свое богатство лучше?

У окна, открытого через showModalDialog (showModelessDialog), нет свойства opener... Как же обратиться к родительскому окну?

Классический выход - передавать ссылку на родительское окно при вызове диалога как параметр. Т.е. при вызове пишем

vReturnValue = showModalDialog(sURL, self, sFeatures)

а в диалоге обращаемся к родительскому окну как

window.dialogArguments

Примечание: Этот метод не работает в MSIE6.0, если контент диалога создается динамически через javascript: протокол -- т.е. showModalDialog('javascript:...')

Как заменить перенос строки на <BR>?
На PC перевод строки -- это два символа \r\n (коды 13 и 10), на Юниксах -- один символ: \n, под Макинтош -- \r. Учитывая все три варианта:
myText.replace(/\r\n|\r|\n/g,"<br>")
Как подгрузить в слой html (или текст) из другого файла без перезагрузки страницы?

Можно подгружать в невидимый ифрейм и читать оттуда через .body.innerHTML

Однако в современных браузерах (MSIE 5.5, Mozilla 1.x) есть объект "XMLHttpRequest", с помощью которого можно выполнять HTTP запросы непосредственно из javascript программы. Несмотря на своё название, это объект может запрашивать не только XML, но и произвольные (в том числе HTML) данные.

Пример использования:

function loadHTML(sURL)
{
  var request=null;

  // пытаемся создать объект для MSXML 2 и старше
  if(!request) try {
    request=new ActiveXObject('Msxml2.XMLHTTP');
  } catch (e){}

  // не вышло... попробуем для MSXML 1
  if(!request) try {
    request=new ActiveXObject('Microsoft.XMLHTTP');
  } catch (e){}

  // не вышло... попробуем для Mozilla
  if(!request) try {
    request=new XMLHttpRequest();
  } catch (e){}

  if(!request)
    // ничего не получилось...
    return "";
 
  // делаем запрос
  request.open('GET', sURL, false);
  request.send(null);

  // возвращаем текст
  return request.responseText;
}

Документация:

http://msdn.microsoft.com/library/en-us/xmlsdk30/htm/xmobjxmlhttprequest.asp
http://unstable.elemental.com/mozilla/build/latest/mozilla/extensions/dox/interfacensIXMLHttpRequest.html

Хорошая статья про "inner-browsing" на Nescape devEdge:

http://devedge.netscape.com/viewsource/2003/inner-browsing/

Как приостановить выполнение скрипта?
Это сделать нельзя. Когда выполняется JavaScript, браузер не может обрабатывать события, поскольку к этим событиям могут быть привязаны другие JavaScript-обработчики, а параллельное выполнение скриптов в JavaScript запрещено. Для пользователя это выглядит как зависание браузера. Поэтому JavaScript всегда должен завершаться как можно скорее. Если программе нужно что-то сделать позже, можно установить для этого таймаут:
function task1()
{
  // Здесь что-то делаем, после чего надо подождать пару секунд
  setTimeout("task2()", 2000);
}

function task2()
{
  // Продолжаем выполнение после двухсекундной задержки
}
Powered by POEM™ Engine Copyright © 2002-2005