2009-06-22 7 views
0

Ich habe ein benutzerdefiniertes jQuery-Skript, das in allen Browsern außer einem funktioniert (Explorer 6, 7, 8?).jQuery-Fehler, nur mit Explorer

Der Zweck des Codes ist, damit ein Benutzer mehr Formularfelder, um ihre Form hinzuzufügen (wenn der Benutzer mehr als eine Telefonnummer möchte oder mehr als eine Web-Adresse).

Es ist so geschrieben, dass jeder „A“ Tag mit einer Klasse „add“ ist gebunden an die jQuery-Funktion enthält.

Der Fehler Ich erhalte ist wie folgt:

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

HTML-Formular: (bitte beachten Sie, dass ich weiß, dass die Formular-Tags sind nicht hier, das ist ein kleiner Teil einer größeren Form.

<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> 

Und nun die jQuery.

Es auf einer Seite sollte ein ul enthaltend mindestens eine li Alle lis sollte eine haben bestimmte Klasse wie "Telefon" oder "Adresse" Nach dem/ul Es sollte ein Link mit einer passenden ID, wie "addPhone" oder "addAddress" sein. Das href-Attribut sollte "#" sein.

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)); 
    }); 
}); 

Antwort

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

Wenn ich ändern "this.id [3] .tolowercase()" zu "this.id.charAt (3) .tolowercase()" erhalte ich: „Fehler: '0' ist null oder kein Objekt " – superUntitled

+2

Anscheinend in IE Zeichenfolge [Index] ist nicht definiert. Für Ihren zweiten Fehler wäre das theClass.charAt (0) statt der Klasse [0]. Das gleiche gilt für überall wo Sie stringName [Nummer] verwenden. – Sean

1

ändern Sie dieses ...

this.id[3] 

Um dies zu ...

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

substr() ist veraltet. – James

+0

können Sie einen Link zu der Dokumentation geben, dass substr() veraltet ist? – jcoffey

+0

Die substr Funktion ist sicherlich nicht veraltet, noch wird es jemals sein. –

1

So etwas wie dies erreicht das gleiche beeinflussen, sondern macht eine stärkere Nutzung von jquery, wodurch Vermeiden Sie die Crossbrowser-Kompatibilitätsprobleme, die so häufig bei javascript auftreten:

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()); 
    }); 
}); 
Verwandte Themen