Несколько отправок в одном действии не работают в IE8 на 64-битной Win7 - PullRequest
0 голосов
/ 14 апреля 2011

У меня есть 2 фрейма на странице, где frame1 вызывает метод Javascript на frame2. В frame2 мы делаем отправку, которая не происходит. Когда мы возвращаемся к frame1, он сам отправляет данные, и это прекрасно работает. Оба представления отправляют данные на сервер.

FRAME1.HTM

function doSubmit(selectedTab)
{
    if (checkFieldsChanged() == true) 
       {
        ...
        if(selectedTab >= 0)
                    document.forms[0].action="WebDesk?op=dm&id=11097DETH000000&FormNo=" + selectedTab;
        document.forms[0].submit();
    }
}

function checkFieldsChanged()
{
    ...
        if (confirm("Do you want to save the changes you have made?"))
        {
            // try to submit the form.
            try
            {
                return parent.frames[1].doSubmit();
            }
            catch (e)
            {
                ...
            }
        }
    return true;
}
...
    <FORM METHOD="POST" ACTION="WebDesk?op=dm&id=11097DETH000000&FormNo=" TARGET="WorkitemContents11097DETH000000">

FRAME2.HTM

function doSubmit()
{
    ...
        **// Nothing happens here on this submit
        document.forms[0].submit();** 
        return true;
}
...
   <form METHOD='POST' ACTION='WebDesk?' onsubmit="return ReqdFieldChk();">
       <input TYPE='hidden' NAME='op' VALUE='f'/>
       <input TYPE='hidden' NAME='id' VALUE='11097DETH000000'/>
       <input TYPE='hidden' id='FormNo' NAME='FormNo' VALUE='3'/>
       <input TYPE='hidden' id='send' NAME='send' VALUE='false'/>

Таким образом, doSubmit FRAME1 вызывается обработчиком onclick, который вызывает checkFieldsChanged, который выполняет doSubmit для FRAME2. Когда мы вызываем submit в FRAME2, ничего не происходит. Затем, когда мы возвращаемся к FRAME1, происходит отправка, и это всегда работает нормально.

Я подозреваю, что объединение этих двух отправок для одного пользовательского действия недопустимо. Или IE8 это не нравится и не позволяет.

Я сделал много отладок:

  • Это правильно работает в IE6 на XP.
  • Я знаю, что процедура отправки действительно вызывается, потому что я помещаю вызовы console.log вокруг нее, и она всегда называется
  • Если я установлю точку останова на строке отправки внутри отладчика IE и нажму F10, чтобы перешагнуть через строку, отправка сработает. Однако, если я нажму F5, чтобы просто продолжить оставшуюся часть сценария, это не сработает. Таким образом, это может показаться, что проблема синхронизации
  • Я ввел асинхронный вызов, чтобы выполнить отправку позже, но это не помогло
  • FRAME2.HTM генерируется встроенным кодом и имеет некоторые проблемы с проверкой HTML. Я исправил это, и проблема все еще остается
  • В Firefox 3.6.8 иногда это работает, иногда нет. Я не понял, когда это работает, а когда нет.
  • Я запустил программу HTTP Analyzer, которая просматривает выходные данные IE и ничего не показывает из неверной отправки. Он показывает правильный вывод для 2-й отправки, которая работает. Когда я делаю F10, чтобы перешагнуть через отправку (и она работает правильно), ответ, который возвращается с сервера, усекается. Ответ от 2-го представления (который также работает) является нормальным. На самом деле вы не заметите здесь ничего плохого, потому что 2-я отправка заменяет FRAME2, так что это не проблема. Но это может быть признаком того, что первая отправка усекается.
  • Я пробовал просмотр совместимости, но это не помогло
  • Я провел множество поисков в Google и не нашел ничего конкретного.

Я могу предоставить необработанный HTML, но я не хочу добавлять больше к этому и без того большому вопросу.

Это действительно сводится к следующему: можем ли мы объединить несколько отправок в одно действие пользователя? В течение многих лет он отлично работал на IE6, но теперь работает на IE8.

1 Ответ

0 голосов
/ 14 апреля 2011

в frame2.htm doSubmit () попробуйте это:

function doSubmit()
{


  var frameId = document.getElementById('iframe_id');
    var frameWindow= frameId .contentWindow || frameId .contentDocument;

frameWindow.forms[0].submit();

}
...