IE href = javascript: customFunction () не срабатывает при загрузке первого кадра

У меня есть всплывающее окно для выбора даты, которое иногда не работает в IE. Он отлично работает в Chrome и Edge.

Код выглядит примерно так:

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

Итак, вот где это становится немного странным. У нас есть две сети, называйте их старой и новой. В старой, вероятно, много недокументированных глобальных изменений политики, а новая, вероятно, близка к правительственному стандарту. Это работает в любом браузере в старой сети, но не в IE (11) в новой сети. Хотя в Edge он работает. Кроме того, если кнопки верхнего кадра используются для выбора следующего / предыдущего месяца или просто кнопки «Сегодня», то все ссылки привязки нижнего кадра работают нормально. Ошибок / предупреждений консоли нет, на сетевом мониторе ничего не отображается, когда запрос возвращает код ошибки, щелчки просто не регистрируются. Я поставил точку останова внутри customFunction (), и она не сломается, если ссылки не работают, но она сломается, если ссылка будет работать.

Единственное, что мне кажется странным, это то, что код всего всплывающего окна выглядит примерно так:

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

document.write(str);

Я действительно посмотрел, чтобы проверить, и код, который перерисовывает нижний фрейм при использовании кнопок prev / next / etc, является той же функцией, которая вызывается во время первой загрузки.

Однако то, что кажется странным в этом, заключается в том, что при первой загрузке инспектор DOM показывает все (верхний фрейм, нижний фрейм, включая все отдельные числа для каждого дня месяца и т. Д.), Но отладчик (инструменты F12) не показывает код, загруженный с помощью document.write (str); линия. Чтобы увидеть этот код и установить точки останова, я должен использовать кнопки prev / next, а затем в отладчике появится дополнительный файл .html, который имеет построенный HTML, соответствующий DOM.


person tenmiles    schedule 22.03.2017    source источник
comment
Ух ты, не ожидал увидеть <frameset>, который давно устарел. Похоже, что все это не связано с iframes.   -  person zzzzBov    schedule 22.03.2017
comment
Неправильный закрывающий тег в конце определения str: <frame</frameset>. Это должно быть </frame></frameset>. Я не знаю, является ли это опечаткой в ​​вашем сообщении или она также присутствует в вашем реальном коде.   -  person ConnorsFan    schedule 31.03.2017
comment
Можете дать ссылку для отладки?   -  person Kaique Garcia    schedule 04.04.2017
comment
@KikoGarcia Извините, это интранет. Мне даже пришлось дезинфицировать информацию в целях безопасности.   -  person tenmiles    schedule 04.04.2017
comment
Что вы имеете в виду под an additional .html file shows up in Debugger? Загружает ли он этот фрагмент html с какого-то URL-адреса, когда вы нажимаете кнопки назад / вперед?   -  person Vivek Athalye    schedule 07.04.2017
comment
@VivekAthalye, если я открою отладчик и посмотрю на папку с активами, там будет основная страница .html, которая расширяется, открывая два файла javascript: ‹URI› (?) И папку с динамическими скриптами. Если я нажимаю кнопки навигации, то один из javascript: ‹URI› становится другим файлом .html (с тем же именем, что и у основного файла). Похоже, что содержимое javascript: ‹URI› и заменяющего его .html одинаково.   -  person tenmiles    schedule 07.04.2017


Ответы (3)


попробуй это:

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) проверьте свой код. Возможно, у вашего фрейма есть атрибут «песочница». Этот атрибут может блокировать JavaScript. Пример:

 <iframe src="URL" sandbox>
person Nutscracker    schedule 05.04.2017
comment
Атрибутов песочницы не существует. Что мне кажется странным, так это то, что если я установлю точку останова внутри setDate (), она сработает, когда работает, но не сработает, когда не работает. Насколько я могу судить, браузер просто не запускает никаких событий. Кроме того, мы не хотим изменять код, поскольку он встроен в библиотеку, используемую во всех наших системах. Если бы мы попытались это изменить, мы бы, вероятно, заменили все это всплывающим окном javascript / html (на ум приходит uib-datepicker) и полностью избавились бы от фреймов. - person tenmiles; 06.04.2017
comment
@tenmiles Как вы хотите решить проблему, если не планируете ничего менять? - person Nutscracker; 06.04.2017
comment
У нас две сети, и мы переносим пользователей из одной в другую. По какой-то причине этот код не выполняется, как описано выше, в новой сети, но безупречно работает в старой сети. Выявление причины должно привести к решению, которое не связано с изменением кода ... надеюсь. - person tenmiles; 07.04.2017
comment
@tenmiles У меня есть некоторые предположения: 1) Если ваш фрейм не находится в том же домене, браузер должен предотвратить такой доступ по соображениям безопасности. 2) Если у вас есть события, связанные с проверкой изменений состояния готовности для ‹frame›, это было прекращено в Internet Explorer 11. 3) Возможно, во время первой загрузки, по какой-то причине ваша функция javascript недоступна. Старайтесь каждый раз загружать эту функцию вручную. - person Nutscracker; 07.04.2017

Помимо замечательных предложений Nutscracker, у меня также были расплывчатые проблемы с document.write и обработчиками событий, которые не подключались в IE. Причиной здесь может быть проблема, которую прокомментировал ConnorsFan, но вы также можете попробовать:

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

Вы также можете проверить, действительно ли вызывается этот код, возможно, реальное рабочее всплывающее окно загружается откуда-то еще с помощью кнопок prev / next, и это всего лишь кое-что из того, что осталось.

person Fasermaler    schedule 06.04.2017
comment
Все, что я видел, говорит о том, что код остается прежним до / после нажатия кнопок навигации. Кроме того, в некоторых средах код работает с первой попытки без использования кнопки навигации. Мы потратили немало времени на изучение наших различных политик, брандмауэров и т. Д., Но пока не нашли виновника. - person tenmiles; 06.04.2017
comment
Пожалуйста, помогите здесь (or.stackexchange.com/questions/5147/) здесь (math.stackexchange.com/questions/1095760/) - person BCLC; 04.11.2020

Если ваша функция onclick возвращает false, поведение браузера по умолчанию отменяется. Как таковой:

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

<script type='text/javascript'>

function check()
{
    return false;
}

This means that you can set your JavaScript function as an onclick event, and just have the anchor tag linking back to the page you are on - as it won't redirect you when you click it but needs a href attribute.

person AlphaMycelium    schedule 07.04.2017
comment
Для этой функции нет явного оператора возврата, она просто устанавливает значения других свойств и вызывает другие методы. Однако эта функция никогда не вызывается, если существует проблема. Когда это сработает, я могу установить точку останова, и она сломается в первой строке метода, но когда она не сработает, она вообще не сломается. - person tenmiles; 07.04.2017