2017-03-22 26 views
7

Mam niestandardowe okienko wyboru daty, które czasami nie działa w IE. Działa w Chrome i Edge dobrze.IE href = "javascript: customFunction()" nie uruchamia się przy pierwszym obciążeniu ramki

Kod wygląda mniej więcej tak:

<frameset> 
    <frame>Buttons for next/prev month/year</frame> 
    <frame>This is the actual calendar that gets redrawn when the above buttons are used 
     <a href="javascript:parent.opener.setDate(1);">1</a> //there's a different anchor tag for each day of the month 
    </frame> 
<frameset> 

Więc oto gdzie robi się trochę dziwne. Mamy dwie sieci, nazwijmy je starymi i nowymi. Stare ma prawdopodobnie wiele nieudokumentowanych zmian w polityce globalnej, a nowe są prawdopodobnie zbliżone do standardu gov. Działa to w dowolnej przeglądarce w starej sieci, ale nie w IE (11) w nowej sieci. Działa jednak w Edge. Dodatkowo, jeśli przyciski górnej ramki są używane do wybierania następnego/poprzedniego miesiąca lub po prostu przycisku "Dzisiaj", wszystkie dolne łączniki kotwicy działają normalnie. Nie ma błędów/ostrzeżeń konsoli, nic w monitorze sieci nie pokazuje, że żądanie zwróciło kod błędu, kliknięcia po prostu się nie rejestrują. Umieściłem punkt przerwania wewnątrz funkcji customFunction() i nie zostanie ono przerwane, gdy linki nie będą działać, ale ulegnie przerwaniu, jeśli łącze będzie działało.

Jedyną rzeczą, która wydaje się dziwne dla mnie jest to, że kod dla całej popup wygląda mniej więcej tak:

str = "<frameset><frame name='topFrame' " + 
    "src='javascript:parent.opener.drawTop'></frame><frame name='bottomFrame' "+ 
    "src='javascript:parent.opener.drawBottom'><frame</frameset>" 

document.write(str); 

I wyglądał sprawdzić i kod, który rysuje dolną klatkę gdy prev/następna Przyciski/etc są tą samą funkcją, która jest wywoływana podczas pierwszego ładowania.

Jednak dziwne w tym jest to, że po pierwszym załadowaniu inspektor DOM pokazuje wszystko (górna ramka, dolna ramka zawierająca wszystkie indywidualne liczby dla każdego dnia miesiąca itd.), Ale Debugger (narzędzia F12) nie pokazuje kodu załadowanego z document.write (str); linia. Aby móc zobaczyć ten kod i ustawić punkty przerwania, muszę użyć przycisków prev/next, a następnie pojawi się dodatkowy plik .html w Debuggerze, który ma skonstruowany kod HTML, który pasuje do DOM.

+1

Wow, nie spodziewałem się zobaczyć '', który jest przestarzały przez długi czas. Nic z tego nie wydaje się być związane z 'iframe's. – zzzzBov

+4

Znacznik zamykający jest niepoprawny na końcu definicji str: ''. Powinno to być ''. Nie wiem, czy jest to literówka w twoim poście, czy też jest obecna w twoim prawdziwym kodzie. – ConnorsFan

+0

Czy możesz podać link do debugowania? –

Odpowiedz

4

spróbuj tego:

1)

<a href="javascript:parent.opener.setDate(1); void(0);">1</a> 

2)

<a href="javascript:function(){parent.opener.setDate(1); return false;}">1</a> 

3)

<a href="#" onclick="javascript:parent.opener.setDate(1); return false;">1</a> 

4) sprawdzić swój kod. Być może twoja ramka ma atrybut "sandbox". Ten atrybut może blokować javascript. Przykład:

<iframe src="URL" sandbox> 
+0

Brak atrybutów piaskownicy. Dziwne jest to, że jeśli ustawię punkt przerwania wewnątrz funkcji setDate(), to uruchomi się, gdy zadziała, ale nie uruchomi się, gdy nie zadziała. O ile mogę powiedzieć, że przeglądarka po prostu nie uruchamia żadnych zdarzeń. Ponadto nie chcemy zmieniać kodu, ponieważ jest on wypiekany w bibliotece używanej w naszych systemach. Gdybyśmy spróbowali to zmienić, prawdopodobnie zastąpilibyśmy całą całość wyskakującym javascript/html (przychodzi na myśl uib-datepicker) i pozbywamy się całkowicie ramek. – tenmiles

+1

@tenmiles Jak chcesz rozwiązać problem, jeśli nie planujesz niczego zmienić? – Nutscracker

+0

Mamy dwie sieci i migrujemy użytkowników z jednego do drugiego. Z jakiegoś powodu ten kod nie działa tak, jak opisano powyżej w nowej sieci, ale działa bezbłędnie w starej sieci. Identyfikacja przyczyny powinna doprowadzić do rozwiązania, które nie wymaga zmiany kodu ... mam nadzieję. – tenmiles

3

Oprócz wielkich sugestii Nutscracker, miałem też swój udział niejasnych problemów z document.write i obsługi zdarzeń nie dołączając w IE. Problem skomentował ConnorsFan może być przyczyną tutaj, ale można też spróbować:

document.body.innerHTML = '<frameset><frame name="topFrame" ' + 
'src="javascript:parent.opener.drawTop"></frame><frame name="bottomFrame" '+ 
'src="javascript:parent.opener.drawBottom"><frame></frameset>' 

Warto również sprawdzić ten kod jest faktycznie nazywa, może popup prawdziwy robocza jest ładowany z innego miejsca przez przyciski prev/next i to tylko niektóre resztki.

+0

Wszystko, co widziałem, sugeruje, że kod jest taki sam przed/po kliknięciu przycisków nawigacyjnych. Ponadto kod działa w niektórych środowiskach przy pierwszej próbie bez użycia przycisku nawigacyjnego. Spędziliśmy sporo czasu przeglądając nasze różne zasady, zapory ogniowe itp. I nie znaleźliśmy jeszcze winowajcy. – tenmiles

0

Jeśli funkcja onclick zwróci wartość false, domyślne zachowanie przeglądarki zostanie anulowane.Jako takie:

<a href='http://www.google.com' onclick='return check()'>check</a> 

<script type='text/javascript'> 

function check() 
{ 
    return false; 
} 

Oznacza to, że można ustawić funkcji JavaScript jako zdarzenie onclick, i po prostu znacznik zakotwiczenia powiązanie z powrotem do strony, na której się znajdujesz - ponieważ nie będzie przekierowanie po kliknięciu, ale wymaga atrybutu href.

+0

Nie ma wyraźnej instrukcji return dla tej funkcji, po prostu ustawia wartości innych właściwości i wywołuje inne metody. Jednak ta funkcja nigdy nie jest wywoływana, gdy problem występuje. Kiedy to zadziała, mogę ustawić punkt przerwania, który zostanie przerwany w pierwszym wierszu metody, ale kiedy to nie zadziała, to w ogóle się nie zepsuje. – tenmiles

Powiązane problemy