Codebits
that rock!

Posts tagged with "js"

Feb 07, 2013

jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...: fix

posted by varnie • Tags: jsShow comments

При использовании jQuery плагина jCarousel в IE8 (будь он проклят трижды) словил баг:

“Сообщение: jCarousel: No width/height set for items. This will cause an infinite loop. Aborting…”.

Несмотря на то, что закастомайзенный класс ul/li карусельки имел явно прописанные CSS-аттрибуты width и height, IE8 упорно делал вид что не видит их, отсюда и баг.

Кто натолкнулся на этот баг, вот готовое решение: наряду со своими кастом-стилями прописать дефолтный “.jcarousel-list li { height: 39px; width: 44px; }”, где значения, разумеется, должны быть вашими.

Надеюсь, кому-нибудь эта заметка пригодится.

Oct 16, 2012

JavaScript: hiding class implementation

posted by varnie • Tags: jsShow comments

Открыл для себя простой удобный способ спрятать реализацию класса в JavaScript. Сначала покажу код:

var myFooObj = (function(){

    var FooClass = function() {};
    FooClass.prototype = { 
        //some data
    };

    return new FooClass(); 
})();

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

var myFooObj = (function(val){

    var FooClass = function() {}; 
    FooClass.prototype = { 
        value: val
    };

    return new FooClass(); 
})(43);

console.log(myFooObj.value); //43

Здесь уже сработает механизм замыканий.

Мы можем пойти дальше и реализовать наследование:

var myChildObj = (function(){

    var ParentClass = function() {}; 
    ParentClass.prototype = { 
        //some data
    };

    function extendsClass(childClass, parentClass, isRewrite) {
        for(var property in parentClass.prototype) {
            if (isRewrite || 
               (!isRewrite && 
                !isDefined(childClass.prototype[property]))) {                         
                childClass.prototype[property] = parentClass.prototype[property];
            }
        }

        childClass.prototype.parent =  parentClass.prototype;
    }

    var ChildClass = function() {}; 
    ChildClass.prototype = {
        //some data
    }

    extendsClass(ChildClass, ParentClass, false);
    return new PhotoGallerySingle(); 
})();

Проблема всплывает в случае если имплементации классов слишком большие. В этом случае по-просту будет неэстетично постить “жирные” имплементации в одну функцию, но все же, вариант рабочий.

Fork me on GitHub