jQuery: как скрыть рамку у родителя?

У меня есть главная страница, содержащая несколько фреймов в наборе фреймов. Одна из рамок представляет собой панель инструментов с кнопками, я хотел бы иметь возможность нажать кнопку на этой панели инструментов, и она скроет одну из рамок на главной странице.

Я пробовал следующее из рамки панели инструментов, но это не работает...

$(document).parent.$("#other_frame").hide("slow");

Я ДЕЙСТВИТЕЛЬНО новичок в jQuery, и после поиска в Интернете я почти потерялся.

Спасибо за помощь.

РЕДАКТИРОВАТЬ: Моя полная главная страница

<frameset frameborder="0"  rows="70, *">
   <frame name="toolbar" src="toolbar.html" marginwidth="8px" marginheight="8px" />
   <frameset id="lineNumFrameset" frameborder="0" cols="50, *">
      <frameset rows="*, 16">
      <frame id="other_frame" name="lineNum" src="lineNum.html" marginwidth="8px" marginheight="8px" align="top" />
      </frameset>

      <frame name="editor" src="editor.html" marginwidth="8px" marginheight="8px" />
   </frameset>
</frameset>

person thedp    schedule 24.11.2009    source источник
comment
Вы пробовали просто: $('#other_frame').hide(); Возвращает ли он какие-либо ошибки javascript или просто не работает?   -  person Sonny Boy    schedule 24.11.2009


Ответы (5)


Насколько я понимаю, вам нужно выполнять такие действия, как скрытие div. По сути, все, на что вы пытаетесь повлиять, должно реагировать на атрибут отображения css. Если вы должны использовать фреймы, я бы настоятельно рекомендовал вам вместо этого использовать div, тогда вам нужно будет написать некоторый jQuery, который фактически удаляет фрейм из DOM, а не просто пытается скрыть его.

person Chris Johnston    schedule 24.11.2009
comment
Я думаю, что это правда, вы можете скрыть iframe, но не фрейм внутри набора фреймов (поскольку они не отображаются и не стилизуются через css). - person Rudism; 24.11.2009
comment
Добавил код главной страницы в пост. Я могу скрыть фрейм с id=other_frame, просто изменив размер столбцов набора фреймов... Но я хотел использовать jQuery для создания классного эффекта анимации (со скрытием). - person thedp; 24.11.2009

$(document).parent.$("#other_frame").hide("slow");

Ах. Здесь несколько проблем. Во-первых, это parent() для вызова функции. Однако jQuery не может выйти из документа в родительский документ, используя parent(). Для перехода вверх по кадрам вам понадобится свойство window.parent:

window.parent.$('#other_frame').hide('slow');

Но для этого вам понадобится копия jQuery, загруженная в родительский документ, чтобы вы могли вызвать его $. (Создание сценария одного документа из копии $ другого документа обычно не работает; jQuery не предназначен специально для межфреймового скриптинга.)

И последняя причина, по которой это не работает, заключается в том, что вы не можете на самом деле создавать скрипты/стили для страниц наборов фреймов. Браузеры могут игнорировать сценарии на этих специальных страницах, а многие свойства CSS просто не работают с фреймами (включая display: none, который использует jQuery hide()).

Попробуйте использовать iframes вместо frames, чтобы получить страницу с более удобным сценарием. (Однако заставить работать layout: fixed в стиле фреймов в IE6 будет непросто.) Или, если вы вообще можете управлять этим, сделать все это в одном документе будет намного удобнее. В межкадровых сценариях есть много тонких и раздражающих ловушек.

person bobince    schedule 24.11.2009

Я сделал так, без jquery, у меня есть «ссылка» в основном фрейме, которая вызывает функцию go(). go расширяет или сворачивает первый кадр "FrameSetMain". Я тестировал на ie8 и firefox 3.6.

var oggFS = parent.document.getElementById("FrameSetMain");
var startingWidth = oggFS.cols
var w = 0;
function collapse(min) { 
    s = oggFS.cols.split(",");
    w = parseInt(parseFloat(s[0]) / 2);
    oggFS.cols = w + ",8,*";
    if (w>min) { setTimeout("collapse("+min+")",50); } else {
        oggFS.cols = min + ",8,*";
        document.getElementById("link").title = "Show menu";
    }
}
function expand(max) { 
    s = oggFS.cols.split(",");
    if (s[0]==0) s[0]=5;
    w = parseInt(parseFloat(s[0]) * 2);
    oggFS.cols = w + ",8,*";
    if (w<max) { setTimeout("expand("+max+")",50); } else {
        oggFS.cols = max + ",8,*";
        document.getElementById("link").title = "Hide menu";
    }
}
function go(){ if (oggFS.cols != "0,8,*") { collapse(0); } else { s = startingWidth.split(","); expand(s[0]); } }
person Pons    schedule 18.05.2010

Попробуй это:

if(window.parent.document.getElementById("myFrameset").cols!="40px,*"){
                $('#left-title-txt').hide();
                window.parent.document.getElementById("myFrameset").cols="40px,*";
                $(this).css('background-image','url(img/openleft.png)');
            }else{
                $('#left-title-txt').show();
                window.parent.document.getElementById("myFrameset").cols="20%,80%";
                $(this).css('background-image','url(img/hideleft.png)');
            }
person xiaoxie yang    schedule 29.12.2011

Вы можете изменить набор фреймов с помощью чего-то вроде:

 //hide
        var orig = $('#myFrameSet', top.document).attr('rows');
        $('#myFrameSet', top.document).attr({'rows':'0,*'})

        ....

 //show
        $('#myFrameSet', top.document).attr({'rows':orig})
        orig = null;

Вы можете сделать это и для столбцов.

person Brent    schedule 31.01.2011