Ответы пользователя по тегу JavaScript
  • Почему try..catch не отлавливает ошибку?

    Проблема в том, что XMLHttpRequest выкидывает только два исключения:

    exception XMLHttpRequestException {
      unsigned short     code;
    };
    const unsigned short NETWORK_ERR = 101;
    const unsigned short ABORT_ERR = 102;


    NETWORK_ERR — ошибка сети.
    ABORT_ERR — пользователь отменил запрос.

    Ещё один немаловажный момент: NETWORK_ERR и ABORT_ERR не выкидываются в асинхронном режиме.

    Всё остальное отлавливаться не будет, и нужно писать свой обработчик, который, например, будет реагировать на код ответа 404 от сервера и т.д.

    function test(data) {
     // taking care of data
    }
    
    function handler() {
     if(this.readyState == 4 && this.status == 200) {
      // so far so good
      if(this.responseXML != null && this.responseXML.getElementById('test').firstChild.data)
         // success!
       test(this.responseXML.getElementById('test').firstChild.data);
      else
       test(null);
     } else if (this.readyState == 4 && this.status != 200) {
      // fetched the wrong page or network error...
      test(null);
     }
    }
    
    var client = new XMLHttpRequest();
    client.onreadystatechange = handler;
    client.open("GET", "test.xml");
    client.send();


    Здесь function handler() — обработчик, а client.onreadystatechange = handler; — привязка этого обработчика к экземпляру XMLHttpRequest.

    Просто ответ от сервера с кодом «404 Страница не найдена» не считается за NETWORK_ERR, потому что сервер ответил на запрос. А то, с каким он кодом ответил — это уже на другом уровне обрабатывается.
    Ответ написан
  • Добавить случайны класс из массива без повторений jQuery?

    var headsArray = ['random_head_1','random_head_2','random_head_3','random_head_4','random_head_5'];
    
    for (
        var j, x, i = headsArray.length; 
        i; 
        j = parseInt(Math.random() * i), x = headsArray[--i], headsArray[i] = headsArray[j], headsArray[j] = x
    );
    
    $('#head_1,#head_2,#head_3').each(function(index){
        $(this).addClass(headsArray[index]);
    });


    For, на всякий случай уточню, описан без тела — все операции в круглых скобках происходят, где задаются условия цикла. Я просто для удобочитаемости это разнёс на несколько строк.
    Ответ написан
  • Почему получается неверный результат RegExp в javascript?

    r.test("абвabc"), кстати, тоже покажет true. У вас регулярка написана так, что она возвращает true, если в строке есть хотя бы один символ из [A-Za-z0-9], но она совсем не запрещает использовать кроме разрешённых символов остальные. Если в куче неразрешённых символов будет хотя бы один разрешённый, она вернёт true. Нужно по краям регулярки добавить символы начала и конца строки:

    var r = new RegExp("^[A-Za-z0-9]+$");
    Ответ написан
  • Почему не работает javascript, если к домену приписать "www.", и как выйти из положения?

    Если вы посмотрите содержимое страницы, которая открывается с www, то в теге «BASE» будет прописан адрес без www. Это такая особенность опенкарта. В кнопке «заказать» адрес выглядит как «index.php?route=бла-бла-бла». Так как у этого адреса нет в начале знака «/», браузер возьмёт для построения полного адреса значение из BASE. Тогда получается, что на странице «http://www.site.ru» ссылка для кнопки «заказать» выглядит как «http://site.ru/index.php?route=бла-бла-бла». И это уже кросс-доменный запрос, который в вашем случае не работает.

    Как решение, все страницы должны открываться по одному домену. Нужно сделать перенаправление с www-адресов на адреса без www с помощью .htaccess.

    RewriteCond %{HTTP_HOST} ^www.site.ru
    RewriteRule (.*) http://site.ru/$1 [R=301,L]


    Это будет более простое решение, чем исправлять адреса в движке Opencart, так как я находил там около 90 адресов, которые в таком случае придётся править. Вы, допустим, правкой адреса поправите работу кнопки «заказать», но от этого не начнут работать кнопки «добавить в желаемое», «добавить в сравнение» и т.п. Там куча таких моментов. Так что, настройка перенаправления в .htaccess позволит решить сразу все эти проблемы.
    Ответ написан
  • Как передать значение переменной из php-скрипта в javascript?

    Первый способ: Отдельный AJAX-запрос к PHP-файлу, который вернёт что-нибудь вроде JSON-данных, которые потом будут доступны из JS.

    Второй способ: В PHP-файле можно определить какую нибудь переменную во время генерации страницы, а потом из любых скриптов к ней обращаться. Например так:

    PHP-файл:
    <?php
    $a = 'text for js_variable';
    ?>
    <!DOCTYPE html>
    <html>
      <head>
        <script>
          //Определяется переменная, которая будет доступна для 
          // всех JavaScript, подключаемых на данной странице
          var js_variable = '<?php echo $a; ?>';
        </script>
        <!-- 
          В файле /scripts/myscript.js происходит обращение 
          к переменной js_variable 
        -->
        <script src="/scripts/myscript.js"></script>
      </head>
      <body>blah-blah-blah</body>
    </html>


    Файл /scripts/myscript.js:
    // Выскочит алерт с текстом «text for js_variable».
    alert(js_variable);


    Вот. В HEAD-части HTML-страницы вы определяете переменную, которая будет доступна для остального JS-кода. Главное — нужно её определять до того, как будут подключены скрипты, которые будут её использовать.

    Третий способ: Если ваш web-сервер — Apache, то можно добавить в .htaccess в корне сайта такие строки:
    AddType application/x-httpd-php .js
    AddHandler x-httpd-php5 .js
    
    <FilesMatch "\.js$">
    SetHandler application/x-httpd-php
    </FilesMatch>


    Тогда вы сможете прямо в JS-файлах выполнять PHP-код. Но выполняться он будет только в тех JS-файлах, которые находятся в папке с сайтом. Если будут загружаться скрипты со сторонних ресурсов, там PHP-код работать не будет.
    Ответ написан
  • Как вырасти из верстальщика в JS-программиста?

    «Гордое звание» — это когда есть награды, дипломы, сертификации и прочее. Вообще, к слову, я уже лет 5 пишу на PHP почти каждый день и всё равно не считаю себя программистом. Возможно, когда у меня будет диплом от Zend, я буду думать, что я что-то вроде программиста.

    Если вам шашечки нужны, то сдавайте всякие_сертификации, если же нужно ехать, то лучше просто писать код и не загоняться, гордое у вас звание или нет.

    Upd. А вообще, извините за ёрничество. Возможно вам помогут некоторые мысли на эту тему:

    Выражение «просто пиши код», на самом деле, — это квинтэссенция. Просто некоторым людям становится неохота несколько раз разными словами описывать одно и тоже, и родился такой концентрат — который, как Yupi, куда можно «просто добавить воды», и получится готовый продукт. По сути, большую часть советов можно свести к этой одной фразе [пиши код]. Можно (даже нужно) для развития прочитать кучу книжек, но если вы мысли из этих книг не оформите кодом, толка от этого развития не будет, и программистом вы не станете. Мышцы будут развиваться только в том случае, если вы их напрягаете, а не только читаете инструкции, как их правильно напрягать. Инструкции помогут это делать правильно, но без практики не будет никакого развития.

    Для постоянного развития нужен постоянный поток работы с новыми необычными заданиями. В веб-студиях обычно с новыми необычными заданиями очень туго бывает. Моё мнение, что долгая работа в веб-студии — дорога, которая убивает любознательность начисто. Через некоторое время работа становится настолько однотипной, что, кажется, можно бота написать, который будет за вас её делать. Новые задачи, которые напрягают мозги и не позволяют пользоваться готовыми решениями — очень хороший движитель, но за целый день делания однотипной работы в веб-студии, самостоятельно искать новые задачи становится неохота — всё же есть такая штука как оффлайн и, вообще, банальная усталость и тупиздняк от однотипной работы.

    Когда вы пользуетесь каким-нибудь готовым решением, полезно заглядывать к нему под капот. У меня примерно похожая история была с Opencart. Я в какой-то момент очень сильно начал загоняться процессами, происходящими на этапе инициализации движка и отдельными классами, входящими в его состав. В результате родилось решение, которое позволило использовать PDO, вместо mysql_*, при этом, оно хорошо работало на боевых серверах и не ломало модули, где использовался старый подход. По сути, особенно заметной разницы в быстродействии не стало, но лично для меня это был хороший буст. (Я потом ещё загнался тем, чтобы выдрать из опенкарта костяк и использовать его в качестве своеобразного бутстрапа, на котором можно собрать любой сайт. Вряд ли я всё это дело буду где-то публиковать и использовать, но, опять же, лично для меня это было полезным для развития процессом.)

    После того, как вы сделали работу, тысячу раз её перепроверьте и сделайте кучу ненужных замеров производительности и потребления ресурсов. Попробуйте всё это дело как-нибудь оптимизировать. Например, сдали работу — всех всё устраивает, денег заплатили и т.п. В этой ситуации нужно загнаться тем, чтобы снизить потребление памяти на 10% процентов. Никто не заметит, что вы огромную работу сделали, чтобы снизить потребление, но это будет лично для вас практика. Можно сделать какую-нибудь ненужную работу, вроде выкидывания из исходников jQuery всех функций, которые вы никогда не будете использовать. Или, наоборот, можно что-то своё добавить. По сути, постоянное развитие — это как жизнь киргизского комсомольца, который постоянно ищет себе проблемы, чтобы потом их героически преодолевать.

    А ещё... а ещё... У меня очень большая куча мыслей — я наверное когда-нибудь напишу книжку, чтобы все их аккуратно уложить в голове.

    Первый шаг, который нужно сделать: заняться каким-нибудь личным проектом, где вы сможете развивать свои навыки (и, даже, не обязательно его выпускать за пределы локальной машины). Что угодно. Например, калькулятор с какими-нибудь расширенными функциями. Тут как раз на вёрстку будет минимальный упор. В этом проекте нужно отказаться от использования любых сторонних библиотек и изобретать свои решения. Например, вам хочется делать выбор элементов из DOM простыми селекторами с синтаксисом, похожим на jQuery, смотрите, как это реализовано в jQuery и пишите с нуля свой аналог. Главное не копипастить, а писать самостоятельно. Пусть будет похоже, но будет не точная копия. Вы в процессе будете напрягать мозги и развиваться. Будете часто лазать в документацию по языку. У вас появится понимание не многочисленных фреймворков, а именно чистого нативного кода и функций. И мыслить вы начнёте не категориями «какую функцию jQuery можно использовать», а категориями «какой алгоритм сюда можно придумать».

    Это всё сравнимо с обычной грамотностью и умением выражать мысли — чтобы развиваться, нужно читать и писать. В любом случае, писать код всё равно придётся. Без этого программистом не станешь.
    Ответ написан