gpt4 book ai didi

javascript - 在不受主机页面 CSS 影响的跨域主机页面中创建嵌入式 JavaScript?

转载 作者:IT王子 更新时间:2023-10-29 03:22:54 26 4
gpt4 key购买 nike

大多数可以嵌入到网站中的 javascript 小部件都使用以下结构。首先,您嵌入一段代码,如下所示:

<script type="text/javascript">
window.$zopim||(function(d,s){var z=$zopim=function(c){
z._.push(c)},
$=z.s=d.createElement(s),
e=d.getElementsByTagName(s)[0];
z.set=function(o){
z.set._.push(o)
};
z._=[];
z.set._=[];
$.async=!0;
$.setAttribute('charset','utf-8');
$.src='//v2.zopim.com/?2342323423434234234';
z.t=+new Date;
$.type='text/javascript';
e.parentNode.insertBefore($,e)})(document,'script');
</script>

然后,当加载您的页面时,此脚本会创建如下 html 结构:

<div class="widget-class">
<iframe src="about:blank">
// the content of the widget
</iframe>
</div

我在许多聊天服务中看到了相同的结构,例如:

https://en.zopim.com/ 
http://banckle.com/
https://www.livechatinc.com/

它们的 iframe 都有一个共同点,即没有 src,即附加的 URL。

更新:这是我用来将我的小部件代码加载到第三方网站的脚本:

<script type="text/javascript">
(function(d){
var f = d.getElementsByTagName('SCRIPT')[0], p = d.createElement('SCRIPT');
window.WidgetId = "1234";
p.type = 'text/javascript';
p.setAttribute('charset','utf-8');
p.async = true;
p.src = "//www.example.com/assets/clientwidget/chatwidget.nocache.js";
f.parentNode.insertBefore(p, f);
}(document));
</script>

我希望集成了 GWT 小部件的站点的 CSS 不应影响 GWT 小部件的 CSS。我将防止主机页面的 CSS 影响我的 GWT 小部件的 CSS。

注意:我也想从我的 GWT 小部件访问主机网站。
主机页面的域是 www.example.com,iframe 的域是 www.widget.com。我还想从 iframe 设置主机域的 cookie。

构建运行在这种结构上的小部件的过程是什么? iframe的内容是怎么设置的?有这样的模式吗?我怎样才能用 GWT 做到这一点

最佳答案

我不知道 GWT,但您可以使用纯 JavaScript 轻松实现。

假设您正在创建一个在线计数小部件。首先,创建一个 iframe:

<script id="your-widget">
// Select the script tag used to load the widget.
var scriptElement = document.querySelector("your-widget");
// Create an iframe.
var iframe = document.createElement("iframe");
// Insert iframe before script's next sibling, i.e. after the script.
scriptElement.parentNode.insertBefore(iframe, scriptElement.nextSibling);
// rest of the code
</script>

然后使用 JSONP 获取在线计数(参见 What is JSONP all about? ),例如:

// The URL of your API, without JSONP callback parameter.
var url = "your-api-url";
// Callback function used for JSONP.
// Executed as soon as server response is received.
function callback(count) {
// rest of code
}
// Create a script.
var script = document.createElement("script");
// Set script's src attribute to API URL + JSONP callback parameter.
// It makes browser send HTTP request to the API.
script.src = url + "?callback=callback";

然后处理服务器响应(在 callback() 函数内):

// Create a div element
var div = document.createElement("div");
// Insert online count to this element.
// I assume that server response is plain-text number, for example 5.
div.innerHTML = count;
// Append div to iframe's body.
iframe.contentWindow.document.body.appendChild(div);

就是这样。您的整个代码可能如下所示:

要插入第三方网站的代码段:

<script type="text/javascript">
(function(d){
var f = d.getElementsByTagName('SCRIPT')[0], p = d.createElement('SCRIPT');
window.WidgetId = "1234";
p.type = 'text/javascript';
p.setAttribute('charset','utf-8');
p.async = true;
p.id = "your-widget";
p.src = "//www.example.com/assets/clientwidget/chatwidget.nocache.js";
f.parentNode.insertBefore(p, f);
}(document));
</script>

服务器上的 JavaScript 文件:

// Select the script tag used to load the widget.
var scriptElement = document.querySelector("#your-widget");
// Create an iframe.
var iframe = document.createElement("iframe");
// Insert iframe before script's next sibling, i.e. after the script.
scriptElement.parentNode.insertBefore(iframe, scriptElement.nextSibling);

// The URL of your API, without JSONP callback parameter.
var url = "your-api-url";
// Callback function used for JSONP.
// Executed as soon as server response is received.
function callback(count) {
// Create a div element
var div = document.createElement("div");
// Insert online count to this element.
// I assume that server response is plain-text number, for example 5.
div.innerHTML = count;
// Append div to iframe's body.
iframe.contentWindow.document.body.appendChild(div);
}
// Create a script.
var script = document.createElement("script");
// Set script's src attribute to API URL + JSONP callback parameter.
// It makes browser send HTTP request to the API.
script.src = url + "?callback=callback";

关于javascript - 在不受主机页面 CSS 影响的跨域主机页面中创建嵌入式 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34599622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com