【发布时间】:2010-12-20 23:58:24
【问题描述】:
我希望仅在 iframe 内的页面上拉出表单时才显示该表单。我怎么做?有服务器端解决方案吗?
【问题讨论】:
标签: ruby-on-rails ruby iframe
我希望仅在 iframe 内的页面上拉出表单时才显示该表单。我怎么做?有服务器端解决方案吗?
【问题讨论】:
标签: ruby-on-rails ruby iframe
如果您使用的是 JQuery...(此处安装说明:http://jquery.com/)
$(document).ready(function(){
if( window == window.top) { $('form#myform').hide(); }
});
如果窗口不是最顶层的窗口,它只会隐藏 ID 为“myform”的表单。
【讨论】:
我想不出纯粹的服务器端方式,但你可以使用一些混合 javascript/rails。
假设您有一个专用的 iframe 布局模板,例如'布局/iframe.erb'
您可以在头部放置一些 javascript 来检查它是否作为 iframe 加载,如果不是,则重定向到一个操作并可能显示一个 flash 消息“只能在应用程序中加载此页面”
用于头部的 javascript/rails
<script type="text/javascript">
function parentExists()
{
return (parent.location == window.location)? true : false;
};
function check_modal(){
if (parentExists()) {
window.location = '<%= url_for( :controller => "home", :action => 'iframe_action', :iframe_fail => 'true')%>'}
}
check_modal()
</script>
注意参数 :iframe_fail ,您可以在控制器中检查它,并在该参数存在时做任何您想做的事情,例如显示 flash msg 或重定向
示例控制器
def iframe_action
if params[:iframe_fail]
flash[:notice] = 'can only load inside app'
else
#do something else
end
end
不是很漂亮,但可能会帮助您完成工作。
【讨论】:
我的 iframe 标签是这样的
%iframe{:height => "98%", :width => "98%",:"id" => "profileIframe"}
我想在这个 iframe 中隐藏我的网页标题,因此我使用的代码如下:
var $frame = $(window.parent.frames["profileIframe"]).contents();
$frame.find('.header-ui').hide();
如果你观察到,contents() 会返回一个元素为“#document”,它是 iframe 的 html,因此在没有这个的情况下调用 javascript 将尝试访问在 iframe 背景中呈现的实际网页。
【讨论】:
您只能在客户端通过 JavaScript 进行检查。
但是:不要这样做。将网站放入 (i) 框架中有很多合法用途。在这种情况下跳出此类 iframe 或以任何方式更改您的网站只会让您的用户不高兴。
【讨论】: