Poniższa funkcja działa dobrze w Opera, Firefox i Chrome. Jednak w IE8 zawodzi z if ( allowed.indexOf(ext[1]) == -1)
części.
Czy ktoś wie dlaczego? Czy jest jakaś oczywista pomyłka?
function CheckMe() {
var allowed = new Array('docx','xls','xlsx', 'mp3', 'mp4', '3gp', 'sis', 'sisx', 'mp3', 'wav', 'mid', 'amr', 'jpg', 'gif', 'png', 'jpeg', 'txt', 'pdf', 'doc', 'rtf', 'thm', 'rar', 'zip', 'htm', 'html', 'css', 'swf', 'jar', 'nth', 'aac', 'cab', 'wgz');
var fileinput=document.getElementById('f');
var ext = fileinput.value.toLowerCase().split('.');
if ( allowed.indexOf(ext[1]) == -1)
{
document.getElementById('uploadsec').innerHTML = document.getElementById('uploadsec').innerHTML;
alert('This file type is not allowed!');
}
}
Odpowiedzi:
Wersje IE przed IE9 nie mają
.indexOf()
funkcji dla Array, aby zdefiniować dokładną wersję specyfikacji , uruchom ją przed próbą użycia:To jest wersja z MDN , używana w Firefox / SpiderMonkey. W innych przypadkach, takich jak IE, doda
.indexOf()
w przypadku jego braku ... w zasadzie IE8 lub poniżej w tym momencie.źródło
for...in
pętli do iteracji tablicy, powinna być używana tylko do wyliczenia .for..in
na tablicy spowoduje tylko problemy, to nie tylko konwencja ... to niezamierzone użycie i nieprawidłowe. Zarówno kolejność, jak i klucze nie są w pełni określone, zależą one od implementacji ... na przykład IE wyliczy elementy tablicy w kolejności, w jakiej zostały dodane , a nie według ich indeksu. Można jednak iterować poprawnie, uzyskując dostęp według indeksu.Jeśli używasz jQuery, możesz zamiast tego użyć $ .inArray () .
źródło
Jeśli używasz jQuery i chcesz nadal używać indexOf bez obaw o problemy ze zgodnością, możesz to zrobić:
Jest to przydatne, gdy chcesz nadal używać,
indexOf
ale zapewnia rezerwę, gdy nie jest dostępna.źródło
Aby uzyskać naprawdę dokładne wyjaśnienie i obejście, nie tylko dla indexOf, ale innych funkcji tablicy brakujących w IE, sprawdź pytanie StackOverflow Naprawianie funkcji tablicy JavaScript w Internet Explorerze (indexOf, forEach itp.)
źródło
Ostrożnie z $ .inArray, jeśli chcesz go użyć. Właśnie odkryłem, że $ .inArray działa tylko z „Array”, a nie z String. Dlatego ta funkcja nie działa w IE8!
Interfejs API jQuery wprowadza zamieszanie
-> Nie powinni mówić „Podobne”. Ponieważ indexOf obsługuje również „String”!
źródło
inArray
. To wydaje się dość definitywnie dotyczyć tylko tablic. Dlatego jest „podobny do”, a nie „identyczny z”.indexOf
że obiekt String został w pełni znaleziony w IE, podczas gdyindexOf
w Array nie znaleziono prototypu w IE <= 8.Problem
IE <= 8 po prostu nie ma
indexOf()
metody tablic.Rozwiązanie
Jeśli potrzebujesz
indexOf
w IE <= 8, powinieneś rozważyć użycie następującego wypełnienia , które jest zalecane w MDN :Zminimalizowane:
źródło
Możesz użyć tego do zastąpienia funkcji, jeśli ona nie istnieje:
źródło