8

我将剃刀视图包装在 iframe 中。剃刀视图是不同域上的 Web 服务。

这是我正在做的事情:

<!DOCTYPE html>
<html>
<body>

<p align="center">
    <img src="http://somewhere.com/images/double2.jpg" />
</p>

<p align="center">
<iframe src="https://secure.somewhereelse.com/MyPortal?CorpID=12334D-4C12-450D-ACB1-7372B9D17C22" width="550" height="600" style="float:middle">
  <p>Your browser does not support iframes.</p>
</iframe>
</p>
</body>
</html>

这是 src 站点的标题:

<!DOCTYPE html>
<html>
<head>
    <title>@ViewBag.Title</title>
    <link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
    <link href="@Url.Content("~/Content/themes/cupertino/jquery-ui-1.8.21.custom.css")" rel="stylesheet" type="text/css" />
    <script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
    <script src="@Url.Content("~/Scripts/jquery-ui-1.8.11.min.js")" type="text/javascript"></script>
</head>

我希望 iframe src 使用调用站点的 CSS。

有没有办法传入 CSS URL 或让它继承调用站点的 CSS?

我什至愿意将 css 文件位置作为从原始站点传入的参数。

有人有什么建议吗?

4

4 回答 4

6

您不能使用 iframe 在您的网站上强制执行您的 css。css 必须包含在 iframe 中包含的页面的源代码中。它曾经是可能的,但在某些情况下使用 javascript,并且页面位于同一个域上。

您可以使用自己的 css 的唯一其他方法是 Web 服务允许您传入 css 的 url。但是您必须查阅 Web 服务的文档才能找到答案。

于 2012-08-07T01:38:03.213 回答
5

我会将 CSS url 作为参数传递给iframe'src属性:

<iframe src="http://somedomain.com/?styleUrl=@(ResolveStyleUrl())"></iframe>

哪里ResolveStyleUrl可以定义为:

@functions {

  public IHtmlString ResolveStyleUrl()
  {
    string url = Url.Content("~/Content/site.css");
    string host = "http" + (Request.IsSecureConnection ? "s" : "") + "//" + Request.Url.Host + url;
    return Raw(url);
  }

}

这当然是假设域将接受样式 url 查询字符串并<link />在远程页面上呈现适当的?

于 2012-08-07T10:37:45.047 回答
5

Eroc,很抱歉您不能使用 iframe 在其他网站上强制执行您的 css,因为大多数浏览器会给出一个错误,就像 chrome 给出的那样:

不安全的 JavaScript 尝试使用 URL http://terenceford.com/catalog/index.php访问框架?从带有 URL http://www.example.com/example.php的框架。域、协议和端口必须匹配。

但这并不意味着您不能从该页面中提取 html(可以根据您的需要进行修改



http://php.net/manual/en/book.curl.php可用于使用http://simplehtmldom.sourceforge.net/进行站点报废

首先玩这些功能:

curl_init();
curl_setopt(); 
curl_exec();
curl_close();

然后解析html。

自己试过之后可以看下面这个我做的解析beemp3内容的例子,当时我想创建一个直接下载歌曲的丰富工具,可惜因为验证码我做不到,但对你有用


目录结构

C:\wamp\www\尝试

-- simple_html_dom.php

--try.php


尝试.php:

<?php
/*integrate results for dif websites seperately*/
require_once('simple_html_dom.php');
$q='eminem';
$mp3sites=array('http://www.beemp3.com/');
$ch=curl_init("{$mp3sites[0]}index.php?q={$q}&st=all");
curl_setopt($ch,CURLOPT_HEADER,0);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
//curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
$result=curl_exec($ch);
curl_close($ch);
$html=str_get_html("{$result}");
$ret = $html->find("a");

echo "<head><style type='text/css'>a:link,a{font-size:16px;font-weight:bold;font-family:helvetica;text-decoration:none;color:#458;}a:hover{color:#67b;text-decoration:underline;}a:visited{color:silver;}</style></head>";
$unik=array(null);
foreach($ret as $link)
{
$find="/(.{1,})(\.php)[?](file=.{1,})&song=(.{1,})/i";
$replace="$4";
if(preg_match("{$find}",$link->href))
    {
    $unik[]=$link->href;
    if(current($unik)===prev($unik)){unset($unik);}
    else{
    echo "<a href='".$mp3sites[0].$link->href."'>".urldecode(preg_replace($find,$replace,$mp3sites[0].$link->href))."</a><br/>";
    }}
}
?>

我知道您不会在 php 中编写代码,但我认为您能够翻译代码。看看这个: php to C#转换器

我花时间在这个问题上,因为只有我能理解提供赏金意味着什么。可能答案似乎无关(因为我没有使用基于 javascript 或 html 的解决方案),但由于跨域问题,这对您来说是一个重要的教训。我希望你能在 c# 中找到类似的库。祝你好运

于 2012-08-07T15:10:53.513 回答
2

我知道实现这一点的唯一方法是在您的服务器端发出 HTTP 请求,获取结果并将其返回给用户。

最低限度,您需要从目标站点完全剥离标题以使用 AJAX 在您的页面中注入内容,或者在页面标题中注入您自己的 css 以将其放入 IFRAME。

无论哪种方式,您都必须实现代理方法,它将目标 URL 作为参数。

这种技术有很多缺点:

  1. 您必须在服务器上进行查询,这会消耗大量带宽和 CPU
  2. 你必须实现代理
  3. 您不能从用户那里传输特定于域的 cookie,尽管您可以通过重写来管理新的 cookie
  4. 如果您发出大量请求,您的服务器可能会被列入目标网站的黑名单

与麻烦相比,好处听起来很低。

于 2012-08-07T17:06:11.670 回答