IE Проблема: отправка формы в iframe с использованием JavaScript - PullRequest
35 голосов
/ 02 февраля 2010

Я пытался создать элемент iframe, используя javascript, например так:

var iframe = document.createElement('iframe');
iframe.setAttribute('name', 'frame_x');

Однако, когда я попытался отправить форму, используя вновь созданный iframe в качестве цели, IE открывает новое окно вместо использования iframe.

form.setAttribute('target', 'frame_x');
form.submit();

Это отлично работает в Firefox. Кроме того, iframe создается, но не используется.

Ответы [ 4 ]

74 голосов
/ 02 февраля 2010

Вы столкнулись с ошибкой в Internet Explorer .

Вы НЕ МОЖЕТЕ установить атрибут имени ЛЮБОГО элемента в IE, используя стандартный метод DOM .setAttribute('name', value);

В IE (до версии 8, работающей в режиме стандартов IE8) этот метод не будет работать для установки атрибута имени.

Вам необходимо использовать одно из следующих:

//A (any browser)
var iframe = document.createElement('iframe');
iframe.name = 'frame_x';

//B (only in IE)
var iframe = document.createElement('<iframe name="frame_x"/>');

//C (use a JS library that fixes the bug (e.g. jQuery))
var iframe = $('<iframe name="frame_x"></iframe>');

//D (using jQuery to set the attribute on an existing element)
$('iframe:first').attr('name','frame_x');
7 голосов
/ 02 февраля 2010

Добро пожаловать на SO.

Одна проблема, которую я видел в вашем коде, заключается в том, что вы никогда не отображаете iframe. Для того, чтобы он появился на странице, вы должны вставить его в свой документ. В моем примере я создаю тег <span>, который будет выполнять роль слота, в который будет вставлен iframe.

Посмотрите, делает ли это то, что вы ищете.

<!-- /2139399/ie-problema-otpravka-formy-v-iframe-s-ispolzovaniem-javascript -->

<html>
<head>
<script type="text/javascript">
function submitFormToIFrame(){
    var form=document.getElementById('myform');
    form.setAttribute('target', 'frame_x');
    form.submit();
}
</script>
</head>

<body>
<h1>Hello Erwin!</h1>

<form id="myform" name="myform" action="result.html">
    <input type="button" value="Submit the Form" onClick="submitFormToIFrame();">
</form>


<span id="iframeSlot">

<script type="text/javascript">
    var iframe = document.createElement('iframe');
    iframe.setAttribute('name', 'frame_x');
    document.getElementById('iframeSlot').appendChild(iframe);
</script>
</span>
</body>
</html>

UPDATE:

Я обнаружил, что это решение работает только в Firefox. Поэтому я немного поэкспериментировал. Кажется, что если вы определяете iframe в html (вместо того, чтобы генерировать его через JS / DOM), тогда он работает. Вот версия, которая работает с IE и Firefox:

<html>
<head>
<script type="text/javascript">
function submitFormToIFrame(){
    //IE
    if( document.myform ){
        document.myform.setAttribute('target','frame_x');
        document.myform.submit();
    //FF
    } else {
        var form=document.getElementById('myform');
        form.setAttribute('target', 'frame_x');
        form.submit();
    }
}
</script>
</head>

<body>
<h1>Hello Erwin!</h1>

<form id="myform" name="myform" action="result.html" target="">
    <input type="button" value="Submit the Form" onClick="submitFormToIFrame();">
</form>

<span id="iframeSlot">
<iframe name="frame_x">
</iframe>
</span>
</body>
</html>
0 голосов
/ 07 января 2014

Чтобы продолжить ответ @ scunliffe, при использовании Prototype.js:

var iframe = Element('iframe', {name: 'frame_x'});

, который работает, потому что эта вспомогательная функция обнаруживает HAS_EXTENDED_CREATE_ELEMENT_SYNTAX для IE, обходя ошибку .name = ….

0 голосов
/ 16 мая 2012
function sendForm(idform){
    var nfi = "RunF"+tagRandom();
    $("body").append("<iframe name=\""+nfi+"\" id=\""+nfi+"\" class=\"runAgents\" src=\"#\"></iframe>");
    $("#"+idform).attr("target",nfi);
    $("#"+idform).submit();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...