Jump to content

Yarik Voronov

Expert
  • Posts

    226
  • Joined

  • Last visited

Everything posted by Yarik Voronov

  1. 2 Emm +1 2 maza Если надо почистить вс? и именно без кнопки (из скрипта) : [DOMFormElement].reset(); Если в какой то определенный момент времени надо почистить именно часть полей, а не все (причем у них name'ы разные), то можно пройти по className. Например: <form id="myForm"> <input type="text" name="n1" class="myReset" /> <input type="text" name="m2" class="myReset" /> <input type="text" name="t23" class="myReset" /> <input type="text" name="o1" class="myReset" /> </form> function resetMyReset () { var toReset = document.getElementById('myForm').getElementsByTagName('INPUT'); for (var i=0, e=toReset.length; i<e, i++) if (toReset[i].className == 'myReset') toReset[i].value = ''; } можно напридумывать массу вариаций. сразу говорю что код набросал сразу, потому без проверки. Но общая идея надеюсь понятна
  2. а самому догадаться? 1. правильно ставить курсор. 2. не нажимать ентер в дизайнерском предпросмотре. 3. ручками писать в коде, а не через дизайнерский предпросмотр. 4. удалить ручками в коде все там где они не нужны. 5. ознакомиться (хотя бы просто ознакомиться) с html синтаксисом http://stepbystep.htmlbook.ru/ 6. правильно настроить дрим на реакцию ентер в дизайнерском предпросмотре
  3. ну! дык у тебя там параграф создается при ентере. смотреть на маленькую строчку внизу окна просмотра. в этой строке описано все дерево элементов до того на котором стоит курсор а параграф имеет свои отступы и поля. в последней первьюшке нет такого параграфа ( )
  4. в теге table должны присутствовать эти атрибуты со значением 0, изменив жать на рефреш
  5. cellpadding, cellspaсing проверьте. должны быть равны 0 (смотреть ч/з код просмотр, в диалоге менять соответсвующие значения на 0 - как они в руссифицирован дриме называюся не знаю) полная информация по http://htmlbook.ru/html/table.html
  6. AKS, спасибо. На самом деле мне интересно все. За намек на date спасибо - буду искать. Буду смотреть уже готовые решения. И не совсем так просто . В данном посте я привел рабочую "вырезку" из целого кода (то что волновало) А все в целом выглядит так. Каждый класс отдельный js файл. Экземпляр ConfirmObjectClass | Сам ConfirmObjectClass (подгружает из xml, создает стили (html style) оформления своего класса, в т.ч. и DOM-элементы, инициирует интерфейс) | ConfirmInterfaceClass (осуществляет запрос на открытие/скрытие экземпляра, вставку/очистку рабочего контента, уведомляет всех "подписанных" участников ситуации о произошедшем событии, реализуя ObserverInterfaceClass) | ConfirmClobalInterfaceClass (реализует расположение равнозначных экземпляров класса в одной области видимости на html странице) | GlobalDialogClass (осуществляет непосредственно скрытие/открытие экземпляра, реализует "спецэффекты", осуществляет перемещение Dom-объектов экземпляра класса, который его расширяет, по экрану) | ObserverInterfaceClass (реализует слабое связывание компонентов) А сам дизайн конечного DOM-объекта я оставляю на откуп дизайнерам - пусть и они что-нить придумают
  7. 2 Pavel_html, rn (или только n) надо ставить везде, где Вы хотите чтобы был осуществлен "физический" перенос на новую строку (в html он игнорируется) Тег осуществляет, скажу так, только виртуальный перенос на новую строку при просмотре html-документа в браузере. Потому если он там не нужен то следует его убрать, потому что при будущем распарсивании документа обратно в html будут виртуальные переносы и путаница с нужными/ненужными . И скорее всего перенос был вызван тем, что в форму ввели к-л.(или эти же) спец символы. Спецсимволы по прав. без-ти лучше вносить самому в скрипте именно туда где они нужны и не доверять их пользователю. или заменить спец символы условными обозначениями, доступными пользователю, BBCode, как пример.
  8. Yarik Voronov

    CSS

    собственно матчасть здесь
  9. >AKS: Вариант номер один: tObj.changeWidth(8) => tObj.changeWidth(18) +1 и самое главное работает, я думал поначалу div будет передвигаться/меняться скачками. >>Yarik Voronov: Ибо для IE это смерть - циклические ссылки, потеря памяти. >AKS: Действительно ли это является причиной утечкек памяти, или это предположение? Собственно перечитав http://webo.in/articles/habrahabr/18-solvi...r-memory-leaks/ http://www.bazon.net/mishoo/articles.epl?art_id=824 выяснил (уяснил), что основная особенность утечек памяти состоит в том, что в замыканиях присутствуют перекрестные ссылки JS-конструкции и DOM/ActiveX-объекта друг на друга. собственно в приведенном коде таких замыканий не обнаружил (может плохо искал?). потому это было предположение, вы правы AKS. И также протестировал IE6 SP1 и FF2.0.0.13 на прирост памяти при выполнении этого кода. увидел, что прирост при первом прогоне и там и там равен около 10 КБ. при последующих прогонах не меняется. НО все-равно мне этот код с setTimeout() не нравиться, потому что если судить по материалу (http-ссылки выше) то первая временная ссылка на один и тот же объект (MyTestDialog) отсвобождается когда закончиться последняя итерации изменения ширины (по алгоритму начинаем с длины). а этих ссылок примерно 72 (300/8 + 280/8, принудительная очистка clearTimeout() никак не повлияла). это (замораживание в памяти переменных предидущего setTimeout) и обусловливает, на мой взгляд, прирост оперативки на 10 KБ. А вот тормаза с setTimeout('',0) (по идее должен работать как простой while/for?) видимо связаны со скоростью обработки конструкции (объект и ссылки на MyTestDialog) самим JS - интерпритатором. или?... В настоящий момент я переделал и взял за основу window.setInterval(); Эффект такой же а вот память не растет (получается только 2-е временные ссылки на первоначальный объект). var GlobalDialogClass = function () { // без изменений } GlobalDialogClass.prototype = { displayDialog: function () { // без изменений }, changeWidth: function () { var tObj = this; this.wFlag = setInterval(function () {tObj.cW(18)},1); }, cH: function (y) { this.Height +=y; this.hObj.style.height = this.Height + 'px'; this.hObj.style.marginTop = -Math.round(this.Height/2) + 'px'; if (this.Height >= this.h) { clearInterval(this.hFlag); this.hObj.style.height = this.h + 'px'; this.Height = 0; } }, cW: function (x) { this.Width +=x; this.hObj.style.width = this.Width + 'px'; this.hObj.style.marginLeft = -Math.round(this.Width/2) + 'px'; if (this.Width >= this.w) { clearInterval(this.wFlag); this.hObj.style.width = this.w + 'px'; var tObj = this; this.hFlag = setInterval(function() {tObj.cH(8)},1); this.Width = 0; } }, hideDialog: function () { // без изменений } } А был еще? Я вот подумывал сделать вложенные циклы по такому типу: while (ширина!=искомой величине) {пустой цикл скажем на 1 млн итераций; меняем ширину;} но подумал: "Одно из двух - либо память, либо процессор..." память победила
  10. Суммируя все разяснения даю свой короткий, полный и вразумительный ответ: Всегда присваивать cDBQuery::$link идентификатор на открытый канал связи с MySQL. а уж как, какой, и по какому принципу ты откроешь канал связи - это твои заботы
  11. Предистория. Есть относительно большой проект, где предполагается использовать достаточное количество всплывающих div HTML элементов на одной странице. это могут быть диалоги, алерты, конфермы и прочая, прочая. Без определения классов и объектов тут не обойтись по многим причинам, одна из них самая существенная заключается в независимости экземпляров одного и того же класса друг от друга, но с одним интерфейсом. Ниже я приведу "вырезку" из кода (обособленную, рабочую build версию класса confirm). Для удобного (эффектного) отображения конферма всплытие делается плавным (расширение сначала по ширине, затем по высоте от центра) Собственно код <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Global Dialog Class</title> <style type="text/css" media="screen"> .confirm { font-family:Arial, Helvetica, sans-serif; font-size:12px; position:absolute; top:50%; left:50%; background-color:#FFFFFF; border: #36398F 2px solid; z-index:30; display:none; overflow:hidden; visibility:hidden; } .confirm H2 { margin:0; padding:2px 0px 5px 5px; background-color:#FFF583; border-bottom:1px solid #FFFFFF; font-size:120%; } .confirm DIV.body { clear:right; max-height:300px; overflow:auto; padding:1%; } .confirm DIV.controls { background-color:#F5F5F5; border-top:1px solid #FFFFFF; display:block; padding:2px 2px 5px 2px; text-align:center; } .confirm BUTTON.controls { padding:2px 3px 2px 3px; margin:0px 10px 0px 0px; font-size:12px; border:1px solid #36398F; background-color:#ECE9D8; width:100px; } </style> </head> <body> <div id="confirmContaner" class="confirm"> <h2> <img id="confirmCancelImg" src="/admin/icons/16x16/cancel.png" style="float:right; padding:2px 5px 0px;" alt="close" border="0"/> <span id="confirmHead">Arguments.callee</span> </h2> <div id="confirmBody" class="body"> Это может быть очень полезно для отладки. Нахождение прототипа класса изнутри активированного объекта тоже не представляет трудности - arguments.callee.prototype. Arguments.callee также показывает метод, которым можно найти имя его метода, опять-таки простым использованием arguments.callee. Это не так полезно, поскольку свойства у методов обычно не прикрепляются ни к объекту с именем метода, ни к объекту прототипа, поэтому ссылки на эти объекты обычно не требуется. Кроме того, не существует надежного способа, которым метод находил бы объект с именем класса, к которому он принадлежит (за исключением прописывания ссылки вручную). </div> <div class="controls"> <button id="confirmCancel" type="button" class="controls" onclick="MyTestDialog.hideDialog();">Cancel</button> <button id="confirmOk" type="button" class="controls">OK</button> </div> </div> <script language="javascript" type="text/javascript"> var el = function (label) {return document.getElementById(label)}; var GlobalDialogClass = function () { this.marginTop = 0; this.Height = 0; this.marginLeft = 0; this.Width = 0; this.hObj = el('confirmContaner'); this.hObj.body = el('confirmBody'); } GlobalDialogClass.prototype = { displayDialog: function () { with (this.hObj.style) { visibility = 'hidden'; marginTop = 0 + 'px'; marginLeft = 0 + 'px'; display = 'block'; width = 300 + 'px'; this.h = this.hObj.clientHeight; this.w = this.hObj.clientWidth; width = 0 + 'px'; height = 0 + 'px'; visibility = 'visible'; this.changeWidth(3); } }, changeHeight: function (y) { this.Height +=y; this.hObj.style.height = this.Height + 'px'; this.hObj.style.marginTop = -Math.round(this.Height/2) + 'px'; var tObj = this; var tFunc = function () {tObj.changeHeight(8)}; if (this.Height < this.h) setTimeout(tFunc, 0); else { this.hObj.style.height = this.h + 'px'; this.Height = 0;} }, changeWidth: function (x) { this.Width +=x; this.hObj.style.width = this.Width + 'px'; this.hObj.style.marginLeft = -Math.round(this.Width/2) + 'px'; var tObj = this; var tFunc = function () {tObj.changeWidth(8)}; if (this.Width <= this.w) setTimeout(tFunc, 0); else { this.hObj.style.width = this.w + 'px'; this.changeHeight(3); this.Width = 0;} }, hideDialog: function () { this.hObj.style.display = 'none'; } } MyTestDialog = new GlobalDialogClass(); </script> <button type="button" class="controls" onclick="MyTestDialog.displayDialog()">Проверить</button> </body> </html> Собствено проблема Трабл заключается в следующих строчках кода: var tObj = this; var tFunc = function () {tObj.changeWidth(8)}; if (this.Width <= this.w) setTimeout(tFunc, 0); Ибо для IE это смерть - циклические ссылки, потеря памяти. Для других браузеров не удается увеличить скорость раскрытия элемента, насколько я понял из-за того что используются циклические ссылки, под них выделяется немерено памяти и т.п. А clip: rect() не однозначно работает в IE с данным доктайпом, но и все равно потребуется таймаут для его изменения. Собственно вопрос 1. Как изменить код, чтобы иметь возможность более широко изменять скорость раскрытия окна? Я не жду готового кода, мне достаточно ссылки, совета на данную проблему. Допускаю возможность что и алгоритм следует перекроить. Заранее спасибо. З.Ы. На данный момент я перечитываю инфу про утечки памяти в IE.
  12. 1. Не пожалею. 2. ты пишешь не одно и то же. 3. вразумительная задача поставлена впервый раз 4. я задолбался переписывать манул в пост. 6. пользователь не может хранить у себя 100 соединений, он может хранить у себя только параметры чтобы сделать эти 100 соединений ч/з серверный скрипт, написаный тобой. 7. пользователь не может хранить у себя локально идентификаторы 100 соединений от одного HTTP-запроса к другому HTTP-запросу, т. к. все 100 соединений закроются когда закончиться скрипт. 8. mysql_query() не может правильно работать если параметр link_identifer передан как NULL | FALSE | 0 9. соединение должно быть открыто при каждом новом конкретном HTTP-запросе. Т.о. при каждом конкретном HTTP-запросе уже известно каким должно быть значение cDBQuery::$link = $my_link; Посяму? потому что согласно пп 6,7,9 $my_link получает значение всегда и только всегда в серверном скрипте написаном тобой и: 5. прочти внимательно последние два абзаца пердидущего моего поста 5.1. ибо "если же пользователем указаны" - понятие максимально растяжимое. это могут быть параметры профиля пользователя заданные при регистрации, это могут быть параметры сохраненные в профиле с последнего сеанса, это могут быть параметры заданные пользователем через форму в этом сеансе, это могут быть параметры указанные пользователем как default, это могут быть параметры заданные тобой как default если пользователь их не создал или не задал, это могут быть параметры привязанные к конкретной ситуации выраженной в HTML странице, в конце концов это могут быть параметры сохраненные на сервере от предидущего HTTP-запроса в этом сеансе 10. Итого: если cDBQuery::$link == NULL, то значит MySQL запрос делать не надо! ибо см п.9 Всего: вопрос должен ставиться так: "Как определить с какими параметрами должно быть сделано соединение?" А это вопрос алгоритма, разъясненный в п. 5.1 ЗЫ: Если же было открыто 50 соединений, то cDBQuery::$link всегда будет указывать на последнее (если cDBQuery::$link не есть массив, если массив - то последный елемент массива и есть последнее открытое сооединение) ЗЗЫ: если позарез нужно передавать ОДНО соединение от одного HTTP-запроса к другому HTTP-запросу то следует использовать mysql_pconnect(). и хранить его идентификатор в сессии.
  13. Ну а я говорю про причину, почему они не приходят. и если задаться вопросом как устранить эту причину, то можно прийти к следующим 3-м явным ответам AJAX (тогда нового окна вообще не надо, подойдет div с абсолютным позиционированием). или создавая попер прописывать туда форму со всеми значениями и сабмитить именно эту форму именно в новом окне (получаем ответ именно в этом новом окне) или брать данные из формы в родительском окне, забивать их в ссылку нового окна, обрабатывать в скрипте GET данные. (но GET делать не рекомендую, имхо XSS атаки...) или?...
  14. Прошу прощеня за неверную информацию. Есть такое понятие. т.е. можно создать var test = []; test['index1'] = 0; test['500'] = 10; test['index2'] = 3; но попутешествовав по ссылке, данной AKS, покурив доки, я уяснил, что данный способ использовать не рекомендуется, так как для таких случаев предназначена конструкция типа Object(); а использовав Array() можно получить неожиданный результат Возьму на себя смелость попытаться разъяснить <script language="javascript" type="text/javascript"> var myTest1 = []; myTest1[0]=6; myTest1[1]=3; myTest1[2]=2; alert([typeof(myTest1), myTest1.length,myTest1.toString()]); var myTest2 = []; myTest2[3] = 2; myTest2[500] = 6; myTest2[700] = 4 alert([typeof(myTest2),myTest2.length,myTest2.toString()]); for (var a=[],i=0, e=myTest2.length; i<e; i++) { if (myTest2[i]!=null) a.push(myTest2[i]); } alert([typeof(myTest2),a.length,a.toString()]); </script> <?php $myTest2 = array(); $myTest2[3] = 2; $myTest2[500] = 6; $myTest2[700] = 4; while (list($key, $val)=each($myTest2)) print "myTest2[$key] : $val "; // myTest2[3] : 2 // myTest2[500] : 6 // myTest2[700] : 4 print "Размерность myTest: ".count($myTest2); // Размерность myTest: 3 ?> Так вот в РНР автоматически будет создан ассоциативный массив с числовым значением индекса. длиной 3. * * * А вот в JS размерность массива будет увеличена до 701, причем 697 значений этого массива будут равны null (это для odalex). поэтому правильнее использовать массив типа, например myTest = [ {ID: 0, param1: ' ', param2: ' '} ]. или конструкцию типа Object() (Например, myTest = {ID:[ ], param1:[ ], param2:[ ]} ). но я собственно решения odalex не оспариваю
  15. Так. что-то мы недопонимаем друг-друга. Запрос и идентафикатор я не путаю. Прошу прощения не ясно выразился. Здесь подразумевается запроc на HTTP-сервер от браузера. Т.е. у меня открыто окно добавления поста - нажав отправить, я посылаю запрос. Сервер приняв запрос направляет его скрипту. скрипт (множество инклудов - это один скрипт) обрабатыевает полученные данные. так как я залогинился, то устанавливается соединение (канал) с мускулом, происходит множество запросов (допустим) к MYSQL по этому каналу, пишется в базу инфа, выдается подтверждение что инфа принята успешно. и все конект (канал связи) с мускулом отрубается - скрипт закончился. Я же получил уведомление... и вот тут получается самое интересное - происходит редирект на другую страницу, а это уже новый запрос - новый экземпляр другого скрипта - новый идентификатор связи с базой. и эта цепочка HTTP-запрос - экземпляр скрипта - новый идентификатор будет повторяться всегда даже если я решу отставить 1000 постов и каждый раз я буду получать новый идентификатор соединения с одной и той же базой. то есть в РНР-переменной с одним и тем же именем у меня будет каждый раз новое значение идентификатора соединения. так вот я пока не понимаю как это потому что конект делается в скрипте (и вполне однозначным способом) при обработке запроса от браузера. и соединение должно быть открыто каждый раз при каждом новом HTTP-запросе от браузера. поэтому если пользователю (в браузере) предлагается сделать коннект на выбор из списка, то этот выбор следует запомнить (в cookies, sessions) и потом использовать не открытое когда-либо соединение при к-л другом HTTP-запросе, потому что "старого" соединения не будет при использовании mysql_connect(), а параметры для создания этого соединения (этих соединений). я пока намеренно молчу про mysql_pconnect() чтобы не запутывать. если же я в скрипте открою до выполнения основной обработки 100 соединений с разными базами с разными серверами и подам запрос к MуSQL без идентификатора, то будет использовано 100-е соединение. более того все 100 соединений закроются когда закончиться скрипт. и кстати все использованные PHP переменные уничтожаться в оперативной памяти сервера. посему я не вижу смысла открывать 100 соединений и еще к тому же не знать к какому из 100 надо обратиться, чтобы выполнить MySQL-запрос. если же я знаю к какому соединению надо обратиться (какое соединение создать), то нах... мне открывать все 100? (это риторическое размышление). Из предидущего абзаца: если пользователь не указал никакого конкретного соединения, то я однозначно знаю, что надо использовать параметры для открытия соединения, решенного мною (или ранее пользователем) быть default. если же пользователем указаны 50-разных соединений, то я точно должен знать на каком MySQL-сервере данный конкретный запрос может быть выполнен: если на всех 50 то cDBQuery::$link - это массив, если только на 20, то должна быть привязка (или правильная обработка ошибок).
  16. а вообще в sendmail.php данные-то приходят? в данном случае 99% что их там нет, потому что новое окно чисто от POST, GET даты.
  17. Я уж не знаю какой другой идентификатор может торчать наружу в процессе выполнения один запрос - один экземпляр скрипта - один (уникальный) идентификатор соединения. тем более не понимаю как может захотеться пользователю работать с другим идентификатором. если он (пользователь) все-таки сам захочет и более того сможет поработать с другим идентификатором то, он не совсем обычный пользователь... так вот, если использована функция mysql_connect() то: и если прочитать еще раз мануал то т.о. неважно было ли оно открыто в классе или в функции - mysql_query() "отыщет этот указатель" - если коннект был сделан. Есстественно ибо думать mysql_query за программиста не может по прототипу. так же в мануле сказано если это не было переопрнделено в php.ini Так вот если все же прочесть мануал (намек) то можно утверждать следующее: что раз идентификатор не указан при запросе, то и запрос выполнять не следует, потому что с умолчателыми параметрами не проконнектиться function __construct($sql){ if (cDBQuery::$link!=NULL) { // false, undefined, 0 - это уже самому решать $this->r = mysql_query($sql, cDBQuery::$link); if (mysql_errno(cDBQuery::$link)) throw new Exception("cDBQuery->__construct() : ".mysql_error(cDBQuery::$link)); } } либо менять cDBQuery::$link в зависимости от того кто пришел. для админа скажем одно соедениение (пользователь пароль права доступа и т.д.), для обычного пользователя другое (права на туже базу но USAGE), для черного списка вообще доступ закрыт (то есть link = NULL, соединение вообще не устанавливалось) ЗЫ следует учитывать что
  18. А зачем в базу-то? не проще ли в саму сессию писать IP? а потом сравнивать $_SERVER['REMOTE_ADDR'] и $_SESSION['REMOTE_ADDR'] (внесенный туда при первой авторизации). имхо, разница в безопасности этих двух подходов не очень велика, потому зачем грузить мускул неррациональной задачей? может конечно база нужна в данном случае не только чтоб получать только IP и часть сессии, но и еще к-л информацию, но этого hummermania не указал
  19. да и не забыть чтобы файл отправился на сервер
  20. желательно, но не обязательно. имхо, удобнее, т.к. не надо портить html страницу лишними формами. и относительно безопаснее чем теже COOKIEs. Но все зависит, есссно дело, от АЛГОРИТМА авторизации - если он кривой то поможет только выдергивание сетевого кабеля.
  21. 2 banyman. в своем первом посте я написал как правильно формировать ссылку! надо передать URL ресурса, а не форматированный html-тег . если совсем непонятно, то только значение атрибута href тега
  22. 2 banyman. "перевожу" в исходный HTML код <images type="images" onClick="openWin('<a href='detail.php?t=' target="_blank">')"> <!-- Alarm! alarm!! --> <img borger="0" src="images/links/pod.jpg" alt="Подробно" title="Подробно" /> </images> срочно читать мануал Java Script, команда window.open(); и не менее срочно читать мануал синтаксиса HTML. Я не знаю про какое-такое динамическое окно JS идет речь, ибо window.open() создает новое окно браузера с соответствующими параметрами и работает в IE6, FF2, Opera 9.24. Может в Opera и есть "особенные" команды и "особенные" виджеты. но это не значит что они есть во всех браузерах.
  23. кстати в мануале (в разделе Классы и Объекты) есть очень полезный пример организации класса взаимодействия с MySQL Как вариант class MySQLQuery { private $host, $login, $pass, $baza; static public $link; public $result; public function __construct ($h, $l, $p, $b) { $this->host = $h; $this->login = $l; $this->pass = $p; $this->baza = $b; $this->connect(); } private function connect() { $this->link = mysql_connect(); //с параметрами, с дополнительными директивами. } public function muskulQuery($sql) { $this->result = mysql_query($sql, self::$link); if (mysql_errno(self::$link)) throw new Exception("MySQLQuery->muskulQuery() : ".mysql_error(self::$link)); } } $MyQuery = new MySQLQuery('','','',''); $MyQuery->muskulQuery($sql); $r = $MyQuery->result;;
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy