`

一种“声明式”DOM事件绑定的思路和方法

 
阅读更多

声明式编程在dojo框架里很常见,jquery mobile尤其是样式方面更是这样,在DOM加载好未渲染到页面之前,根据DOM的一些特有声明(约定好的)进行动态改变,思路很简单。

 

如果是一些很少的需求,用JQuery,大概代码如下$(function(){

  getYourDeclaredElements.each(doYourMethods);

  doYourMethod = function(){
    var data = getYourDeclarelation();
    // change this elements...
  };
});

 

我这里有一个这样的实现——由于使用了seajs,所以作为一个模块来用,简单实现了”下拉框填充“,”关联菜单“,”自动填充“,”快捷键“等

大家可以参考下,欢迎提出改进意见或更好的实现方式,Thx

 

/*
	根据约定做页面的组件初始化
	只是一个例子,可以根据具体需求和风格按照此思路实现一个
*/
define(function(require, exports, module) {
	require('jquery.autocomplete');
	require('jquery.hotkeys');

	var $ = require('jquery');
	var _ = require('underscore');
	var Log = require('log');
	var Consts = require('consts');
	var XInvoke = require('x/x.invoke');
	var XForm = require('x/x.form');

	var XCoc = {
		ns: 'data-', 
		sp: ',',

		// 自定义的attribute的值转换成参数
		genParams: function(vals, keys, options){
			var params = options || {};
			if(!vals || !keys)
				return params;

			var arr = vals.split(this.sp);
			var i = 0;
			for(; i < arr.length; i++){
				var val = arr[i];
				if(val){
					// boolean
					if('false' == val)
						val = false;

					params[keys[i]] = val;
				}
			}
			return params;
		}, 

		// 模板方法,获取目标属性的dom对象和参数,然后再回调
		init: function(suf, keys, options, fn, fnBatch){
			var attr = this.ns + suf;
			var _el = $('[' + attr + ']');
			if(_el.size() == 0)
				return;

			if(fnBatch){
				var ll = _el.map(function(){
					var params = XCoc.genParams($(this).attr(attr), keys, options);
					return {_el: $(this), params: params};
				}).get();
				fnBatch(ll);
			}else{
				_el.each(function(){
					var params = XCoc.genParams($(this).attr(attr), keys, options);
					fn($(this), params);
				});
			}
		}, 

		// *** *** *** *** *** *** *** ***
		// *** *** *** *** *** *** *** ***
		// 查询表单
		queryForm: {
			suf: 'query-form', 
			keys: [''], 

			init: function(_el, params){
			}
		},

		// 列表
		grid: {
			suf: 'grid', 
			keys: [''], 

			init: function(_el, params){
			}
		}, 

		// 下拉框
		combox: {
			suf: 'combox', 
			keys: ['key', 'url', 'targetVal', 'canBlank', 'labelWithVal'], 

			options: {url: Consts.reqUrlSufCombox, canBlank: true}, 

			init: function(_el, params){
				if(!params.key){
					Log.w(this.suf + ' key required!');
					return;
				}

				XInvoke.ai(Consts.reqUrl(params.url), {key: params.key}, function(r){
					XForm.select.optionAppend(r.ll, 
						_el, 
						params.targetVal, 
						params.canBlank, 
						params.labelWithVal, 
						'label', 'value');
				});
			}
		}, 

		// 关联菜单项
		selTrigger: {
			suf: 'sel-trigger', 
			keys: ['targetId', 'name', 'url', 'targetVal', 'canBlank', 'labelWithVal'], 

			options: {url: Consts.reqUrlSufCombox, canBlank: true}, 

			init: function(_el, params){
				if(!params.name || !params.targetId){
					Log.w(this.suf + ' name/targetId required!');
					return;
				}

				_el.change(function(){
					var val = _el.val();
					if(!val)
						return;

					var data = {};
					data[params.name] = val;
					XInvoke.ai(Consts.reqUrl(params.url), data, function(r){
						var _target = $('#' + params.targetId);
						XForm.select.optionAppend(r.ll, 
							_target, 
							params.targetVal,
							params.canBlank, 
							params.labelWithVal, 
							'label', 'value');
					});
				});
			}
		}, 

		// 自动填充
		autoComplete: {
			suf: 'auto-complete', 
			keys: ['targetId', 'url', 'minChars', 'maxItemsToShow'], 

			options: {minChars: 3}, 

			init: function(_el, params){
				if(!params.targetId || !params.url){
					Log.w(this.suf + ' targetId/url required!');
					return;
				}
				// ajax json : 
				// [{data: {result: i}, value: 'Col' + i}]
				_el.autocomplete({
					url: Consts.reqUrl(params.url), 
					minChars: params.minChars, 
					maxItemsToShow: params.maxItemsToShow, 
					remoteDataType: 'json', 
					onItemSelect: function(item){
						$('#' + params.targetId).val(item.data.result);
					}
				});
			}
		},

		// 快捷键
		shortkey: {
			suf: 'shortkey', 
			keys: ['key', 'triggerType'], 

			options: {triggerType: 'click'}, 

			init: function(_el, params){
				if(!params.key){
					Log.w(this.suf + ' key required!');
					return;
				}

				$.hotkeys.add(params.key, function(){
					_el.trigger(params.triggerType);
				});
			}
		},

		// *** *** *** *** *** *** *** ***
		// *** *** *** *** *** *** *** ***
		// 开始渲染页面和绑定事件
		coc: function(targets){
			targets = targets || ['queryForm', 
				'grid', 
				'combox', 
				'selTrigger', 
				'autoComplete',
				'shortkey'];
			_.each(targets, function(it){
				var item = XCoc[it];
				if(!item)
					return;

				XCoc.init(item.suf, item.keys, item.options, item.init);
			});
		},

		dump: ''
	};
	module.exports = XCoc;
});
 
分享到:
评论

相关推荐

    第一课vue课程介绍-011

    2. **指令**:Vue指令是预定义的特性,如`v-bind`用于动态绑定属性,`v-on`用于事件监听,`v-model`用于双向数据绑定,它们帮助开发者以声明式方式处理DOM操作。 3. **计算属性**:计算属性是基于其依赖的数据动态...

    js实现层的拖曳,很实用的哦

    虽然给定的内容没有提供完整的第二种方法的实现代码,但可以推测其实现思路与第一种方法类似,主要区别在于可能使用了更现代的DOM API和事件处理方式。 #### 3. 可能的改进点 - 使用`addEventListener`代替传统的...

    vue 中directive功能的简单实现

    Vue.js 是一款流行的前端JavaScript框架,它允许开发者创建可复用的组件,并通过声明式的语法来处理DOM操作。`directive` 是 Vue 中的一种特殊特性,它允许自定义DOM元素的行为。在本文中,我们将深入理解如何在Vue...

    JavaScript500例

    JavaScript是一种广泛用于网页和网络应用的脚本语言,它在浏览器环境中运行,为用户带来动态、交互式的网页体验。在"JavaScript500例"中,你可以期待涵盖以下几个关键知识点: 1. **基础语法**:包括变量声明(var...

    【JavaScript源代码】Vue实现进度条变化效果.docx

    Vue.js 是一种流行的前端JavaScript框架,它用于构建用户界面,具有数据绑定和组件化的特点。在本篇文档中,我们将探讨如何使用Vue实现一个简单的进度条变化效果。 首先,我们看到文档标题是“【JavaScript源代码】...

    tab标签切换

    在网页设计中,"Tab标签切换"是一种常见的交互设计模式,用于组织和展示大量信息。Tab组件能够有效地节省页面空间,提升用户体验,让用户能够轻松地在不同内容板块之间切换。本知识点将深入探讨Tab切换特效的实现...

    【毕业设计】java-springboot+vue家居日用小百货交易网站实现源码(完整前后端+mysql+说明文档+LunW).zip

    Vue.js的模板语法是其最大的特色之一,允许开发者声明式地将 DOM 绑定到底层 Vue 实例的数据。当数据变化时,DOM也会自动更新,这使得开发者可以以数据驱动的方式去编写应用,极大地提高了开发效率。 接下来,涉及...

    SSM基于Web的课堂管理系统及源码数据库和论文

    Vue的设计思想是尽量让开发者避免直接操作DOM,通过声明式的数据绑定以及组件化的方式高效开发界面。Vue的易用性和灵活性,使得开发Web界面变得简单快捷。 系统中还包含了一个重要的组成部分——数据库。数据库是...

    leantodu_微信小程序模板js代码前台前端H5页面源码.rar

    3. 数据绑定:在微信小程序中,数据绑定是通过双括号{{}}实现的,这是一种声明式编程方式,使得视图和数据模型可以保持同步。 4. 事件处理:通过addEventListener等方法可以为页面元素添加事件监听,处理用户的交互...

    vue00000000

    1. Vue.js是一种广泛使用的前端JavaScript框架,具有高灵活性和简洁性,适合快速构建交互式的Web应用。 2. Vue实例通常在HTML页面中通过创建一个挂载点(例如一个id为'app'的div)来初始化。 3. HTML5是最新的HTML...

    vue-elementui

    编程式导航是Vue.js中的一种导航控制方式,通过调用Vue Router提供的方法,如`this.$router.push`、`this.$router.replace`、`this.$router.go`等,实现页面间的跳转。这种方式在某些场景下比声明式导航更为灵活,...

    王者荣耀故事站小程序带Vue后台

    Vue的核心特性包括声明式渲染、响应式数据绑定、组件系统和指令系统等。在后端管理界面中,Vue.js可以极大地提高开发效率,通过组件化的设计思路,开发者可以将复杂的界面拆分成多个可复用的组件,每个组件负责一...

    基于springboot+vue+MySQL实现的在线考试系统+源代码+文档

    Vue的特点包括声明式渲染、组件化、虚拟DOM和响应式数据绑定。在在线考试系统中,Vue可能被用来创建交互式的试题列表、答题界面、成绩展示等组件,提高用户体验。 **3. MySQL** MySQL是一款广泛使用的开源关系型...

    SpringBoot+Vue仓库管理系统答辩PPT.pptx

    SpringBoot+Vue仓库管理系统是计算机毕业设计中的一种新型系统,该系统利用了SpringBoot框架和Vue前端技术,为仓库管理提供了一套完整的解决方案。随着社会的快速发展和人们生活水平的不断提高,对仓库管理系统的...

    基于SpringBoot+vue人事系统(源码+部署说明+演示视频+源码介绍).zip

    2. **Vue.js**: Vue.js是一款轻量级的前端MVVM框架,它提供了声明式的数据绑定和组件化功能,使得开发界面更加简洁高效。Vue.js的特性包括虚拟DOM、单向数据流、组件化开发等,适合构建用户交互丰富的Web应用。 3. ...

    Vue.js鼠标悬浮更换图片功能

    Vue的核心特性包括数据绑定和组件系统,它提供了一种声明式的将数据渲染进DOM的方式。 2. 数据绑定 在Vue.js中,数据绑定是通过双大括号{{}}来实现的,用于把变量插入到HTML中。Vue实例中data属性所定义的变量,...

    JavaScript面试题阿里巴巴JavaScript面试题 阿里巴巴

    - ES6中的类是一种更为直观的方式来定义对象的构造器和原型的方法。 #### 二、客户端与JavaScript通信的方式 客户端与JavaScript之间主要通过以下几种方式进行通信: 1. **DOM 操作**:通过修改DOM来改变页面的...

    JS.HW-某公司招聘JS程序员的上机题.rar

    1. **JavaScript基础知识**:JS是一种基于原型的弱类型语言,它允许动态类型,并且提供了丰富的内置对象和函数。在上机题中,可能会有变量声明(var、let、const)、数据类型转换、运算符优先级、条件语句(if......

    c语言学习辅导网站-JAVA-基于springBoot+vue的c语言学习辅导网站的设计与实现

    springBoot是spring框架的一个模块,它提供了一种快速、简便的方式来创建和运行基于Spring的应用程序。它能够简化基于Spring的应用开发过程,使开发者能够更专注于业务逻辑的实现。springBoot支持各种插件,可以方便...

Global site tag (gtag.js) - Google Analytics