Ext JS动态加载JavaScript创建窗体的方法


Posted in Javascript onJune 23, 2016

JavaScript不需要编译即可运行,这让JavaScript构建的应用程序可以变得很灵活。我们可以根据需要动态从服务器加载JavaScript脚本来创建和控制UI来与用户交互。下面结合Ext JS来说明如何从服务器上动态加载JS脚本来动态创建窗体。
 1 项目结构:
 项目结构如下:其中GetJSUI一般处理程序用来从数据库表中抓取UI配置,并返回到客户端;Contents文件夹下用HTML文件和JS库等。 

Ext JS动态加载JavaScript创建窗体的方法

2 数据库表结构
可以用下面的SQL在MSSQL中创建表,其中JavaScriptContent字段存储具体的JS脚本。 

CREATE TABLE [dbo].[Ext_Dynamic_Form](
 [ID] [nvarchar](50) NOT NULL,
 [UniName] [nvarchar](50) NULL,
 [JavaScriptContent] [nvarchar](4000) NULL,
 [Memo] [nvarchar](200) NULL,
 CONSTRAINT [PK_Ext_Dynamic_Form] PRIMARY KEY CLUSTERED 
(
 [ID] ASC
)
) ON [PRIMARY]

Ext JS动态加载JavaScript创建窗体的方法

创建好后,可以初始化数据:

Ext JS动态加载JavaScript创建窗体的方法

创建好后,可以初始化数据:

4 GetJSUI 编程 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CMCloudDBHelper;
namespace extjs6.Services
{
 /// <summary>
 /// author:jackwangcumt
 /// </summary>
 public class GetJSUI : IHttpHandler
 {

 public void ProcessRequest(HttpContext context)
 {
  string js = "";
  context.Response.ContentType = "text/plain";
  //context.Response.ContentType = "text/javascript";
  CMCDataAccess da = new CMCDataAccess();
  string SQLForJS = "select * FROM Ext_Dynamic_Form where ID='006'";
  System.Data.DataTable dt= da.GetDataTable(SQLForJS);
  if(dt!=null)
  {
  if(dt.Rows.Count==1)
  {
   js = dt.Rows[0]["JavaScriptContent"].ToString();
  }

  }
  
  //utf-8
  context.Response.ContentEncoding = System.Text.Encoding.UTF8;
  context.Response.Write(js);

 }

 public bool IsReusable
 {
  get
  {
  return false;
  }
 }
 }
}

5 主界面html 

<html>
<head>
 <title>Dynamically generate forms from server javascript</title>
 <!-- Library Files -->
 <meta http-equiv="X-UA-Compatible" content="IE=edge" charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
 <script type="text/javascript" src="ext6/ext-all-debug.js"></script>
 <link rel="stylesheet" type="text/css" href="ext6/classic/theme-triton/resources/theme-triton-all-debug.css">
 <script type="text/javascript" src="ext6/classic/theme-triton/theme-triton-debug.js"></script>
 <script type="text/javascript">
 //load *.js file from server
 function loadScript(url, callback) {

 var script = document.createElement("script")
 script.type = "text/javascript";

 if (script.readyState) { //IE
 script.onreadystatechange = function() {
 if (script.readyState == "loaded" ||
  script.readyState == "complete") {
  script.onreadystatechange = null;
  callback();
 }
 };
 } else { //Others
 script.onload = function() {
 callback();
 };
 }
 script.src = url;
 document.getElementsByTagName("head")[0].appendChild(script);
 }
 //load js text from server
 function loadScriptSrc(js, callback) {

 var script = document.createElement("script")
 script.type = "text/javascript";
 //script.async = true;
 if (script.readyState) { //IE
 script.onreadystatechange = function() {
 if (script.readyState == "loaded" ||
  script.readyState == "complete") {
  script.onreadystatechange = null;
  callback();
 }
 };
 } else { //Others
 script.onload = function() {
 callback();
 };
 }
 
 script.text = js;
 console.log(script);
 document.getElementsByTagName("head")[0].appendChild(script);
 //不能少
 callback();
 }
 //Ext JS 6
 Ext.onReady(function() {
 //https://www.sencha.com/forum/showthread.php?268193-How-to-load-content-dynamically-for-tabpanel
 var pmain = Ext.widget('panel', {
 renderTo: document.body,
 height: 800,
 width: 800,
 layout: 'border',
 items: [{
 title: 'West',
 region: 'west',
 width: 200,
 collapsible: true
 }, {
 xtype: 'tabpanel',
 region: 'center',
 items: [{
  title: 'First Tab',
  itemId: 'tab01',
 }, {
  title: 'Second Tab',
  layout: 'fit',
  loader: {
  url: 'Form.json',
  autoLoad: true,
  renderer: 'component'
  }
 }]
 }]
 });
 //ajax config
 var reqConfig = {
  url: '../Services/GetJSUI.ashx',
  method: 'get',
  callback: function (options, success, response) {
  
  // var msg = ['success:', success, '\n', 'data:', response.responseText];
  // alert(msg.join(''));
  loadScriptSrc(response.responseText, function() {
  Ext.Msg.alert("loaded js","从服务器加载JS完成");

  var gp = Ext.create("gpView");
 
  Ext.ComponentQuery.query('#tab01')[0].add(gp);


  });
  }
 };
 Ext.Ajax.request(reqConfig);

 //loadScript("dynamicLoadJS2.js", function() {
 // Ext.Msg.alert("loaded");

 // var gp = Ext.create("gpView");
 // //console.log(gp);
 // //gp.body.renderTo(pmain);
 // // Ext.ComponentQuery.query('#tab01')[0].add({
 // // html: 'Oh, Hello.'
 // // });
 // Ext.ComponentQuery.query('#tab01')[0].add(gp);


 //});


 });
 </script>
</head>

<body>
</body>

</html>

6 运行

 这样我们可以做一个主框架,然后构建菜单和权限等通用体系,通过在数据库中配置菜单及UI,可以动态扩展应用。

Ext JS动态加载JavaScript创建窗体的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
两个DIV等高的JS的实现代码
Dec 23 Javascript
利用JQuery为搜索栏增加tag提示
Jun 22 Javascript
Dom操作之兼容技巧分享
Sep 20 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
Feb 26 Javascript
javascript实现字符串反转的方法
Feb 05 Javascript
jQuery实现div横向拖拽排序的简单实例
Jul 13 Javascript
jquery拼接ajax 的json和字符串拼接的方法
Mar 11 Javascript
Vue.js框架路由使用方法实例详解
Aug 25 Javascript
vuedraggable+element ui实现页面控件拖拽排序效果
Jul 29 Javascript
使用webpack/gulp构建TypeScript项目的方法示例
Dec 18 Javascript
javascript实现计算器功能
Mar 30 Javascript
Vue实现附件上传功能
May 28 Javascript
jQuery UI结合Ajax创建可定制的Web界面
Jun 22 #Javascript
JavaScript基于原型链的继承
Jun 22 #Javascript
jQuery和hwSlider实现内容响应式可触控滑动切换效果附源码下载(二)
Jun 22 #Javascript
基于jQuery和hwSlider实现内容左右滑动切换效果附源码下载(一)
Jun 22 #Javascript
浅析jQuery Ajax通用js封装
Jun 22 #Javascript
Javascript如何判断数据类型和数组类型
Jun 22 #Javascript
最全的Javascript编码规范(推荐)
Jun 22 #Javascript
You might like
PHP中实现进程间通讯
2006/10/09 PHP
追求程序速度,而不是编程的速度
2008/04/23 PHP
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
PHP通过header实现文本文件下载的代码
2010/08/08 PHP
查找mysql字段中固定字符串并替换的几个方法
2012/09/23 PHP
php实现在线生成条形码示例分享(条形码生成器)
2013/12/30 PHP
php生成固定长度纯数字编码的方法
2015/07/09 PHP
实例:尽可能写友好的Javascript代码
2006/10/09 Javascript
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
Jquery 获取checkbox的checked问题
2011/11/16 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
jQuery将多条数据插入模态框的示例代码
2014/09/25 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
原生JS实现ajax与ajax的跨域请求实例
2017/12/01 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
Javascript三种字符串连接方式及性能比较
2019/05/28 Javascript
layui文件上传控件带更改后数据传值的方法
2019/09/23 Javascript
[02:44]DOTA2英雄基础教程 魅惑魔女
2014/01/07 DOTA
Python2.x中文乱码问题解决方法
2015/06/02 Python
python中使用序列的方法
2015/08/03 Python
python实现多层感知器
2019/01/18 Python
Python任务调度模块APScheduler使用
2020/04/15 Python
Python使用Selenium实现淘宝抢单的流程分析
2020/06/23 Python
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
幼儿园实习自我鉴定
2013/12/15 职场文书
销售主管竞聘书
2014/03/31 职场文书
党的群众路线教育实践活动学习笔记范文
2014/11/06 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
员工工作失职检讨书范文!
2019/07/03 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
Nginx工作原理和优化总结。
2021/04/02 Servers
用基于python的appium爬取b站直播消费记录
2021/04/17 Python
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers