2009-06-22 27 views
0

我有一个自定义jQuery脚本,在所有bowsers工作正常,但一个(Explorer 6中,7,8?)。jQuery的错误,只能用资源管理器

代码的目的是允许用户将多个表单字段添加到其形式(如果用户想要不止一个电话号码或一个以上的网络地址)。使得具有任何类“A”的标签含有“添加”这是写

被绑定到jQuery函数。

我得到的错误是:形式的

/////////////////////////////// 
Line: 240 
Char: 5 
Error: 'this.id.3' is null or not an object 
Code: 0 
/////////////////////////////// 

HTML: (请注意,我知道该窗体标签是不是在这里,这是一个更大形式的一小部分。

<ul> 
<li> 
    <ul> 
    <li class="website"> 
     <input id="website1_input" name="website[1][input]" type="text" value="www.test.org"/> 
     <input type="checkbox" id="website1_delete" name="website[1][delete]" class="element radio" value="1" /> 
     <label for="website1_delete">Delete</label>  
    </li> 
    </ul> 
    <a href="#" id="addWebsite">add another website</a> 
    </li> 
</ul> 

现在jQuery的:

应该有一个页面上包含至少一个李 所有LIS的UL应该有一个某一类像“手机”或“地址” 后/ UL应该有一个匹配ID的链接,像 “addPhone”或“addAddress”。 href属性应该是“#”。

function makeAddable(theClass) { 
    $('#add' + theClass[0].toUpperCase() + theClass.substr(1)).click(function() { 
    var numItems = $('.' + theClass).length; 
    var newItem = $('.' + theClass).eq(numItems - 1).clone(); 
    newItem.find('input[type=text]').val(''); 
    numItems++; // number in the new IDs 

    // keep ids unique, linked to label[for], and update names 
    // id & for look like: phone1_type, phone1_ext, phone13_p1, etc. 
    // names look like: phone[1][type], phone[1][ext], phone[13][p1], etc. 
    newItem.find('[id^=' + theClass + ']').each(function(i) { 
     var underscoreIndex = this.id.indexOf('_'); 
     var idNum = this.id.substring(theClass.length, underscoreIndex); 
     this.id = this.id.replace(idNum, numItems); 
    }); 
    newItem.find('[for^=' + theClass + ']').each(function(i) { 
     var jqthis = $(this); 
     var forAttr = jqthis.attr('for'); 
     var underscoreIndex = forAttr.indexOf('_'); 
     var idNum = forAttr.substring(theClass.length, underscoreIndex); 
     forAttr = forAttr.replace(idNum, numItems); 
     jqthis.attr('for', forAttr); 
    }); 
    newItem.find('[name^=' + theClass + ']').each(function(i) { 
     var jqthis = $(this); 
     var nameAttr = jqthis.attr('name'); 
     var bracketIndex = nameAttr.indexOf(']'); 
     var idNum = nameAttr.substring(theClass.length + 1, bracketIndex); 
     nameAttr = nameAttr.replace(idNum, numItems); 
     jqthis.attr('name', nameAttr); 
    }); 

    $(this).prev('ul').append(newItem); 
    return false; 
    }); 
} 

// Automatically enable all <a href="#" id="addSomething"> links 
$(function() { 
    $('a[href=#][id^=add]').each(function(i) { 
    makeAddable(this.id[3].toLowerCase() + this.id.substr(4)); 
    }); 
}); 

回答

4
this.id.charAt(3).toLowerCase() 
+0

当我改变 “this.id [3] .toLowerCase()” 到 “this.id.charAt(3).toLowerCase()” 我得到:“错误: '0' 是空值或不未定义对象” – superUntitled 2009-06-22 19:22:55

+2

显然,在IE串[指数]。因此,对于第二个错误,它将是theClass.charAt(0),而不是theClass [0]。你也可以使用stringName [number]。 – Sean 2009-06-22 19:30:57

1

改变了...

this.id[3] 

要这个......

this.id.substr(3, 1); 
1

像这样的事情会达到同样的影响,但使更多的使用jQuery的,从而避免了跨浏览兼容性问题与JavaScript如此普遍:

function addInput(inputType) { 
    var items, itemNumber, lastItem, newListItem, parentList, inputName, inputId, deleteId, thisId; 

    items = $('li.' + inputType); 
    itemNumber = items.length + 1; 
    lastItem = $(items[itemNumber-2]); 
    newListItem = lastItem.clone(); 
    parentList = lastItem.parents('ul:first'); 

    inputId = inputType + itemNumber + '_input'; 
    deleteId = inputType + itemNumber + '_delete'; 

    $(':input', newListItem).each(function() { 
     inputName = $(this).attr('name').replace(/\[\d*\]/, '['+itemNumber+']'); 
     thisId = $(this).attr('id').match(/_delete/) ? deleteId : inputId 

     $(this) 
      .val('') 
      .removeAttr('checked') 
      .attr('id', thisId) 
      .attr('name', inputName) 
     }).end() 
     .find('label').attr('for', deleteId).end() 
     .appendTo(parentList) 
    ; 
} 

$(function() { 
    $('a[href=#][id^=add]').live('click', function() { 
     addInput(this.id.substr(3).toLowerCase()); 
    }); 
});