Программирование::JavaScript::Разное - F.A.Q.
Учебники:
http://www.webteacher.com/javascript/
http://wdh.suncloud.ru/ (Рус.)
http://www.quirksmode.org/
Справочники:
http://msdn.microsoft.com/workshop/author/dhtml/reference/dhtml_reference_entry.asp - DHTML Reference
http://developer.netscape.com/docs/manuals/javascript.html
http://www.bratta.com/dhtml/
http://dhtml.ru (Рус.)
http://www.webdeveloper.com/javascript/
http://www.webreference.com/js/
http://www.webreference.com/dhtml/
http://msdn.microsoft.com/ie/
http://msdn.microsoft.com/voices/dude.asp
Примеры и библиотеки:
http://www.dansteinman.com/
http://www.kruglov.ru/klayers/ (Рус.)
Различие браузеров:
http://www.kruglov.ru/articles/crossbrowserdhtml.shtml (Рус.)
Разное:
http://hotscripts.com/
http://javascripts.internet.com/
http://www.joehewitt.com/
http://leechy.design.ru/
http://www.scottandrew.com/
Существующие способы, базирующиеся на языке JavaScript, не позволяют достичь принципиальной защиты. Они приемлемы лишь для защиты от неопытных пользователей.
<script language="JavaScript">
document.write("<"+"script language=\"JavaScript\" src='...'></"+"script>")
</script>
тег </script> необходимо разбить, чтобы браузер не думал, что внешний скрипт закончился на этом теге.
Можно пройтись по всем ссылкам:
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()}
}
}
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 ""
}
document.body.scrollLeft
document.body.scrollTop
Netscape 4-6, Opera 5:
pageXOffset
pageYOffset
Изменить - либо обратиться к этим переменным, либо вызвать стандартную функцию scroll(x,y)
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
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>
Для передачи нескольких параметров, к примеру так: 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 ""
}
Можно записать в атрибут 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)
Я пытаюсь впечатать в документ SSI-инструкцию такой строчкой: document.write("<!--#include virtual=\""+file+".shtml\" -->"), но она почему-то не исполняется? Что я делаю неправильно?
Ответ:
Дело в том, что SSI (Server Side Includes) исполняются на сервере. Т.е. когда сервер уже отдал документ клиентскому браузеру, то он (сервер) уже не властен над этим документом. И когда вы пытаетесь впечатать в документ SSI-инструкцию, ее уже некому исполнять.
Пример - window.external.AddFavorite(location.href, document.title)
Сделать стартовой - <a href="#" style="behavior:url(#default#homepage)" onclick="this.setHomePage(URL);return false"> (IE 5+)
Mozilla: document.onmousedown=function(){return false} или указав для body стиль -moz-user-select: none
<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 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>
Ссылки по теме:
А еще
Притча
Жили 2 богатых человека. И решили они отдать свое богатство на праведные цели.
Первый ходил по улицам, переходам метро и вокзалам, подходил к нищим, бомжам и беспризорникам, и давал каждому из них по 1000$. Нищие радовались, благодарили, говорили ему "Спаси тебя Бог", а сами шли и пропивали и всячески прожигали столь легко доставшиеся деньги.
Другой никому ничего не раздавал, но вложил деньги в строительство фабрики. И звал работать на эту фабрику всех желающих, в том числе и тех нищих, которые некоторое время назад получили деньги от первого. Но мало кто из них пошел работать, так как они уже привыкли к своей безалаберной и безответственной жизни. Хотя нашлись и такие, кто принял предложение второго. Второй богач платил им заработную плату, но и требовал от них качественной и упорной работы. Первое время они потихоньку поносили строгого начальника, но потом постепенно привыкли, собрались и стали такими же, как и все работающие люди.
Теперь скажите, кто из двух богатых людей употребил свое богатство лучше?
Классический выход - передавать ссылку на родительское окно при вызове диалога как параметр. Т.е. при вызове пишем
vReturnValue = showModalDialog(sURL, self, sFeatures)
а в диалоге обращаемся к родительскому окну как
window.dialogArguments
Примечание: Этот метод не работает в MSIE6.0, если контент диалога создается динамически через javascript: протокол -- т.е. showModalDialog('javascript:...')
myText.replace(/\r\n|\r|\n/g,"<br>")
Можно подгружать в невидимый ифрейм и читать оттуда через .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:
function task1()
{
// Здесь что-то делаем, после чего надо подождать пару секунд
setTimeout("task2()", 2000);
}
function task2()
{
// Продолжаем выполнение после двухсекундной задержки
}
![[logo]](/site/images/logo.jpg)