Как я могу динамически отправлять данные в iframe в JQuery.
Мне действительно нужно отправлять данные в iframe в этом случае, я не могу использовать $ .POST, потому что полученные данные возвращаются последовательно (буферизуются)
Если у вас есть обходной путь для обработки данных дескриптора jquery, возвращаемых $ .POST ', когда он получает данные. Мне очень любопытно!
В настоящий момент я обрабатываю его с помощью GETS следующим образом:
var iframe = $('<iframe style="display:none;"></iframe>'); $( "body" ).append(iframe); iframe.attr('src','server.php?type=getFolders&inode='+nodeData.inode).load(function(){$(this).remove()});
Это в основном создает временный iframe и позволяет PHP вводить в него javascript (используя ob_flush();flush();
), пока он возвращает данные, а затем, когда он закончен, он просто удаляет iframe для очистки.
изнутри iframe я обращаюсь к основному фрейму с помощью window.parent.
затем методы мэйнфрейма.
это идеально, но работает с GET, как я могу сделать эту работу с POST?
Эта функция создает временную форму, а затем отправляет данные с помощью jQuery:
function postToIframe(data,url,target){ $('body').append('<form action="'+url+'" method="post" target="'+target+'" id="postToIframe"></form>'); $.each(data,function(n,v){ $('#postToIframe').append('<input type="hidden" name="'+n+'" value="'+v+'" />'); }); $('#postToIframe').submit().remove(); }
target – это «имя» attr целевого iFrame, а данные – объект JS:
data={last_name:'Smith',first_name:'John'}
Хорошо, так как этого, по-видимому, не существует, я создал свое собственное решение. Разделите его здесь, если кто-то захочет POST для iFrame в jQuery.
js function / class-like:
function iframeform(url) { var object = this; object.time = new Date().getTime(); object.form = $('<form action="'+url+'" target="iframe'+object.time+'" method="post" style="display:none;" id="form'+object.time+'" name="form'+object.time+'"></form>'); object.addParameter = function(parameter,value) { $("<input type='hidden' />") .attr("name", parameter) .attr("value", value) .appendTo(object.form); } object.send = function() { var iframe = $('<iframe data-time="'+object.time+'" style="display:none;" id="iframe'+object.time+'"></iframe>'); $( "body" ).append(iframe); $( "body" ).append(object.form); object.form.submit(); iframe.load(function(){ $('#form'+$(this).data('time')).remove(); $(this).remove(); }); } }
тогда, когда вам нужно отправить форму во временный iframe:
var dummy = new iframeform('server.php'); dummy.addParameter('type','test'); dummy.addParameter('message','Works...'); dummy.send();
Это файл примера server.php:
if($_POST[type] == 'test') { header( 'Content-type: text/html; charset=utf-8' ); echo '<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>'; echo str_pad('',4096); //fill browser buffer for($i = 0; $i < 10; $i++) { echo '<script type="text/javascript">window.parent.console.log(\''.$_POST[message].'\');</script>'; ob_flush(); flush(); usleep(350000); } }
И результат такой, как ожидалось:
консоль основного кадра выводит строку «Works …» каждые 350 мс, начиная сразу, даже если php все еще работает.
Когда php завершает отправку кусков, он просто удаляет временную форму и временный iframe.
Либо вы можете использовать целевой метод, либо использовать AJAX для вышеуказанной работы
<form action="..." target="an_iframe" type="post"> <input type="text" name="cmd" placeholder="type a command here..." /> <input type="submit" value="Run!" /> </form> <iframe id="an_iframe"></iframe>