Search code examples
javascriptjqueryinternet-explorer-9

Object doesn't support property or method 'append' in IE9


this script is working in firefox or chrome but only gets half way in IE9 which is the top browser for our websites.

the problem im getting is its throwing this error.

SCRIPT438: Object doesn't support property or method 'append' calc_ajax.js, line 26 character 21

on this line: item.append(link);

and im stuck why. any help would be appreciated.

$(document).ready(function(){
$('.first a.btn').click(function(){
    $('.first a.active').removeClass('active');
    $(this).addClass('active');
    $('.second .title').addClass('active');

    var id = $(this).data('cat-id');

    var wrap = $('<div>');

    $.ajax({
        url:    script_url,
        type:   "post",
        data: {"cat": id},
        dataType: "json"
    }).success(function(result){
        if(result.status == "ok"){
            $.each(result.data, function(i, elem){
                item = $("<div class='body-area'>").append($("<img src='" + elem.image + "'>"));
                link = $("<a href='#results' class='btn'>");
                link.text(elem.name);
                link.data('subcat-id', elem.id);
                item.append(link);

                wrap.append(item);

            });
            $('.second .body').html(wrap).slideDown('fast');
        }
    });
});

$('.second a.btn').live('click', function(){
    $('.second .body-area.active').removeClass('active');
    $(this).parent().addClass('active');

    var sub_id = $(this).data('subcat-id');        

    $.ajax({
        url:    script_url,
        type:   "post",
        data: {"subcat": sub_id},
        dataType: "json"
    }).success(function(result){
        if(result.status == "ok"){
            $('.third .title').text(result.data.title);
            $('.third .body').html(result.data.body);
            $('.third').slideDown('fast'); 
        }
    });        
});

});


Solution

  • window.item is a special method in Internet Explorer and since the code you pasted wasn't declaring a local variable item it was trying to reassign a native method in IE. IE didn't allows the reassignment to happen so you didn't really get the jQuery object you were expecting in the item variable and therefore the append method isn't available.

    The easiest way to fix the code is to add a var right before you use the item variable. I've thrown together a jsFiddle showing how it fixes the issue in IE http://jsfiddle.net/httyY/

    $.ajax({
        url:    script_url,
        type:   "post",
        data: {"cat": id},
        dataType: "json"
    }).success(function(result){
        if(result.status == "ok"){
            $.each(result.data, function(i, elem){
                var item = $("<div class='body-area'>").append($("<img src='" + elem.image + "'>"));
                var link = $("<a href='#results' class='btn'>");
                link.text(elem.name);
                link.data('subcat-id', elem.id);
                item.append(link);
    
                wrap.append(item);
    
            });
            $('.second .body').html(wrap).slideDown('fast');
        }
    });