`
zachary.guo
  • 浏览: 487184 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

javascript 动态创建 <script> 节点所想到的其它问题

阅读更多
        最近公司的项目中,有一个模块需要调用集团提供的数据文件(本质上是一 js 文件,存储的是 json 对象)。公司项目的域名和集团的域名不一样,ajax 为了安全考虑,不允许异域调用(某些 js 框架实现了异域调用,如 dojo,这里我不打算使用 dojo 的 ajax),因此我们可以通过在页面动态创建 script 节点:
/**
 * 该段代码使用了 prototype.js,这里略过 prototype.js 的引入
 * 使用 document.createElement 的方式动态创建 script 脚本
 * 
 * @param scriptId <script> 节点的 id
 * @param url 请求的 js 的 url
 * @param callback 加载完 js 后的回调函数
 */
function loadScript(scriptId, url, callback) {
  // 根据 url 中是否出现过 "?" 来决定添加时间戳参数时使用 "?" 还是 "&"
  var paramPrefix = url.indexOf("?") == -1 ? "?" : "&";
  url = url + paramPrefix + "rnd=" + new Date();
  var script = $(scriptId);
  // 没有 id 为 scriptId 的 script 节点,创建并附加到 document.body 上
  if (!script) {
    script = document.createElement("script");
    script.id = scriptId;
    document.body.appendChild(script);
  }
  script.src = url;
  
  // script 节点创建后,加载 url 所指定的资源后,可以进行后续处理
  // 不同浏览器判断加载是否完成的回调不一样
  
  // for firefox, google etc.
  script.onload = function() {
    if (callback) {
      callback();
    }
    
    /**
     * 对于创建过的 scriptId,传递的 url 即使在改变,firefox 中并不会再去加载,ie 是当每次 script
     * 的 url 改变时重新加载资源。为了解决在 firefox 中改变 url 不重新加载的问题,这里把上次加载资源
     * 成功后的回调函数执行完毕后,将 script 节点移除,下次就会重新创建 script 节点。
     */
    document.body.removeChild(script);
  }
  // for ie
  script.onreadystatechange = function() {
    if (this.readyState == "loaded" || this.readyState == "complete") {
      if (callback) {
        callback();
      }
    }
  }
};

        上述代码在 callback 函数中可以处理异域返回的 js,但这里又出现了一个问题。公司项目统一采用的是 UTF-8 编码,而集团采用的却是 GBK 编码,因此通过上述代码,我们在异域上拿到的 response 的编码和页面编码不一致,这就导致了乱码的出现。而 javascript 本身不能处理各种字符编码间的转换。可我们知道,java 是可以处理字符编码间的转换的,基于这点,我们大概知道了思路。

        PS:  之后,我和集团的同事沟通了下,其实解决这个很简单,为 script 指定编码即可。即在上述代码的第 20 行 添加:script.charset = "GBK";。但下面阐述的方法也是一种解决方案,能用那一句话解决问题的,其实也就没有必要用下面的方法了。

        我们在页面发送 ajax 请求,发送的参数就是异域资源的 url。公司项目的服务器在接到这个 ajax 请求后,再通过 http 调用(ajax 传来的异域资源的 url),拿到异域返回的页面字符串(这里异域返回的是 js 片段,java 程序仍然认为是字符串),这里,java 程序可以自由地进行字符编码的转换。最后,将处理好编码的字符串发送至客户端(这里由于知道是 js,而且是 json 对象,我们可以在 java 代码中使用 renderJSON 直接向客户端输出 json)即可:
/**
 * 该段代码使用了 prototype.js,这里略过 prototype.js 的引入
 * 通过 ajax 请求拿到异域的数据
 *
 * @param (String) dataUrl 异域资源的地址
 * @param (Function) callback 成功拿到异域数据后的回调函数 
 */
function loadData(dataUrl, callback) {
  var url = contextPath + "/quotation/qc!loadData.action";
  new Ajax.Request(url, {
    encoding:"UTF-8",
    method:"post",
    // dataUrl 即是向异域请求的数据地址
    parameters: {dataUrl: dataUrl},
    onComplete: function(response) {
      if (callback) {
        callback(response);
      }
    }
  });
};

// 使用 loadData 的示例
loadData("http://res.test.com/some.js", function(response) {
	eval(response.responseText);
	// 假设异域返回的数据为:var data = { server: "apache", version: "1.0" };
	// 通过 eval 后,我们可以使用 data
	alert(data.server);
});
分享到:
评论

相关推荐

    javascript 授课 学习 课件

    `&lt;title&gt;`的子节点是文本节点"DOM Tutorial",`&lt;p&gt;`的子节点是文本节点"Hello world!"。`&lt;h1&gt;`和`&lt;p&gt;`是同辈节点,而"Hello world!"是`&lt;body&gt;`的后代。 掌握JavaScript及其与DOM的关系对于创建交互式、动态的Web...

    JS动态创建html节点

    ### JS动态创建HTML节点 #### 知识点一:JavaScript操作DOM 在Web开发中,JavaScript经常被用来操作文档对象模型(Document Object Model,简称DOM)。DOM是一种将文档(如HTML文档)转换为树状结构的标准,使得...

    javascript动态修改Li节点值的方法.docx

    ### JavaScript 动态修改 Li 节点值的方法 #### 概述 在Web开发中,经常需要通过JavaScript来动态地操作DOM元素,比如修改列表项(`&lt;li&gt;`元素)的内容。这种需求常见于交互式的网站应用中,例如允许用户编辑页面上...

    javascript_动态创建表格

    总结来说,使用JavaScript动态创建和管理表格是一种非常实用且强大的功能,可以帮助开发者根据用户的需求实时调整表格结构。通过上述方法的介绍,你可以更灵活地控制表格的显示效果,提高用户体验。

    JavaScript dtree

    &lt;script src="dTree.js"&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;div id="treeDiv"&gt; &lt;ul id="tree"&gt; &lt;li&gt;节点1 &lt;ul&gt; &lt;li&gt;子节点1.1&lt;/li&gt; &lt;li&gt;子节点1.2&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;节点2&lt;/li&gt; &lt;/ul&gt; &lt;/div&gt; &lt;script&gt; ...

    JS标签详解

    6. 动态加载:使用JavaScript动态创建`&lt;script&gt;`元素并插入到DOM中,可以实现按需加载,提高页面性能: ```javascript let script = document.createElement('script'); script.src = 'path/to/your.js'; document....

    一本实用的HTML语言教程

    9. **JavaScript与HTML交互**:通过`&lt;script&gt;`元素引入JavaScript代码,实现动态效果和用户交互。事件属性如`onclick`、`onmouseover`等可以让HTML元素响应用户操作。 10. **HTML5新特性**:HTML5引入了许多新元素...

    JavaScript动态添加css样式和script标签

    动态添加JavaScript脚本与添加CSS类似,只是需要创建的是`&lt;script&gt;`标签。以下是一个例子: ```javascript window.onload = function() { var head = document.getElementsByTagName('head')[0]; // 获取&lt;head&gt;...

    uiuc网页设计课程

    - `&lt;script&gt;`:用于嵌入JavaScript脚本。 - `&lt;link&gt;`:用于引入外部CSS样式表。 ### DOM(Document Object Model) DOM是HTML文档的标准模型,它将文档表示为节点树的形式。每个HTML元素都是一个节点,可以通过...

    treeview.js树控件

    &lt;script src="jquery.treeview.js"&gt;&lt;/script&gt; &lt;style&gt; .treeview { /* 添加自定义样式 */ } &lt;/style&gt; &lt;/head&gt; &lt;body&gt; &lt;ul id="myTree" class="treeview"&gt; &lt;li&gt;父节点1 &lt;ul&gt; &lt;li&gt;子节点1.1&lt;/li&gt; &lt;li&gt;子...

    treeViewControl js实现treeview效果

    &lt;li&gt;子节点1.1&lt;/li&gt; &lt;li&gt;子节点1.2&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;节点2&lt;/li&gt; &lt;/ul&gt; ``` 接下来,我们可以使用JavaScript(如jQuery)来添加交互性。例如,监听`click`事件,当用户点击`&lt;li&gt;`元素时,动态地显示或隐藏...

    jquery.nestable.js示例

    &lt;script src="path/to/jquery.nestable.js"&gt;&lt;/script&gt; ``` - **HTML 结构**:创建一个基本的 HTML 结构,使用 `dd` 和 `dl` 元素表示树形节点,`class="dd-handle"` 用于定义拖动手柄。 ```html &lt;dl id="nestable...

    jquery-treeview

    &lt;script src="jquery.treeview.min.js"&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;ul id="myTree"&gt; &lt;li&gt;节点1 &lt;ul&gt; &lt;li&gt;子节点1.1&lt;/li&gt; &lt;li&gt;子节点1.2&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;节点2&lt;/li&gt; &lt;/ul&gt; &lt;script&gt; $(document)....

    bootstrap-treeview

    2. **创建HTML结构**:在页面上创建一个无序列表(`&lt;ul&gt;`)作为树的基础结构,每个列表项(`&lt;li&gt;`)代表一个节点,可以通过设置特定的类来标记父节点和子节点。 3. **初始化组件**:使用jQuery选择器找到树的容器,...

    jquery的树

    &lt;li&gt;&lt;span&gt;子节点1.1&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span&gt;子节点1.2&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;&lt;span&gt;节点2&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;script&gt; $(document).ready(function() { $("#myTree").dtree(); }); &lt;/script&gt; ``` ##...

    用js做个简单的网页

    DOCTYPE html&gt;`声明、`&lt;html&gt;`元素作为整个文档的根节点、`&lt;head&gt;`部分用来设置元信息(如页面标题)以及`&lt;body&gt;`部分存放实际可见的内容。例如: ```html &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;我的简单网页&lt;/...

    html js实例

    此外,还有`&lt;a&gt;`用于创建链接,`&lt;img&gt;`用于插入图片,以及`&lt;div&gt;`和`&lt;span&gt;`等容器元素,用于组织和控制页面布局。 JavaScript是一种脚本语言,它在浏览器中运行,可以改变HTML文档的内容、样式和行为。使用...

    JS 树 菜单

    &lt;li&gt;子节点1.1&lt;/li&gt; &lt;li&gt;子节点1.2&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;节点2&lt;/li&gt; &lt;/ul&gt; &lt;script&gt; function toggleNode(event) { var node = event.target; if (node.tagName.toLowerCase() === 'li') { var children ...

    Jquery treeview

    &lt;script src="jquery.treeview.js"&gt;&lt;/script&gt; &lt;/head&gt; &lt;body&gt; &lt;ul id="myTreeView"&gt; &lt;li&gt;父节点1 &lt;ul&gt; &lt;li&gt;子节点1.1&lt;/li&gt; &lt;li&gt;子节点1.2&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;父节点2&lt;/li&gt; &lt;/ul&gt; &lt;script&gt; $...

    jquery树形菜单例子

    通常,这会包含`&lt;ul&gt;`和`&lt;li&gt;`元素,其中`&lt;li&gt;`元素表示节点,可以有子`&lt;ul&gt;`表示子节点。例如: ```html &lt;ul id="treeview"&gt; &lt;li&gt;父节点1 &lt;ul&gt; &lt;li&gt;子节点1.1&lt;/li&gt; &lt;li&gt;子节点1.2&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;父...

Global site tag (gtag.js) - Google Analytics