Передайте значения в iframe, не используя GET

У меня есть iframe, который я формально создавал, используя url с некоторыми vars, которые я передавал как GET. Можно ли установить исходную страницу и передать переменные как сообщение или что-то еще? Или действительно, если можно как-то добраться до переменных, хранящихся в родителе, я бы тоже был в порядке.

6 ответов


использовать window.parent изнутри iframe.

в Родительском окне:

window.passingObj = { "key" : "value" };

в iframe:

alert(window.parent.passingObj["key"]); // value

два полезных сообщения:

iframe доступ к родительскому DOM? (iframe для родителей)

вызов кода JavaScript в iframe с родительской страницы (родитель в iframe)


Если вам нужен только доступ в javascript, вы можете использовать hash.

iframe.src="http://foo.bar/#arg1=1&arg2=2";

и затем на странице вы просто извлекаете их из location.hash.substring(1).

это шаблонный код для получения этих args в "карту":
(из моей библиотеки easyXDM)

var query = (function(input){
    input = input.substring(1).split("&");
    var data = {}, pair, i = input.length;
    while (i--) {
        pair = input[i].split("=");
        data[pair[0]] = decodeURIComponent(pair[1]);
    }
    return data;
}(location.hash);

query.arg1; // 1
query.arg2; // 2

если обе страницы находятся в одном домене, вы можете получить доступ к переменным, определенным в разделе контейнер из кадра с помощью

parent.varName

вы можете использовать переменные и метод из родительского окна iframe, просто используя родитель


для того, что вы говорите, Я понимаю, что вы не хотите использовать url для передачи своего параметра.

в зависимости от того, где выполняется JavaScript у вас есть такие варианты:

  • Если выполняется в окне контейнера, вы сделаете что-то вроде этого

    ...
    var el = document.getElementById('targetFrameId');
    
    getIframeWindow(el).someFunction('value1', 'value2', ...);
    // or
    getIframeWindow(el).someVariable = {key1:'value1', key2:'value2', ...};
    ...
    
  • Если выполняется в окне iframe, вы бы сделали что-то вроде этого

    ... window.parent.something ... ;
    

пристрой

function getIframeWindow(iframe_object) {
  var doc;

  if (iframe_object.contentWindow) {
    return iframe_object.contentWindow;
  }

  if (iframe_object.window) {
    return iframe_object.window;
  } 

  if (!doc && iframe_object.contentDocument) {
    doc = iframe_object.contentDocument;
  } 

  if (!doc && iframe_object.document) {
    doc = iframe_object.document;
  }

  if (doc && doc.defaultView) {
   return doc.defaultView;
  }

  if (doc && doc.parentWindow) {
    return doc.parentWindow;
  }

  return undefined;
}