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 相关文章推荐
JavaScript Cookie的读取和写入函数
Dec 08 Javascript
javascript倒计时功能实现代码
Jun 07 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
Dec 04 Javascript
详解AngularJS中自定义指令的使用
Jun 17 Javascript
使用jquery.form.js实现图片上传的方法
May 05 Javascript
快速解决js动态改变dom元素属性后页面及时渲染的问题
Jul 06 Javascript
angular-ui-sortable实现可拖拽排序列表
Dec 28 Javascript
weex slider实现滑动底部导航功能
Aug 28 Javascript
如何选择适合你的JavaScript框架
Nov 20 Javascript
AngularJS使用$http配置对象方式与服务端交互方法
Aug 13 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
Nov 26 Javascript
详解JavaScript中的this指向问题
Feb 05 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随机输出名人名言的代码
2012/10/07 PHP
深入解析php之sphinx
2013/05/15 PHP
DOM XPATH获取img src值的query
2013/09/23 PHP
zf框架db类的分页示例分享
2014/03/14 PHP
Web程序工作原理详解
2014/12/25 PHP
php实现从上传文件创建缩略图的方法
2015/04/02 PHP
php中 $$str 中 &quot;$$&quot; 的详解
2015/07/06 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
Laravel框架模板继承操作示例
2018/06/11 PHP
PHP 代码简洁之道(小结)
2019/10/16 PHP
jquery给图片添加鼠标经过时的边框效果
2013/11/12 Javascript
js打造数组转json函数
2015/01/14 Javascript
js判断是否按下了Shift键的方法
2015/01/27 Javascript
JS文字球状放大效果代码分享
2015/08/19 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
2015/09/28 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
2016/06/09 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
浅谈Vue的加载顺序探讨
2017/10/25 Javascript
详解JavaScript中的函数、对象
2019/04/01 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
Vue实现兄弟组件间的联动效果
2020/01/21 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
Pycharm连接远程服务器并实现远程调试的实现
2019/08/02 Python
python验证码图片处理(二值化)
2019/11/01 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
Django-migrate报错问题解决方案
2020/04/21 Python
Python 如何反方向迭代一个序列
2020/07/28 Python
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
日本酒店、民宿、温泉旅馆、当地旅行团中文预订:e路东瀛
2019/12/09 全球购物
党支部综合考察意见
2015/06/01 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js