• Почему не срабатывает computed свойство?

    notiv-nt
    @notiv-nt
    Как ваше ничего? Да, моё тоже
    valid: false к каждому в form[]
    и if(!item.valid){ знаком не ошиблись?

    5d81121f394a4466652655.png
    form.valid вы не ставите свойство реактивным, так что надо изначально его ставить в data
    Ответ написан
    8 комментариев
  • Почему [] < {} сравниваются как строки? А [] < 1 как числа?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Во втором случае потому, что один из аргументов имеет примитивный тип Number, объект приводится к нему же.

    В первом сравниваются два объекта. При попытке привести их к числу сначала вызывается метод valueOf(), который для обоих возвращает не примитив (тогда бы сравнивали эти примитивы) а this, себя же, объект. Поэтому во вторую очередь вызывается метод toString(), который возвращает примитивы: пустую строку для массива и "[object Object]" для объекта.

    Upd. вот статья, раскрывающая глубины: Преобразование типов в JavaScript

    отрывок
    В общих чертах алгоритм выглядит следующим образом:
    • Если входящее значение уже является примитивом, ничего не делать и просто вернуть его.
    • Вызвать input.toString(), если результат примитив — вернуть его.
    • Вызвать input.valueOf(), если результат примитив — вернуть его.
    • Если ни один из методов не вернул примитив — бросить ошибку TypeError.

    При численном преобразовании сначала вызывается метод valueOf(), а уже затем toString(). При строковом преобразовании наоборот — сначала происходит вызов toString(), а уже потом valueOf().

    Большинство встроенных типов не имеют метода valueOf или же имеют valueOf, который возвращает свой собственный объект this, который игнорируется, так как this не является примитивом. Вот почему численное и строковое преобразование в большинстве случаев работает одинаково — оба в конечном итоге вызывают метод toString().

     
    Мало инфы в MDN
    См. правила преобразования типов:
    Когда происходит преобразование типов (т.е в случаях использования нестрогого сравнения), JavaScript преобразует типы String, Number, Boolean и Object, следующим образом:

    • При сравнении числа (Number) и строки (String), JavaScript пытается преобразовать числовой литерал строки в число. Затем полученное число округляется до ближайшего возможного значения типа Number.
    • Если один из операндов является логическим (Boolean), то он преобразуется в значение типа (Number). Если значение логического операнда равняется истине (true), то значение этого операнда преобразуется в 1. Иначе - в 0 (ложь / false).
    • Если объект сравнивается с числом или строкой, JavaScript пытается получить значение по умолчанию для данного объекта. Полученное значение преобразуется в примитив, посредством методов valueOf() и toString(). Если преобразовать объект не удается, генерируется ошибка времени выполнения.
    • Обратите внимание на то, что объект преобразуется в примитив, если, и только если, второй операнд является примитивом. В ином случае, операнды сравниваются как объекты, соответственно, операция сравнения вернет истину в том случае, если внутренние ссылки обоих объектов ссылаются на один и тот же объект в памяти.



    Там же рассматривают особобый случай объекта строки new String('foo'); по сравнению с простой строкой.
    Ответ написан
    2 комментария
  • Не могу сделать адаптивное меню?

    @vetsmen
    $('.nav_trigger').click(function(e){
      $('.nav_menu').stop().slideToggle(300);
    });
    Ответ написан
    Комментировать
  • Как получить список альбомов пользователя flickr?

    @aslanovich
    Web/Art Designer. Front+Back-end Geek
    Зайдите на сайт, прочтите документацию, в чем problem ?
    85028934ce6440ddb901439e55bb8ea2.jpg
    _____
    807ad885f1114279807e5c7c4e9ad1b3.jpg
    _____
    69127ad2d3434fa49a41ea69296bd1f3.jpg

    __
    Flickr API
    Ответ написан
    Комментировать
  • Как передать в DOM html код(в виде обычного текста)?

    @Interface
    Хм... Если я вас правильно понял, то ваша проблема в том, что браузер вставляет ваш фрагмент кода "<img src="+img+" />" как картинку, а не как код этой картинки. Далее исхожу из того, что это ваша проблема. Если нет - попробуйте переформулировать вопрос с читого листа.

    Ниже есть 5 способов решения этой проблемы (каждое отмечено комментарием// Решение №), а пока предлагаю разобраться почему так происходит:
    // Здесь jquery парсит конструкцию и вставляет ее как HTML node. 
    // Причем вставляет он в итоге 2 тега: img и br
     $('<img src="' + img + '"></br>').appendTo('.body');


    Нам нужно сказать браузеру: вставь это как текст
    Для этого есть говорящие свойство .textContent - https://developer.mozilla.org/ru/docs/Web/API/Node...
    Также есть метод jQuery: text() - api.jquery.com/text
    /*
     * это просто перепишет все 
     * содержимое в цикле, в итоге в конце 
     * останется только одна запись
     */
    $('.body').text('<img src="' + img + '"></br>')
    // можно попробовать так:
    $('.body')[0].textContent += '<img src="' + img + '"></br>'
    /*
     * это не лучшее решение, 
     * потому как потеряется вся разметка
     * для остальной части страницы,
     * но это приемлимо (не считая оверхеда)
     * если весь текст лежит в одном блоке:
     */
     $('.img-links')[0].textContent += '<img src="' + img + '"></br>'
    // тем не менее, не лучший подход на мой взгляд


    Можно собрать все фрагменты кода и вставить один раз:
    ...
    // Решение 1
    success: function(data) {
    	var parts = [];
        data.response.forEach(function(item) {
            var img = item.size;
    
            (!(img)) ? img = item.src_big : img; // проверяем, есть ли самое большое разрешение у фотографии
            parts.push('<img src="' + img + '"></br>');
        });
        $('.img-links').text(parts.join(''));
    }
    ...


    Здесь вроде все ясно. Зайдем с другой стороны:
    Если бы я захотел изначально показать на странице текст вида <img src="http://my.awesome.link">,
    то использовть js было бы неудобно. Как я могу сказать браузеру "не превращай это в DOM"?
    Я вижу 2 подхода:
    - расположить этот текст в специальном теге htmlbook.ru/html/xmp (или можно даже в )
    - заescape'ить служебные символы: "<" -> "&lt;", ">" -> "&gt;"

    1) подход:
    ...
    // Решение 2
    $('<xmp><img src="' + img + '"></xmp>').appendTo('.body');
    // пожалуй, один из самых простых способов
    ...

    2) подход:
    ...
    $('&lt;img src="' + img + '"&gt;').appendTo('.body'); // не сработает
    // потому что jQuery не умеет вставлять текстовые ноды
    // или избегает этого, вместо этого вставится первый валидный тег
    // это можно решить - ввести контейнер:
    
    
    // Решение 3
    $('<span>&lt;img src="' + img + '"&gt;</span><br>').appendTo('.body'); 
    ...

    Можно ли избежать писания в ручную этих страшных &lt; / &gt;?
    Можно!
    Используя js-функцию для эскейпинга: например отсюда stackoverflow.com/questions/5499078/fastest-method...
    Но тут скорее напрашивается другое решение, близкое к тому, с чего мы начали:
    Можно использовать .textContent / .text() - чтобы за нас эскейпил браузер / jQuery:
    ...
    // Решение 4
    $( $('<span/>').text('<img src="' + img + '"><br>') ).appendTo('.body'); 
    ...


    И еще одно весьма изящное решение, которое я, надо признаться подсмотрел на StackOverflow ( stackoverflow.com/questions/6588630/jquery-append-text ):
    Мы можем сами сказать браузеру, что нам нужна текстовая node и передать ее в jquery:
    ...
    // Решение 5
    $('.body').append(document.createTextNode('<img src="' + img + '">'));
    Ответ написан
    1 комментарий