清泛IT社区

标题: Discuz与phpsso整合时无法同步登录:通过js load 另一个 script 文件导致的问题,phpsso document.write 没有执行 [打印本页]

作者: 清泛网    时间: 2020-08-04 23:30
标题: Discuz与phpsso整合时无法同步登录:通过js load 另一个 script 文件导致的问题,phpsso document.write 没有执行
在 web 开发中,出于跨域同步、远程调用等目的,经常需要在网页中通过 script 加载另一段远程 script。
最常用最简单的方法就是直接用 document.write 输出加载脚本的 HTML,如下:
  1. document.write('<script src="http://somehost/path/to/script.js" type="text/script"></' + 'script>');
复制代码
通常来说用这个方法是没有什么问题的,但是最近在帮人分析整合 phpcms 与 discuzx 同步登录时,发现在 discuzx 登录后无论如何也没能让 phpcms 同步登录。
原因是 dz 的登录采用的是 ajax 方式,ucenter 返回的同步代码就是用上面方法向所有 APP 发起一次 JS 请求模拟登录。phpcms 自身又有一套 phpsso 的单点登录体系,它收到请求后又需要分发给更多采用 phpsso 的 APP,于是它又生成一堆如上方法的 script 输出给最终用户。
但到了最终用户这儿,由于是 ajax 异步加载的,大概算是 BUG,再次输出的 document.write(‘<script..></script>’) 不执行,造成无法同步。
目前的解决方法是在第二次需要加载 js 请求时,换用以下方式:
  1. var s = document.createElement('script');
  2. s.setAttribute("type","text/javascript");
  3. s.setAttribute("src", "http://somehost/path/to/script.js");
  4. document.body.appendChild(s);
复制代码
顺便提一下,曾经看到过文章说用 document.body.appendChild 在 IE 下有时会卡死,建议改用:
  1. document.getElementsByTagName("head")[0].appendChild(s);
复制代码


(, 下载次数: 6078)
  1. //解决二次<script>不执行的问题
  2. function format_dom($urls) {
  3.         $output = 'var s = document.createElement("script");s.setAttribute("type","text/javascript");';
  4.         foreach($urls AS $url) {
  5.                 $output .= 's.setAttribute("src", "'.addslashes(str_replace(array("\r", "\n"), array('', ''), $url)).'");document.getElementsByTagName("head")[0].appendChild(s);';
  6.         }
  7.         return $output;
  8. }
复制代码
OK.

作者: chromalyl    时间: 2023-12-05 08:46
有用,{:geiliv2:}




欢迎光临 清泛IT社区 (https://bbs.tsingfun.com/) Powered by Discuz! X3.3