2011-08-19 17 views
31

W tym JSFiddle, który utworzyłem w Chrome, stwierdzam, że nie można pracować z IE (używam IE9). Każdy powód: http://jsfiddle.net/ZSB67/.Problem z korzystaniem z elem.dataset z IE i JSFiddle

var backImage = [ 
    "http://alm7.wikispaces.com/file/view/RedBackground.bmp/144018347/RedBackground.bmp", 
    "http://www.time2man-up.com/wp-content/uploads/2011/07/black-background.jpg", 
    "http://1.bp.blogspot.com/--GorNQoEUxg/TfWPyckVeMI/AAAAAAAAAHk/0208KqQf3ds/s1600/yellow_background.jpg", 
    "" 
    ]; 

function changeBGImage(whichImage) { 
    if (document.body) { 
     document.body.style.background = "url(\"" + backImage[whichImage] + "\")"; 
    } 
} 
var buttons = document.querySelectorAll('.bg_swap'), 
    button; 

for (var i = 0; i < buttons.length; i++) { 
    button = buttons[i]; 
    button.onclick = function() { 
     changeBGImage(this.dataset.index); 
    }; 
} 
+0

Mam cztery hiperłącza z klasą .bg_swap i indeks (indeks danych) liczb w porządku rosnącym. Kiedy klikam na nich, mają one ustawić tło strony odpowiadające indeksowi elementu do indeksu tablicy (backImage). Jestem Chrome i sprawdziłem na IE9 i to nie działa. – 0x499602D2

+0

'this.dataset' pojawia się jako niezdefiniowany w IE9, więc twój handler onclick nigdy nie wywołuje zmiany changeBGImage() –

Odpowiedz

93

IE nie obsługuje elem.dataset. Musisz jawnie uzyskać atrybut: http://jsfiddle.net/ZSB67/1/.

changeBGImage(this.getAttribute('data-index')); 

W przyszłości możesz chcieć nacisnąć klawisz F12 i spojrzeć na konsolę w poszukiwaniu błędów, ponieważ napisano, co było przyczyną problemu.

+3

Zrobiłeś mój dzień. Dzięki za odpowiedź. +1 dla ciebie. –

+1

Działa teraz w IE11 i Edge. –

+0

Aby uzyskać więcej informacji na temat używania i wsparcia, dokumenty dla programistów mozilla są dobre: ​​https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset – Jeremy

3

dataset wydaje się być niezdefiniowane w IE. To prawdopodobnie główne źródło problemu. Wszystko inne działa dobrze na 64-bitowym IE9.

Można przechowywać tylko ten stan lokalnie w JS:

for (var i = 0; i < buttons.length; i++) 
    register(i) 

function register(i){ 
    button = buttons[i]; 
    button.onclick = function() { 
     changeBGImage(i); 
    }; 
} 

Albo można zrobić odnośnika

for (var i = 0; i < buttons.length; i++) 
    button = buttons[i]; 
    button.onclick = function() { 
     changeBGImage(this.getAttribute('data-index')); 
    }; 
} 
8

this.dataset.index nie działa w IE. Spróbuj użyć this.getAttribute("data-index").

+0

, ale to nie działa w chrome. – andufo

+0

@andufo - Działa to dobrze dla mnie tutaj: https://jsfiddle.net/jfriend00/Ltmuo6we/ – jfriend00

6

Powodem własnością dataset nie jest rozpoznawany przez starszych wersjach IE (w rzeczywistości wszystkie z nich z wyjątkiem IE11 +) jest fakt, że został on wprowadzony w HTML5, które te wersje nie obsługują lub obsługują go tylko częściowo.

W celu uzyskania wartości obiektu i, można użyć czystego js jak

changeBGImage(this.attributes.getNamedItem("data-index").value) 

lub prostszy za pomocą metody getAttribute():

changeBGImage(this.getAttribute("data-index")) 

lub jQuery (V 1.2.3+):

$(".bg_swap").click(function(){ 
    changeBGImage($(this).data("index")); 
}) 
+0

Prawidłowe. Naprawdę nie rozumiem, dlaczego ludzie mają potrzebę wspierania przestarzałych przeglądarek. Użycie IE10 i poniżej to max. 6,3% wszystkich przeglądarek i ten niski procent wykorzystania obejmuje Edge i IE11, więc jest ich maks. (!) 1,4% starych przeglądarek IE.Pisanie takiego kompatybilnego wstecznego kodu to strata czasu i pieniędzy - zwłaszcza, że ​​wszystkie główne przeglądarki są bezpłatne dzięki automatycznym bezpłatnym aktualizacjom. Ostatecznie jQuery i tak to naprawi. Zobacz: http://www.w3schools.com/browsers/browsers_stats.asp – StanE

+2

Jest tak w przypadkach, gdy klient nie może/nie może zainstalować nowoczesnej przeglądarki. Na przykład instytucja państwowa z przestarzałymi komputerami. – meehocz

+0

@ StanE pytanie utworzone w 2011 r. ~ W tym czasie może być potrzebne wsparcie. ;) –