Попытка скрыть рамку с помощью jquery, когда меню находится над
У меня есть страница с набором кадров, который состоит из двух кадров; верхняя рама и нижняя рама. В верхней рамке есть меню с подменю. Проблема, с которой я столкнулся, заключается в том, что нижняя рамка не позволяет подменю выпадать, как следует. Я мог бы расширить размер верхней рамки, но руководство не хочет этого. Поскольку кажется, что раскрывающееся меню не может отображаться поверх нижнего меню, лучший способ заставить его работать - это скрыть нижнюю рамку при расширении верхней рамки. Это только теория. Я никогда раньше не работал с asp.net или фреймами, поэтому, если честно, я не уверен, сработает ли это или нет.
Существует отдельная страница для frameset и frames, и это выглядит так:
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Default.aspx.vb" Inherits="dhss.mohsaic.webapplication.mohsaic.DefaultFrameset" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html>
<head>
<title>MOHSAIC</title>
<link rel="shortcut icon" href="/Images/bavicon.ico"/>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0" />
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0" />
<meta name="vs_defaultClientScript" content="JavaScript" />
<meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5" />
</head>
<frameset border="0" framespacing="0" rows="95,*" name="frameset" class="frameset" id="frameset">
<frame src="<%=HeaderFrameURL%>" scrolling="no" frameborder="0" noresize="noresize" name="fraHeader" />
<frame src="<%=EntireBodyURL%>" scrolling="auto" frameborder="0" noresize="noresize" name="fraEntireBody" id="bottomFrame" />
</frameset>
</html>
HTML-код меню, которое в отдельном файле:
<div>
<table id="tblAreaTabs" style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px;
margin: 0px; padding-top: 0px" cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="DarkHeader" width="100%" bgcolor="#000000">
<asp:Menu ID="mainMenu" Runat="server" Orientation="Horizontal"
DynamicMenuItemStyle-CssClass="ChildLink" StaticMenuItemStyle-Font-Underline="true" StaticMenuItemStyle-CssClass="ParentLink" StaticEnableDefaultPopOutImage="false"
style="text-align:center;filter:progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='black', Positive='true');">
</asp:Menu>
</td>
<td valign="middle" class="DarkHeader">
<asp:HyperLink ID="hlError" runat="server" NavigateUrl="DssStatus.aspx" Target="fraDssStatus"
ImageUrl="/images/error.gif" BorderWidth="0px" Height="15px">The connection to DSS is not available.</asp:HyperLink><asp:HyperLink
ID="hlWarn" runat="server" NavigateUrl="DssStatus.aspx" Target="fraDssStatus"
ImageUrl="/images/warn.gif" BorderWidth="0px" Height="15px">The connection to DSS is partially available. </asp:HyperLink>
</td>
</tr>
</tbody>
</table>
</div>
подменю создаются динамически в зависимости от учетных данных пользователя
Я пробовал несколько способов сделать то, что я хочу сделать. Первым было добавить onmouseover="whileHovering()" в тег меню asp: и добавить следующий javascript:
var origCols = null;
function whileHovering() {
//alert("Yes, I'm working");
if (origCols !== null)
showFrame();
else
hideFrame();
};
function hideFrame() {
var frameset = parent.document.getElementById("frameset");
origCols = frameset.rows;
frameset.rows = "120, 0";
};
function showFrame() {
document.getElementById("frameSet").rows = origCols;
origCols = null;
};
Однако это не сработало. Я получаю сообщение об ошибке "не могу прочитать свойство" строки "с нулевым значением. После исследования, набор фреймов является нулевым, и ничто, что я сделал, не изменило бы это. Поэтому я отказался от этого маршрута и попытался:
(function() {
alert("I have entered the function")
$('#mainMenu').hover(function () {
alert('hidden function working')
$(this).parent.document.getElementById('bottomFrame').style.visibility = "hidden"
}), function () {
alert('visible function working')
$(this).parent.document.getElementById('bottomFrame').style.visibility = "visible"
}
});
Я не получаю ошибок от этого, но ничего не происходит. Это даже не ударил анонимную функцию.
Буду признателен, если кто-нибудь скажет мне, что я делаю неправильно.
2 ответа
Если вы используете frameset и frames, у вас будут такие проблемы. Написание кода JS/Jquery - это просто обходной путь, и, откровенно говоря, не очень хороший.
Есть какая-то конкретная причина, почему вы используете это?
Вы пытались использовать главные страницы ASP.NET, чтобы иметь общее меню и использовать его на разных страницах? Если это неосуществимый вариант, пытались ли вы использовать iframe? В основном html-файле создайте свое меню, а под тегом div/table вашего меню добавьте iframe. В этом iframe будут отображаться разные страницы, которые вы сейчас показываете в #bottomFrame.
Вы ставите $ раньше (function()
в вашем коде? $(function() {})
срабатывает, когда документ проанализирован и готов, без него ваша функция не будет работать. Также вам не нужно использовать getElementById('bottomFrame').style.visibility
в jQuery есть довольно короткий и элегантный способ редактировать правила CSS, используя css(property, value)
, Также не забудьте поставить ;
в конце ваших заявлений. Весь код выглядит так:
$(function () {
alert("I have entered the function");
$('#mainMenu').hover(function() {
alert('hidden function working');
$(this).parent().css("visibility", "hidden");
}, function() {
alert('visible function working');
$(this).parent().css("visibility", "visible");
});
});
ОБНОВЛЕНИЕ: Если я вас правильно понял, вы хотите скрыть bottomFrame
при наведении на MainMenu, используйте этот код:
$(function () {
alert("I have entered the function");
$('#mainMenu').hover(function() {
alert('hidden function working');
$('#bottomFrame').css("visibility", "hidden");
}, function() {
alert('visible function working');
$('#bottomFrame').css("visibility", "visible");
});
});