声明式编程在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;
});
分享到:
相关推荐
2. **指令**:Vue指令是预定义的特性,如`v-bind`用于动态绑定属性,`v-on`用于事件监听,`v-model`用于双向数据绑定,它们帮助开发者以声明式方式处理DOM操作。 3. **计算属性**:计算属性是基于其依赖的数据动态...
虽然给定的内容没有提供完整的第二种方法的实现代码,但可以推测其实现思路与第一种方法类似,主要区别在于可能使用了更现代的DOM API和事件处理方式。 #### 3. 可能的改进点 - 使用`addEventListener`代替传统的...
Vue.js 是一款流行的前端JavaScript框架,它允许开发者创建可复用的组件,并通过声明式的语法来处理DOM操作。`directive` 是 Vue 中的一种特殊特性,它允许自定义DOM元素的行为。在本文中,我们将深入理解如何在Vue...
JavaScript是一种广泛用于网页和网络应用的脚本语言,它在浏览器环境中运行,为用户带来动态、交互式的网页体验。在"JavaScript500例"中,你可以期待涵盖以下几个关键知识点: 1. **基础语法**:包括变量声明(var...
Vue.js 是一种流行的前端JavaScript框架,它用于构建用户界面,具有数据绑定和组件化的特点。在本篇文档中,我们将探讨如何使用Vue实现一个简单的进度条变化效果。 首先,我们看到文档标题是“【JavaScript源代码】...
在网页设计中,"Tab标签切换"是一种常见的交互设计模式,用于组织和展示大量信息。Tab组件能够有效地节省页面空间,提升用户体验,让用户能够轻松地在不同内容板块之间切换。本知识点将深入探讨Tab切换特效的实现...
Vue.js的模板语法是其最大的特色之一,允许开发者声明式地将 DOM 绑定到底层 Vue 实例的数据。当数据变化时,DOM也会自动更新,这使得开发者可以以数据驱动的方式去编写应用,极大地提高了开发效率。 接下来,涉及...
Vue的设计思想是尽量让开发者避免直接操作DOM,通过声明式的数据绑定以及组件化的方式高效开发界面。Vue的易用性和灵活性,使得开发Web界面变得简单快捷。 系统中还包含了一个重要的组成部分——数据库。数据库是...
3. 数据绑定:在微信小程序中,数据绑定是通过双括号{{}}实现的,这是一种声明式编程方式,使得视图和数据模型可以保持同步。 4. 事件处理:通过addEventListener等方法可以为页面元素添加事件监听,处理用户的交互...
1. Vue.js是一种广泛使用的前端JavaScript框架,具有高灵活性和简洁性,适合快速构建交互式的Web应用。 2. Vue实例通常在HTML页面中通过创建一个挂载点(例如一个id为'app'的div)来初始化。 3. HTML5是最新的HTML...
编程式导航是Vue.js中的一种导航控制方式,通过调用Vue Router提供的方法,如`this.$router.push`、`this.$router.replace`、`this.$router.go`等,实现页面间的跳转。这种方式在某些场景下比声明式导航更为灵活,...
Vue的核心特性包括声明式渲染、响应式数据绑定、组件系统和指令系统等。在后端管理界面中,Vue.js可以极大地提高开发效率,通过组件化的设计思路,开发者可以将复杂的界面拆分成多个可复用的组件,每个组件负责一...
Vue的特点包括声明式渲染、组件化、虚拟DOM和响应式数据绑定。在在线考试系统中,Vue可能被用来创建交互式的试题列表、答题界面、成绩展示等组件,提高用户体验。 **3. MySQL** MySQL是一款广泛使用的开源关系型...
SpringBoot+Vue仓库管理系统是计算机毕业设计中的一种新型系统,该系统利用了SpringBoot框架和Vue前端技术,为仓库管理提供了一套完整的解决方案。随着社会的快速发展和人们生活水平的不断提高,对仓库管理系统的...
2. **Vue.js**: Vue.js是一款轻量级的前端MVVM框架,它提供了声明式的数据绑定和组件化功能,使得开发界面更加简洁高效。Vue.js的特性包括虚拟DOM、单向数据流、组件化开发等,适合构建用户交互丰富的Web应用。 3. ...
Vue的核心特性包括数据绑定和组件系统,它提供了一种声明式的将数据渲染进DOM的方式。 2. 数据绑定 在Vue.js中,数据绑定是通过双大括号{{}}来实现的,用于把变量插入到HTML中。Vue实例中data属性所定义的变量,...
- ES6中的类是一种更为直观的方式来定义对象的构造器和原型的方法。 #### 二、客户端与JavaScript通信的方式 客户端与JavaScript之间主要通过以下几种方式进行通信: 1. **DOM 操作**:通过修改DOM来改变页面的...
1. **JavaScript基础知识**:JS是一种基于原型的弱类型语言,它允许动态类型,并且提供了丰富的内置对象和函数。在上机题中,可能会有变量声明(var、let、const)、数据类型转换、运算符优先级、条件语句(if......
springBoot是spring框架的一个模块,它提供了一种快速、简便的方式来创建和运行基于Spring的应用程序。它能够简化基于Spring的应用开发过程,使开发者能够更专注于业务逻辑的实现。springBoot支持各种插件,可以方便...