Сохранение высоты набора фреймов в файле cookie и восстановление следующего сеанса

#javascript #jquery #frames

#javascript #jquery #фреймы

Вопрос:

У нас есть набор фреймов (не iFrames!) приложение, В котором нам нужно сохранить состояние фреймов, которые выбирают пользователи .. а затем восстановить это состояние при следующем посещении страницы..

Использование jQuery в качестве предпочтительного оружия . вот как далеко мы продвинулись..

  <frameset rows="40,600,40" id="myframeset" name="myframeset">

     <frame name="mytop" id="mytop" src="http://xyz.com/top.html">

     <frameset cols="50%,50%">
        <frame name="leftframe" id="leftframe" src="http://xyz.com">
        <frame name="rightframe" id="rightframe" src="http://xyz.com">
     </frameset>

     <frame name="mybottom" id="mybottom" src="http://xyz.com/bottom.html">

</frameset>
  

Запуск некоторого jQuery в любом из дочерних фреймов.. (скажем, mybottom) легко извлекать значения строк из верхней области набора фреймов…

 var myrows = $('#myframeset', top.document).attr('rows'); 
   alert(myrows);  // returns 40,600,40
  

и также легко изменить высоту фрейма с помощью jQuery .attr…

 $('#myframeset', top.document).attr({'rows':'0,*,300'});

var myrows = $('#myframeset', top.document).attr('rows'); 
   alert(myrows); // returns 0,*,300
  

Но кажется, что когда пользователь перемещает фреймы, чтобы изменить высоту самостоятельно, вручную..
это не влияет на то, что возвращает attr

( переместите фреймы вручную, затем нажмите кнопку …)

 $("button").click(function() {

  var myrows = $('#myframeset', top.document).attr('rows'); 
    alert(myrows);  //  always returns 0,*,300
  

Я чувствую, что здесь мне не хватает простой концепции.. пожалуйста, сообщите
, есть ли способ, которым мы можем получить значения набора фреймов (onUnload), поместить их
в файл cookie .. и затем восстановить onload при следующем посещении пользователем страницы

Большое спасибо..

PS .. если это невозможно сделать с помощью строк / столбцов .. возможно, с высотой / шириной окна?

Ответ №1:

Чтобы завершить сбор (вы уже создали функцию для настройки строк):

 function getTopRows(){
    var rows = [];
    var main = $("#myframeset", top.document);

    //Get the whole height of the main <frameset>
    var wholeheight = $(main).height();

    //Calculate the relative height of each frame (child) of the main <frameset>
    main.children().each(function(){
         rows.push(Math.round(100*$(this).height()/wholeheight));
    });

    rows = rows.join("%,") "%"; //Example: 6%,87%,6%
    return rows;
}
  

Вызов getTopRows() возвращает строку относительных единиц измерения, которую можно использовать для установки верхних строк. Это значение можно сохранить с помощью плагина jQuery cookie:

 //You can add this function as an event listener to a button
function saveTopRows(){
    var topRows = getTopRows();
    $.cookie("rows", topRows); //Save data
}

//Execute on load of the page:
(function(){//Anonymous wrapper to prevent leaking variables
    var rows = $.cookie("rows");
    if(rows) $("#myframeset", top.document).attr("rows", rows);
})();
  

Не забудьте добавить плагин jQuery cookie, либо определив его в исходном коде, либо добавив внешний JS-файл. Источник плагина Cookie см. На веб-сайте jQuery. После загрузки исходного кода сохраните его как «jquery.cookie.js «, и добавьте этот код:

 ...
<script src="jquery.cookie.js"></script>
<script>
  function getTopRows(){
  //Rest of code
  

Комментарии:

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

2. Это не «сбой». Это «страница с рамкой еще не загружена» 😉

Ответ №2:

Используйте плагин jQuery cookie и сделайте что-то вроде этого:

 $(window).unload(function() {
   var myrows = // get the stuff you need 
   $.cookie("mycookie", myrows, { expires: 10 }); //expires in ten days
});
  

Затем сделайте что-то подобное, чтобы получить значения при загрузке:

 if ($.cookie("mycookie") {         //check if the cookie exists
   myrows = $.cookie("mycookie");  //then get the values
} else {
   //do something else if the cookie does not exist
}
  

Если attr() не работает для вас, попробуйте prop()

Комментарии:

1. голосование за некоторые очень полезные предложения.. не знал о .prop() .. интересный метод