加载没有css冲突的ajax响应(html内容数据)

Posted

技术标签:

【中文标题】加载没有css冲突的ajax响应(html内容数据)【英文标题】:Load ajax response (html content data) without css conflict 【发布时间】:2016-05-01 10:55:38 【问题描述】:

1) 我有 2 个不同的域 i) www.xxx.xom ii) www.yyy.com

2) 然后通过 ajax 将服务器调用从 xxx 页面发送到 yyy 页面

3) 获取 yyy 到 xxx 页面的 html 内容(内容包含带有内联 css 的 html 数据)

4) 现在我想将响应(html 内容)附加到我的 DOM 但没有 css 冲突(这意味着响应内容不受父 css 影响)

注意:没有 IFRAME 是否可以渲染

示例代码:

document.onreadystatechange = function () 
  if (document.readyState == "interactive") 
    var ajax_response = "<div style='color: blue;'>I m blue </div>"; // sample server reponse
    document.getElementById("child").innerHTML = ajax_response;
  
#parent div 
  color: red !important;
<div id="parent">
  <div>I m red</div>
  <div id="child"></div>
  <div>I m red too</div>
</div>

输出:红色将应用于“我是蓝色”文本(因为有 '!important' 标签)

【问题讨论】:

欢迎来到 Stack Overflow。因此,您希望添加的 HTML 和内联样式不受要添加到的页面样式的影响?我认为应该使用!important 没有“开箱即用”的解决方案。您必须根据周围容器作为选择器前缀手动重置包含的 html 的所有不需要的样式。 感谢您的评论。但是这里我们不能为内联 css 添加 !important (因为最终用户提供的数据 @Twisty 请查看示例代码。 这不会发生:***.com/questions/5080365/… 【参考方案1】:

如果我理解正确,您希望设置第一个 div 而不是第二个 div 的样式,这来自您的 ajax 调用。

#parent:first-child 
  color: red !important;

这只会影响你的 div #parent 的第一个 div

【讨论】:

我想避免只有一个 div 的父 css 一种方法是使用 IFRMAE,但我需要其他方法来解决这个问题。是否有其他解决方案可以在不冲突的情况下附加 html 内容? 您在原始帖子中说:“现在我想将响应(html 内容)附加到我的 DOM 但没有 css 冲突(这意味着响应内容不受父 css 影响)”。我的代码正是这样做的。我不明白你现在想达到什么目的? 请运行上面的代码 sn-p 并查看输出。两个语句都用红色打印,但第二个语句有蓝色(内联样式)。原因:父 div 具有带有 !important 标记的红色样式。当我们使用 iframe 而不是 div 时,它永远不会发生,因为 iframe 不继承父 css 我需要相同的功能,如果可能的话不使用 iframe【参考方案2】:

我得到了这个工作:https://jsfiddle.net/Twisty/sc6n560t/

HTML

<a id="act" href="">Action</a>

<div id="parent">
  <div>I'm red</div>
  <div id="child"></div>
  <div>Other Text</div>
</div>

CSS

#parent div 
  color: red;


div#child.content 
  all: default;

JQUERY

$(document).ready(function() 
  $("#act").click(function(e) 
    e.preventDefault();
    var ajax_response = "<div style='color: blue;'>I'm blue </div>"; // sample server reponse
    $("#child").html(ajax_response);
  );
);

这个答案是在这个问题的更新中找到的:CSS to prevent child element from inheriting parent styles

编辑:CSS 工作组正在做某事:

div.content all: default;

不知道,何时或是否会由浏览器实现。

编辑 2:截至 2015 年 3 月,除 Safari 和 IE/Edge 之外的所有现代浏览器 已实施: https://twitter.com/LeaVerou/status/577390241763467264(谢谢,@Lea 维鲁!)

【讨论】:

【参考方案3】:

在您的 xxx 页面中创建一个 div。 将此添加到您的脚本中..

$("#your_div_id").append(response_from_server)

【讨论】:

以上是关于加载没有css冲突的ajax响应(html内容数据)的主要内容,如果未能解决你的问题,请参考以下文章

Ajax 附加的内容选择器没有响应

ajax 和 mock 数据

普通 javascript 触发 css 淡出,ajax 加载内容,使用 CSS 淡入

Ajax数据爬取基本原理

将视图渲染到 ExpressJS 中的变量中(用于 AJAX 响应)

jQuery ajax 调用没有响应