Zeroglif
User-
Posts
46 -
Joined
-
Last visited
Content Type
Profiles
Forums
Calendar
Store
Everything posted by Zeroglif
-
В мире я уже был, но javascript тогда ш?л от меня лесом... дремучим... 'for-in' никак не отдаст точно первый/500-тый/последний элемент, перебор ид?т абы как, 'for-in' мог бы подойти, если бы массив был очень большой, очень сильно разреженный, очень правильно построенный (по порядку и без лишних свойств). Во всех остальных случаях 'for-in' обычно проигрывает, в том числе и по скорости. Для обычного объекта? Object.prototype трогать нежелательно, отсортировать объект можно и через Array.prototype.sort, другой вопрос, зачем это нужно, мне казалось, что изначально вопрос стоял именно о разреженном массиве (термины: "позиция", "элемент", "нулевой"), а иначе, если не о массиве, то зачем в обычном объекте искать позицию...
-
А ведь когда-то во времена динозавров массивов вообще не было, и объект под каждо? сво? свойство создавал заодно и индекс. Про запас. Если речь о массиве, то перебором по индексам с помощью 'for', 'while' и т.п. Перебираем и спрашиваем, есть ли такое свойство/индекс у массива. Конструкцию 'for-in' можно применить и к массиву, но это не гарантирует нужный вам порядок, задействует наследуемые свойства и проч.: Object.prototype.x = 'preved'; var a = [0]; a[2] = 2; a[1] = 1; for (var i in a) { alert(i); //-> у каждого браузера свой порядок (x, 0, 2, 1 или 0, 2, 1, x ...) }
-
arguments.callee.caller.arguments[0].target
-
Правомерно ли использование onclick="javascript:;" ?
Zeroglif replied to homm's question in JavaScript
А ч?, можем и аргументированно. Так и есть, указатель языка в определ?нный момент для определ?нного браузера. Товарищ Internet Explorer включает тот скриптовый язык по дефолту, который ему попался в первом же скриптовом блоке, если на странице гипотетический скриптовый коктейль, и первым стоит код vbscript, то все javascript-овые обработчики в тегах отваливаются, тупой пример: <html> <head> <script type="text/vbscript"></script> </head> <body> <a href="#" onclick="alert('test');">onclick=alert();</a> <a href="#" onclick="java script:alert('test');">java script:onclick=alert()</a> </body> </html> Первый работает, второй - нет. Одним из вариантов устранения этой проблемы в IE стала возможность прописывать в таких обработчиках т.н. индикатор протокола javascript (сами так назвали), тогда движок изолирует этот код от дефолтного скриптового языка, и работает jscript.dll. Это решение в годы некоторой гегемонии JScript растиражировали копипастеры, и понеслось. Тем более, что при отсутствии vbscript ничего страшного не происходит, только масло масляное... Браузеры, в которых таких проблем нет, теоретически и практически должны трактовать префикс java script: в обработчике как label (ECMAScript 12.12), конструкция в этом контексте не нужная, но при этом и не вызывающая ошибку (а жаль). Обычный label в сво?м нормальном предназначении работал бы так: <html> <body> <a href="#" onclick="java script:while(1){break javascript;};alert('out-of-loop');">test</a> </body> </html> Но такой дурью в инлайн обработчиках никто обычно не занимается, никто с label не извращается, никогда в жизни такого не видел. С вышеупомянутым же vbscript в IE тоже проблема наиредчайшая, мало, кто про не? вообще знает, отсюда можно констатировать, что индикатор протокола перед именем обрабочтика - в 99,999% случаев вещь совершенно бессмысленная. И даже вредная, если принять за истину то, что весь бессмысленный код вреден. Тем более если вспомнить, что инлайн обработчики или intrinsic events работают слегка за рамками стандарта javascript и могут в любой момент подложить любую каку. Вот. -
Каков вопрос - таков ответ. Спрашивалось же конкретно про 0 == '' , какие ещ? тут варианты типов. Зря, а ведь могли бы вынырнуть из моря небрежных книг.
-
При нестрогом сравнении двух значений, где одним значением является число (тип Number), а другим является строка (тип String), строка будет конвертирована в число, общий алгоритм такой конвертации полностью изложен в п. 9.3.1 ES, в частности, пустая строка будет конвертирована в ноль... alert(0 == ''); alert(0 == '0'); alert(0 == 't'); alert(0 == ' '); А товарищ Resig похоже просто начитался товарища Crockford-а и смешал в кучу сравнение и конвертацию значений в тип Boolean, которая ид?т по своей схеме.
-
Мне кажется, что количество ваших полунам?ков уже должно перерасти в имя (имена). А то неудобно как-то читать. Кто же этот бессовестный козлище? Мужскую? Оправдано ещ? и тем, что тупо привлекают внимание к javascript-у. И тем, что вовлекают народ в программирование. Тем, что акцентируют сво? внимание на кроссбраузерных проблемах. Тем, что своим существованием порождают дискуссию. И так далее. Пусть живут. Истинная правда. Вот если бы они ещ? и разъясняли в том же объективном ключе, мол, простите, как сумели, а то кругом "the best" да "the new javascript". Да слезьте вы с термина "критик", наконец. Иначе вы такой же критик, как и любой другой. Программисты мы все, не верите что ли, обсуждаем соответствующую тему. Баста. Человеку присуще стоять горой за истину.
-
Вы занимаете абсолютно ту же пуленепробиваемую позицию, что и John Resig. В ответ на справедливые замечания и критику со стороны знатоков языка он просто огрызается: "ну, и где тогда твоя мегакрутая библиотека, а?". Это же детский сад из серии - не понравился фильм, а ты попробуй сними свой. Ему кажется, что людям больше нечем заняться, как только рисовать эти смешные либы. А иначе ты вообще не js-программист. LOL. Настаиваю, что это неправда со всех сторон. Пипл, критикующий либы (а этого пипла не так уж и много, замечу) часто указывает на конкретные ошибки, детально описывая ситуацию. На конкретные, детально, разв?рнуто. Никто, кроме знатока, это не сделает. Это больше, чем тупо переваять блок кода, это передача знаний. Более того, подавляющее большинство программистов в мире вообще не пишет либы на публику. Ага, такая вот странная и необъяснимая весЧь - работают себе где-то там тихо и незаметно во всяких мелких Siemens-aх и Samsung-ах. Предположу, что им или хватает ума не тратить время на ерунду, демонстрируя "правильно спроектированный продукт" публике, или не хватает времени. Обвинять их в бездоказательной позиции про причине отсутствия "ответной либы" - нечестно. Это в адрес кого? Себя? AKS-a? J.Resig-a? Меня? R.Cornford-a? Последний, кстати, намолол языком на толстый энциклопедический тр?хтомник, попробуйте аккумулировать его материалы и сравните с книжкой J.Resiga ("делающего нечто"), который уже на первых 20 страницах допустил 10 ошибок, не считая орфографических. А David Flanagan, который, тупица эдакий, тоже не пишет код, но умеет писать неплохие учебники. А миллион программистов, не написавших либу вообще? А миллион, которые нечто написали, но для себя, для заказчика, а не для WingedFox-а? В вашей логике есть серъ?зный изъян - в ней нет логики. Термин "нечто" надо было расшифровать заранее, чтобы уменшить количество трепачей. Они не присвоили, они умеют это делать и жгут, всем остальным дорога тоже открыта, только не получается у них почему-то. Ничего кроме "а покажи-ка свой код", а "а покажи-ка свою либу". Единственно правильная позиция, надо сказать, со стороны того, кто не справляется с полемикой. Все те критикуемые моменты, существующие в том же JQuery, неоднократно обсуждались, предложений море, автора никто не закидывает какашками. Дорогой, WingedFox, вы же тоже предлагаете публике свои решения, разве вас закидывают тем же на dklab-e? По-моему вс? в рамках правил, вы часто получаете качественный фидбэк, код светлеет. Или вам ближе картина, когда вы открываете тему: "вот моя новая либа для работы с массивами", а со всех сторон: "а вот моя", "а вот моя", "и мою посмотрите" и никакого обсуждения, каждый тупо отметился, что он не трепач и по лавкам.... p.s. При том, что все либы по-своему плОхи и наполнены ошибками, я не считаю джиквери такой уж однозначно плохой, она точно лучше прототайпа, проще, javascript-овее... rash Нельзя делить мир на критиков и творцов. От того, что Вася написал либу, он не стал более творцом, чем Петя, который указал ему на ошибки. И наоборот. Невозможно только лишь отвечать кодом на код, это отнимает время и требует у всех без исключения одинаковой заинтересованности, что невозможно, в принципе. Сейчас в сети сотни js-библиотек, и если бы мы жили по принципу "хочешь критиковать - пиши в ответ либу", этих библитек было бы миллион(ы). Оно нам надо? ;-)
-
Никак. Нужно обязательно что-то делать. Но времени мало. А кушать хочется. И вот с неба спускается Джон, за ним библиотека Джона, а с ней уж и благодать сразу вместе с опытом и знаниями. Верится? Отличный вопрос, бьющий наповал армию оголтелых либосторонников, которые часто говорят строем про то, чего не знают вообще. И подкрепляют это утверждениями друг друга. Проверено на их генералах, гадом буду. p.s. А вообще вы совершенно правильно выступили против "петли на шее авторов js-либ". Я тоже против. Слишком быстрая смерть.
-
Можно бы и на двенадцать, если предмет спора выйдет из сумрака...
-
var a = [], i = 40000; while (i--) { a[i] = i; } document.write(a.join(' '));
-
Я вам прив?л пример, уже один только этот пример говорит вам о некоторой разнице поведения. Не заметили? Заметили. Никакой документации по этому поводу вы не увидите. IE обнаруживает ваши неизвестно почему без-var-ные идентификаторы и, чтобы избежать ошибок, созда?т для них специальный временный объект, после присвоения клад?т их по сути неизвестно куда, то же самое касается нод, в итоге мы имеем в целом вроде правильную картину, но есть давние необъяснимые баги, связанные со странным поведением глобального объекта в IE, который двоится/троится и сам себе не тождественен, со странным поведением, когда собранные идентификаторы нод в определ?нных обстоятельствах защищают себя от изменений, а в других обстоятельствах не защищают, и проч. странности, о которых упоминать не стану. И даже с теоретической (ненавистной вами) точки зрения объявление переменной и псевдообъявление переменной - это совершенно разные вещи, второе уже 100 лет, как осуждается, и считается, извините за повтор, "bad practice", кстати, не "bad theory", что было бы неприятно глазу практика... и даже упомянуто в в официальных доках. В общем, много пишуший js-программист должен давно забыть о псевдообъявлениях, как о глупой, ненужной и баго-опасной идее, странно, что я должен как попка повторять очевидные вещи. Это к вопросу о внимании к мелочам. Написал выше, начните экпериментировать с IE и он покажет вам свою неземную "любовь" к global object. Это истинная правда, но НАЗЫВАЮТ и ошибка эта ВСТРЕЧАЕТСЯ. Ваш код обнаруживает то, что псевдообъявление - это ваш собственный стиль (или прости господи конвенция у вас такая?), я всего лишь показываю вам и посетителям форума минусы этого стиля, а не говорю, что вы что-то там ошибочно назвали, ваш скрипт работает, это никогда не отрицалось. Поймите вы, наконец, что критика и обсуждение не имеет целью затоптать конкретный скрипт, а его автора выставить дураком, я-то как раз картинку вижу цельную, из многих деталей, а вы, наоборот, опускаете и отрицаете, словно общаетесь не в форуме, а в своей корпоративной тусовке, где все вс? про скрипт и внутренние конвенции знают и не парятся... Это необязательно в общем смысле, javascript создавался и для непрофессиональной (не за бабло) разработки, для энтузиастов, WEB-гиков и прочей нечисти, у них нет тормозов и ограничительной документации. Имейте их в уме, предлагая свои решения на публичном форуме, куда ходят абсолютно все, включая слепоглухонемых копипастеров. Никогда не говори никогда! Согласен, нужно говорить умные слова. Вид не важен. Стараюсь, как могу, имеющий глаза... да увидит. Использовал неистово, не смог только вот найти источники в виде девелоперов Мозиллы. Вс? незнакомое кажется бредом. Закреплял, гвоздями, соткой. Стена трухлявая, проваливаются. В каких некоторых? Игнорирую я исключительно попытки со мной обращаться в стиле "а ну-ка-ну-ка покажи, свой супер-пупер код". Как говорится, "кому хочу - тому даю" (Л.Слиска). Вот вам свежий пример - вчера в ньюсах c.l.j обсуждались библиотеки и туда неосмотрительно забр?л товарищ John Resig (jQuery), знаете такого, который пытался на критику реагировать примерно также, как и вы: "Where's your ultra-popular library that is 100% future proof?" или уже так: "Where's your ultra-documented, totally-awesome, perfect-in-every-way JavaScript library?". Вот он тоже считает, что если он написал и раскачал популярную либу, то чтоб с ним спорить ему надо кинуть аналогичную ответку в виде популярной либы. Смешной человек, первый раз в жизни заш?л в гости к профи и фанатам языка и был моментально отстрелян в голову не самыми сильными представителями сообщества в количестве 2-х человек. Хотя по сравнению с вами ему можно дать скидку - он действительно написал много и на людях, но вы-то с какого рожна с меня код тянете, я же с вас не тяну, пишите что угодно и как хотите... :mad: Ну, при ч?м здесь драфт. Я пытаюсь вам объяснить, что программировать/синтезировать событие нужно тогда, когда нельзя обойтись более простым и над?жным решением. На мой взгляд, вы просто не видите этого решения. Конечно не понял, почтому что из того, что я вижу в вашем коде вам совершенно не нужно сканировать родителей. И объяснения про вложенные теги - это полная ерунда, потому что вы работает с this, а не с таргетом. Позднее вы попытались объяснить свою оплошность уже с помощью неких внешних нод, мол, я могу ссылку вложить (ага, проканало бы, если бы постом раньше не писали обратное), а для этого надо скрипт менять, так что это объяснение вы в голове заранее не держали, а просто ошиблись, не понимая разницы между объектом, на котором запустилось событие и объектом, на котором запустился обработчик. Что касается моей реализации табулятора, то она вам никак не может быть интересна по той причине, что в этой ветке соревнуются скрипты двух других джентельменов, а требовать поучаствовать в соревновании судью/критика/наблюдателя я бы постеснялся.... Удачи.
-
Оторвитесь вы наконец от своего ничего мне не говорящего опыта, это не интересно, и судя по всему даже вредно. Иначе мне прид?тся писать такой же дурацкий ответ - "за 5 последних лет постоянно какие-то проблемы с программируемыми событиями". По существу же дела можно с ходу наткyться на что-то вроде: 2005 год, в результате синтезированного события объект event нес?т на борту неверные значения и т.п. https://bugzilla.mozilla.org/show_bug.cgi?id=282266 2005 год, dispatchEvent отваливается для бедных буковок (в целях безопасности?), народ сильно возмущается https://bugzilla.mozilla.org/show_bug.cgi?id=303713 2006 год, событие в отношении non-printing-keys нельзя синтезировать (в целях безопасности?) https://bugzilla.mozilla.org/show_bug.cgi?id=337975 Я ещ? молчу про то, что до сих пор народ пишет и в багзиллу и не только туда, удивляясь, почему же программируемое событие не кликает ссылки, и где про это почитать. Да потому что уязвимость, мать е?. И это только один движок. Вс? это уже должно подсказывать вам, что синтетические/программируемые события - это много сложнее, чем интерактивные, они не эквивалентны, есть между ними известные и видимо ещ? неизвестные отличия, есть случаи (см. ссылки), когда движок бер?т и меняет поведение в отношении таких событий, прежде всего в целях безопасности. К тому же вс? вышеперечисленное документировано весьма скупо, без указаний на особенности/несоответствия, отсюда простой вывод - если скрипт написан таким образом, что можно не синтезировать событие, то и не нужно этого делать. Ваш скрипт именно таким вот образом и написан, от сохи, с применением легко вызываемых инлайн обработчиков. Вообще, эти контрасты в вашем скрипте веселят, легко вызываемый инлайн обработчик, с одной стороны и не в кассу синтезированный программно клик, с другой, потом, с одной стороны, вы переда?те аргументом в функцию значение this (ноду, на которой висит обработчик), с другой стороны зачем-то опять же не в кассу пишите код, сканирующий родителей на предмет наличия свойства, хотя нода вот она, вместе со своим свойством. Какое-то прям ч?рно-белое кино. Немое к тому же. Тап?р сюжет сопровождает, но лажает жутко. На крики из зала никак не реагирует. Дынц-дынц, дынц-дынц...
-
C кем конкретно общались? Можете сообщить имя/ник?. Хочу сам поговорить, ни секунды не верю, что они находятся на вашем уровне, просто попытайтесь сами разобраться в том, что я вам пишу. Есть же даже пример, запускайте его в IE, думайте же наконец, что происходит, там же комментарии. Дело вовсе не lambda functions, а в НЕЯВНОМ заведении переменных, БЕЗ var перед идентификатором. Вы пишете процедурно, вообще без var, размещая скрипт где-то внутри html, засыпая window свойствами, для IE с его механизмом сбора всех идентификаторов/им?н тегов в виде свойств окна и последующей их защиты от изменений это чревато ошибками, повторюсь - только в этом году наблюдал ряд ошибок такого рода (не голословно, можете все ответы найти гуглем). Программист должен писать так, чтобы кодер не волновался по этому дурацкому поводу и выбирал нужные имена смело, без оглядки на javascript. Смотрите ещ? раз в код, сходите по указанным ссылкам. И не прислоняйте девелоперов Mz каким-то боком к своей некомпетентности. Во-первых вы ничего не поняли про лямбду, когда речь шла о переменных, во-вторых, описанное в доках запросто может быть "bad practice", тут нет противоречия, наоборот, eval, with... - это вс? описано в доках, но неуместное использование осуждается. Когда уровень такого неуместного/некачественного использования зашкаливает, профессионалы и знатоки языка начинают вырабатывать рекомендации, приклеивая для удобства и доходчивости ярлык "bad practice". Иногда масштаб дурного использования настолько огромен, что разработчики сами официально ненавязчиво намекают воздержаться от дури, например, если вы загляните в сюда, то прочт?те: Это открытым текстом пишет Mz специально для ньюбов - "не стоит так поступать, не надо!", хотя у них вс? намного спокойней в этом смысле, чем в JScript, с его id-багами и двухглавым глобальным объектом... Может 30 лет? Меня вообще это радует - сначала вы ничего вообще не понимаете, зада?те глупые вопросы, это видно, ни бэ ни мэ, но стоит только объяснить, как сразу: "А... это, это я и так знаю, ещ? с 1996 года". Раньше надо было вертеться, обнаруживая знания. Пару страниц назад. Игнорируйте, не обижусь, только не врите больше, что не дождались от меня ни одного пояснения. Где-то с третьего поста в ваш адрес в этой ветке я уже пишу не только для вас лично, но и для тех, кто будет читать форум. С воинствующей безграмотностью приходится воевать публично, как бы это не раздражало, миссия такая. AKS, девелоперы не при ч?м, s0rr0w не уловил идеи и спросил совершенно не про то, что ему написали, зато теперь у него за спиной в качестве неубиваемых аргументов есть: - многолетний никому неизвестный опыт; - куча никому неизвестных, но работающих скриптов; - энное количество неизвестных смеющихся девелоперов Мозиллы. C таким войском можно легко оспаривать, что земной шарик - шарик.
-
Надо же вс?-таки изучать предмет, вот специально подобранные ссылки. Я только в этом году раз пять на различных форумах отвечал людям, которые попадают на IE-баги с конфликтующими свойствами window. Вы, вместо того, чтобы функции или переменные объявлять, записываете выражения "идентификатор=функция", это не только "bad practice", о которой говорится во всех мыслимых и немыслимых javascript-доках, но и путь, который при стечении определ?нных обстоятельств может привести к трудноуловимой ошибке, пример: <html> <body> <span id="test">Test page</span> <div id="tabWrapper"> <div id="tabSwitch"></div> <div class="tab"> <a href="#">Tab 1</a> Tab 1 Content </div> <div class="tab"> <a href="#">Tab 1</a> Tab 1 Content </div> <div class="tab"> <a href="#">Tab 1</a> Tab 1 Content </div> </div> <script type="text/javascript"> /* ошибка в IE (конфликт им?н) добавьте var, чтобы увидеть разницу */ test = 0; tabSwitch = function () { alert(test); }; tabSwitch(); </script> </body> </html> Не надо видеть, надо просто знать! За столько лет практической работы вам бы стоило давно уяснить, что "synthetic events" по определению бажные, и если нет в них острой необходимости, то шли бы они лесом. Это аксиома. Список проблем такого рода специально не веду, можете самостоятельно начать интересоваться вопросом с багзиллы и закончить гуглем. Шаткость этого дела связана со сложностью реализации, затем "synthetic events" бывает меняют свои алгоритмы в угоду борьбы с браузерными уязвимостями, сегодня событие запустилось, завтра - нет по причине приостановки некого опасного поведения. Добавьте сюда ещ? и кроссбраузерную мешанину. Я, например, не могу на 100% гарантированно ответить (сославшись на доки), будет ли отменено дефолтное действие у ссылки с помощью "return false", когда событие толкнули программно скриптом (FF насколько помню вообще не переходит по ссылке, то есть налицо отход от обычного поведения). Ваш код простой, вы не нанизываете события на ссылку, нет нужны в "физическом" клике и т.д., на ссылке висит архаичный, закал?нный в боях инлайн обработчик, который вызывается на раз безо всяких ухищрений. Это сразу же бросается в глаза - никаких препятствий к вызову нужной функции из тега и одновременно ненужная возня с dispatchEvent. Не читал, не знаю, в какой. Авторство книжки, которую я не читал, не мо?. Гы. Неужели профессиональному практикующему программисту нужно расписывать такие почти риторические вопросы, как "заводи нормально переменные" или "программмируй события при острой необходимости оунли"? Каюсь, оказалось нужно объяснять и это. Зато я не опустился до вранья про то, как я тут оказывается не дал вам ни одного пояснения. Ни одного не дал, ага. А вообще... надо было вам выдать что-нибудь более энергичное, например, "какой такой Zeroglif? не было тут такого...". Удачи.
-
Врань? - это: Я вам не пояснил, в ч?м опасность применения метасимвола b для отсечения слов? Я вам не пояснил, в ч?м опасность do-while при работе с "коллекциями"? Я вам не пояснил с кодом вместе, что скорость циклов зависит от техники? Я вам не пояснил с кодом вместе, что инлайн обработчики несут на борту "custom scope chain"? ... и так далее Вы, сударь, мало того, что неумело, но агрессивно отстаиваете свой плохо написанный код, вы ещ? и банальный враль. Прич?м не краснеющий. Удачи. p.s. что конкретно вам нужно пояснить ЕЩ??
-
Ну, ладно, вам не стыдно за свои ошибки, за незнание, но неужели и врать тоже не стыдно? Если я действительно ничего в этой ветке не пояснял, то что же тогда вам пояснить кроме того, что уже вроде как проехали?
-
Бугага бугагой, а я резюмирую. В итоге всего этого разговора в стиле "моя твоя не понимай", вы вс?-таки: - разобрались с особенностями метасимвола b в javascript; - узнали, что IE ниже 6-ой версии не поддерживает special value "*"; - поняли алгоритм do-while с его обязательным разовым действием вне условий; - осознали, что скорость в циклах зависит больше от техники, чем от формы; - обнаружили для себя "custom scope chain" в инлайн обработчиках; - увидели, как метод окна может быть перекрыт методом документа; - поняли, как недальновидно собирать ноды в массив задом напер?д; - узнали, что переменные с именами "_" и "$" не являются синтаксическими ошибками; - ... остальное уже не помню... К сожалению, не удалось довести до вас то, что: - "неявное заведение переменных" - прямая дорога к багам IE (и частично к багам Opera); - проверка браузера пут?м выявления условно идентифицирующих срок отсекает часть пользователей; - эти же строки не являются залогом успешного использования нужного свойства/метода вообще; - "таргет события" не мешает всплывать событию, а обработчику корректно работать; - инлайн обработчики элементарно вызываются без бажных и непопулярных dispatchEvent и т.п.; - блоки try-catch при тотальном отсутствии проверок и контроля за скриптом - признак непрофессионализма; а также то, что: - дьявол кроется в деталях; - негоже нику бряцать опытом; - логика должна быть логичной; - не только s0rr0w - практик; - не знать теорию - стыдно. Удачи.
-
Чей конкретно метод setTimeout для значения this вызываемой функции не имеет никакого значения, можно его даже сделать методом нужного объекта, это не важно. Важно как (в какой форме) происходит вызов, но нам это неизвестно, т.к. вызов жив?т, условно говоря, где-то в недрах хостового setTimeout, известен только конечный результат - значением this становится window приблизительно также, как это обычно происходит при вызове вложенной функции. Обычно проблема правильной связи решается уходом от this в пользу переменной (тот же self) или оставив this, но добавив в качестве "прокси" замыкание: var x = 'preved', o = { x: 'medved', y: function() { alert(this.x); } }; setTimeout(o.y, 1000); //-> preved setTimeout(function () { o.y(); }, 2000); //-> medved p.s. некоторые браузеры передают значение this дополнительным аргументом.
-
s0rr0w, ускользать надо от возмездия, а не от меня, жертвы мне не нужны, за державу обидно. Вот ваша цитата предыдущая: Отсюда видно, что "таргет" от "не-таргета" вы не отличаете, не видите логику своей собственной конструкции - как всплывает событие, какой объект прид?т в нужную вам функцию, когда сработает обработчик, как это вс? вместе увязано. Потом видимо прозреваете ("ой, я же ссылку и передаю"), но признать ошибку ломает, и снова отмазка номер 88: Было "теги внутри ссылки", теперь - снаружи. Дружище, чтобы не признавать свои оплошности в логике вы готовы уже перетрясти скрипт - меняете ноду, не перенося обработчик, переносите класс, и ещ? до кучи прид?тся в скрипте пару изменений сделать (это к вопросу удобства). Низачот. Не один обработчик в ноде? Ну-ну. Скрипты, которые будут работать с одним единственным ж?стко прописанным инлайн-обработчиком? Радостно. Я уже чувствую, как скрипт участвует как минимум в сотворении мира, но детали реализации (пара сотен строк) для удобства опущены. Чтоб не отвлекали. Ну, хотя бы из (не)любви к теории, как иначе программно вызвать переключение табов? Огромное не выводится, но достаточное, чтобы тормозить, выводится. Хранение кастомных данных в нодах не прибавит скорости любой сортировке, какой бы не был объ?м. ?
-
Контейнер может быть по-разному оформлен (ещ? один див внутри, подложка и т.п.), и мы будем вынуждены менять расположение ноды-таба, видоизменять логику для отдельного случая (или для всех), чтобы уцепиться за нужный контейнер, сделав его родителем. То же самое касается посадочного места для табов, которое тоже может содержать ноды, и метод appendChild уже не будет уже таким однозначным. В конце концов, кроме основного контент-контейнера может быть дополнительный и т.д. Ж?сткая схема "таб плюс его родитель only на момент запуска" не сильно способствет масштабу... Не указан какой параметр? Формальный параметр функции или имеется в виду класс? В любом случае к моменту присвоения вы ещ? ничего не проверяете, а то, что выбрана последняя нода-таб - на мой вгляд характерый пример оплошности, когда ноды в массив собираются не в сво?м порядке, и об этом как-то забывается. Скажите, пожалуйста, в каком месте срипта вы работаете с "таргетом эвента"? Вс? равно не ясно, почему нельзя остановить постоянную проверку классов, нужна-то копеечная точка предыдущего состояния. Не ясно, почему при первичной инициализации нужно делать это дважды, сначала в одном месте, потом в другом (сбор массива), когда структура уже собрана и готова к употреблению. Извините, но не понял из этого объяснения, почему вы не используете уже приготовленные вами же обработчики. Не проще. Попробуйте сделать сортировщик под большой массив данных, станет очевидно, насколько интерпретаторы менее оптимальны при работе с деревом/нодами по сравнению с работой со "своими" данными. Где в ноде интерпретатор разместит кастомное свойство, какой объ?м данных для перебора там уже есть, каким алгоритмом и как быстро он достанет это свойство? Вс? это вопросы скорости, важнейшего фактора при сортировке. p.s. чтобы быть до конца понятым - несмотря на то, что соревнование "скрипт vs. скрипт" по моему глубокому убеждению вы слили по всем статьям, я поддерживаю вашу позицию относительно использования дивов и т.п.
-
s0rr0w, можно набить ещ? 150 постов про свой опыт, практические навыки, большие корпоративные прожекты под два с половиной браузера и т.д., кому как, а мне лично до одного места, кто стоит за ником, вся эта ерунда про важность коммерческих компромиссов вообще не греет и обычно появляется на свет, когда кончаются здоровые аргументы, плавали - знаем. Это публичный форум, который должен по большому сч?ту просвещать и учить программированию на javascript, и вас, и меня, всех, глупо отмахиваться от критики и полезного обсуждения под тем соусом, что мол "все вы здесь идиоты теоретики, один я умный практик, у которого вс? работает". Мои собственные убогие жалкие скрипты эпохи первого месяца знакомства с javascript тоже до сих пор работают, и что? Медальку мне на грудь? Неинтересно же это вс?, поиск лучшего решения всегда тянется за горизонт, иначе бы мы так и топтались на месте, называть стремление к идеалу абсурдом э... абсурдно. Вы бы для пользы дела взяли бы и разложили по полочкам логику своего скрипта, доказали бы свою правоту построчно, почему вы поступили в этом месте именно так, а не иначе. Могу даже подтолкнуть штрихами навскидку, чтоб начать - насколько масштабируемым является решение, когда нода-таб увязана с нодой-контентом своим первоначальным расположением, для чего переменной activeTab присвоено значение switchNodesList[ 0 ], для чего работает конструкция if ( !node.options ) {...}, зачем ноды-табы отсекаются по классу и собираются в массив дважды при инициализации, зачем собирать этот массив заново при каждом клике, когда можно сохранять данные о предыдущем состоянии, для чего вместо вызова уже готовых функций вы затеяли dispatchEvent и fireEvent?
-
Вместо того, чтобы подшлифовать одним микродвижением свой скрипт, вы дадите кодеру пояснения о нежелательности некоторых классов??? LOL Самое смешное (и вы это прекрасно знаете), что никаких пояснений и не было бы, откуда им взяться-то. Это же надо было знать. А у вас желчная отмазка вместо 'спасибо'. Надо же, стоило разжевать до каши, и первый настоящий проблеск. Логично. Не забудьте написать очередное пояснение кодеру. Про то, будет ли отловлен корректный window спрашивать не буду... Во-первых, это не опус, а самое примитивное обращение к собственной функции. Во-вторых, эта тема конкретно про этот идентификатор зачиналась скорее как иллюстративная ("кое-что из жизни бактерий"), если бы вы не превратили е? в разборку "а покажи, а докажи". В-третьих, показываю одного из тех, кто вызывает функции с помощью инлайн-обработчиков и совершенно ничего не знает об их особенностях - это s0rr0w. Было - "никаких граблей не вижу!", стало - "подумаешь, грабли!". Беда. Я вам про то, что скорость тут вообще не при делах, а вы опять про скорость. Не в этом же дело, ну, что, по-вашему do-while реализован на уровне движков сильно отлично от while? Конечно особенности кода, а кто про баги-то говорил? Ну, не работает скрипт у тех, кто соответствующим образом модифицирует юзерагент, ну, нельзя использовать валидные имена классов, ну, используется do-while, улетающий в вечный луп при нулевом индексе, ну, подвешены в воздухе конфликтные имена для IE, ну, размазан код в html, ну, логика полудохлая... Ничего страшного. И в критике нет ничего страшного. Из всего надо извлекать пользу, незачем ввязываться в соревнование, если организм не справляется с болезненной реакцией на негативные оценки. Являются синтаксическими ошибками? Эффектный финал. LOL
-
Обидно, что это не добавляет мне уважения, но, мама дорогая, s0rr0w, неужели без кода вам так сложно осо(при)знать проблему!? Через дефис в именах классов пишут на ура, это валидно, удобно (кому-то) и... просто существует в природе: http://builder.com.com/5100-6371_14-5286783.html http://www.stuffandnonsense.co.uk/archives...ions_table.html Если в имени класса есть дефис (content-wrapper, content-left и т.п.), то в javascript регулярное выражение, составленное на основе метасимвола b, может "разорвать" такое имя со всеми вытекающим последствиями. Учитывая то, что вы упорно не хотите в этом разобраться сами приведу часть алгоритма (ECMAScript 15.10.2.6 Assertion), обратите внимание на "sixty-three characters": The production Assertion :: b evaluates by returning an internal AssertionTester closure that takes a State argument x and performs the following: 1. Let e be x's endIndex. 2. Call IsWordChar(e-1) and let a be the boolean result. 3. Call IsWordChar(e) and let b be the boolean result. 4. If a is true and b is false, return true. 5. If a is false and b is true, return true. 6. Return false. The production Assertion :: B evaluates by returning an internal AssertionTester closure that takes a State argument x and performs the following: 1. Let e be x's endIndex. 2. Call IsWordChar(e- 1) and let a be the boolean result. 3. Call IsWordChar(e) and let b be the boolean result. 4. If a is true and b is false, return false. 5. If a is false and b is true, return false. 6. Return true. The internal helper function IsWordChar takes an integer parameter e and performs the following: 1. If e == -1 or e == InputLength, return false. 2. Let c be the character Input[ e]. 3. If c is one of the sixty-three characters in the table below, return true. a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 _ Как видите, дефиса в этом перечне нет. Вот вам и пример (если теория не убеждает) того, как дефис не считается частью слова и, выбранный для решения задачи метасимвол, мешает выполнению этой самой примитивной задачи: var s = 'preved text preved-preved text'; s = s.replace(/bprevedb/g, 'medved'); alert(s); //-> medved text medved-medved text Теперь я думаю, вы сможете вс? это переварить, сделаете выводы и перестанете просить от меня решения, оно элементарное, ваша "библиотека" должна к нему прийти. Надеюсь, ответил, поехали дальше... Как маленького нужно за ручку что ли водить? С картинками? Запускаем скрипт в альфе оперы или в альфе фокса (Gran Paradiso), кликаем по спану и видим следующее (скрин моего воображения, не фотошоп, гы): Это означает, что вместо своей собственной функции с именем getElementsByClassName вы видите на экране одноим?нную родную функцию. Почему? Ведь вы требуете в алерте свою функцию, а не метод document.getElementsByClassName? Ответа не дождусь - ...а вс? потому, что автор скрипта (я, допустим) не знает про то, что текст атрибута в инлайн-обработчиках вне стандартов преобразуется в функцию, эта функция вне стандартов имеет трудноуловимый scope chain, в этой scope chain вне стандартов может быть трудноуловимый(ые) объект(ы), например, сам объект, к которому привязан обработчик, или document и т.д. Отсюда автор скрипта (я, допустим), как любитель использовать инлайн-обработчики и любитель одновременно с этим использовать определ?нные идентификаторы в глобальном контексте (которые могут оказаться в scope chain инлайн-обработчика), должен это вс? как минимум знать. Обладая знаниями, он знает грабли и вообще их избегает или корректирует свою тактику. Если же он этого не знает, не видит, то ему бы постесняться. Надеюсь, ответил, поехали дальше... Дважды ответил, что скорость циклов разнится от браузера к браузеру и что не в этом суть. Сейчас уже трижды. Используемая вами конструкция do-while отличается от прочих тем, что в соответствии с алгоритмом правая от do часть исполняется вне условий, при определ?нных обстоятельствах (замечу, не гипотетических, а реально часто встречающихся) loop может и не завершиться. Кроме того, реверсивный перебор потребовал от вас ручного уменьшения индекса на единицу - это лишний код, лишний контроль за сч?том, неудобно для работы "коллекциями", массивами и т.п. Вс? это вместе - причины такой малой распростран?нности do-while в качестве иструмента обычного перебора, если уж использовать, так только к месту, понимая алгоритм. Чего не наблюдаю. Что касается скорости, то вы ошибочно преувеличиваете роль самой конструкции, хотя вся соль в итерации снизу к нулю, вот я вам набросал код, чтобы было понятно, как одна и та же идея в общем-то одинаково работает в разных конструкциях: <html> <body> <script type="text/javascript"> var i, t1, t2, t3 , t4; t1 = new Date(); // 'do-while' loop i = 1e6; do { i - 1; } while (--i); t2 = new Date(); // 'while' loop i = 1e6; while (i--) { i; } t3 = new Date(); // 'for' loop i = 1e6; for (; i--; ) { i; } t4 = new Date(); alert(['do-while->', (t2 - t1), 'while->', (t3 - t2), 'for->', (t4 - t3)].join(' ')); </script> </body> </html> Результат говорит о том, что в среднем скорость равная, копеечную разницу во внимание не принимаю (хотя do-while местами даже проигрывает, гы), но, как говорилось выше, дело в другом: Надеюсь и тут я ответил вполне конкретно... Правильно сомневаетесь, способностей у меня может и мало, зато в этих тяж?лых жизненных обстоятельствах у меня ещ? хватает сил, чтобы : a) не увеличивать своим кодом общий объ?м мирового javascript-трэша; б) не считать себя командным результативным космокодером; б) не лезть в спор без штанов. Удачи.
-
s0rr0w, дружище, я участвую в дискуссиях именно так, как мне возжелается, с кодом или без, с примером или без, и я вс?-таки сильно надеюсь, что вы обратили внимание на мои комментарии/замечания, чтобы лишний раз не подозревать меня в том, что код ваш я не посмотрел. Посмотрел. Не сотрясайте воздух, отсылая меня на перечитку плиз. Про то, как отграничивать класс от класса (как и вообще слова) с помошью регулярных выражений вам нужно просто банально знать, обратитесь за примером к ближайшим к вам большим фреймворкам, если лень или недосуг изучать доки. Правильный пример определения IE вам не нужен, опирайтесь на соответсвующие проверки нужного по месту свойства. Как минимум. Скорость do-while разнится у браузеров, говорю ещ? раз, стараясь побороть ваше обобщение. Суть же дела не в скорости, а в бездумном использовании конструкции не к месту, как же вы упрямо не понимаете этого. Чтобы одновременно рассеять ваши заблуждения по поводу inline-обработчиков и т.н. интерфейса документа тупо приведу пример: <html> <body> <script type="text/javascript"> // определим свою функцию и потом посмотрим на не? в inline-обработчике, кликнув по спану var getElementsByClassName = function () { alert('preved medved!'); }; </script> <span onclick="alert(getElementsByClassName);">test</span> </body> </html> Скачайте, к примеру оперную альфу - http://my.opera.com/desktopteam/blog/ - и понаблюдайте. Если лень скачивать, то замените метод на любой другой, ныне существующий, чтобы осознать потенциальные грабли. WingedFox, между нами девочками, ведь этот скрипт, который "наиболее практичное решение, идущее из опыта" - это же почти что трэш из девяностых, некачественный со всех сторон, безыдейный, с конкретными ошибками, неорганизованный, просто откровенно слабый по форме и содержанию... почему вы его защищаете для меня осталось загадкой. Я ещ? понял бы про защиту позиции. Но скрипт-то ведь вообще никакой. Абстрагируйтесь от AKSa и от своей нелюбви к теории. По чесноку?