接上次的帖子:http://www.cnblogs.com/yexiaochai/archive/2012/01/22/2328729.html
简单的更新了一下代码,主要针对datalist,这次主要贴出更新后的代码以及演示一下例子:
因为过年的关系,感觉自己很懒,贴出来算是一种自我激励吧,让自己有写下去的动力
② datalist编辑、删除按钮出现(还有问题)
③ datalist根据数据源、样式模板的不同展现方式不同
在datalist里面嵌套一个具体新闻的datalist,现在显示三条,
然后每个新闻类型上面有个最大化,点击则实例化一个datalist,将对应新闻类型的10条新闻列出来。
<div id="itemId" style="display:none;">{%ItemID%}</div>
<input class="maxOrMinSize" type="button" value="最大化" />
<input class="newsMore" value="详情" type="button"/>
<div style=" display:none;" class="newsContent">
datalist.js以及itemTemplate.js和Ajax后台处理程序
/// <reference path="../scripts/jquery-1.4.1.js" />
因为我们并不知道生成的dom树是什么,所以模板里面的html标签无法绑定事件,暂时只能后期绑定
var dataList = function (id, templateUrl) {
this.itemElementEvent = {};
this.templateUrl = templateUrl ? templateUrl : ""; //提供项目模板地址
this.htmlTemplateText = "";
this.dataSource = {}; //应该支持不同数据源
dataList.prototype.dataBind = function (element) {
var templateText = sender.htmlTemplateText;
var itemEvent = sender.itemEvent;
var itemElementEvents = sender.itemElementEvent;
var itemClassName = sender.itemClassName;
$.each(sender.dataSource, function (dataKey, dataValue) {
var _item = new itemTemplate();
_item.parentId = sender.attribute.id;
_item.htmlTemplateText = templateText;
_item.elementEvent = itemElementEvents;
_item.className = itemClassName;
//传递父ID ,当前模板编号,源模板,当前项数据项源,事件绑定源
_item.load(itemIndex, dataValue);
var _itemElement = _item.htmlElement;
sender.items.push(_item);
sender.insertDomItem(_itemElement);
element.append(sender.htmlElement);
var items = sender.items;
$.each(items, function (i, item) {
item.bindAllElementEvent();
dataList.prototype.buttonLoad = function () {
var htmlElement = sender.htmlElement;
var element = sender.htmlElement;
var id = sender.attribute.id;
var button = sender.deleteButton;
this.buttonBind(id + "_delete", button, element, buttonText);
button = sender.editButton;
this.buttonBind(id + "_edit", button, element, buttonText);
button = sender.cancelButton;
this.buttonBind(id + "_cancel", button, element, buttonText);
button = sender.saveButton;
this.buttonBind(id + "_save", button, element, buttonText);
dataList.prototype.buttonBind = function (id, btObj, el, buttonText) {
var visible = btObj.visible;
var clickEvent = btObj.clickEvent;
html = $("<div>" + buttonText + "</div>");
if (clickEvent && typeof (clickEvent) == "function") {
dataList.prototype.init = function () {
var templateUrl = sender.templateUrl;
if (!templateUrl || templateUrl.length == 0)
templateUrl = "itemTemplate/itemTemplate.spt";
this.htmlTemplateText = getAjaxStr(templateUrl);
var htmlElement = $("<div id='" + sender.attribute.id + "'></div>");
if (sender.className && sender.className.length > 0)
htmlElement.attr("class", sender.className);
sender.htmlElement = htmlElement;
dataList.prototype.attributeLoad = function () {
var element = sender.htmlElement;
$.each(sender.attribute, function (attributeKey, attributeValue) {
if (attributeKey != "id")
if (attributeValue && attributeValue.length > 0) {
element.attr(attributeKey, attributeValue);
dataList.prototype.styleLoad = function () {
var element = sender.htmlElement;
$.each(sender.style, function (styleKey, styleValue) {
// alert(styleKey + ":" + styleValue);
element.css(styleKey, styleValue);
dataList.prototype.insertDomItem = function (domItem) {
var element = sender.htmlElement;
function getAjaxStr(url) {
success: function (result) {
alert("模板加载错误:" + e.toString());
/// <reference path="../scripts/jquery-1.4.1.js" />
var itemTemplate = function () {
//源模板文本,现在为itemTemplate.spt
//最终形成字符串传给htmlTemplateText
this.htmlTemplateText = "";
//最终会形成一独立html字符串,dom结构的标签
this.idPrefix = "id_"; //id前缀
this.elementEvent = null;
itemTemplate.prototype.load = function (itemIndex, itemDataSource) {
var id = sender.parentId + "_" + sender.idPrefix + itemIndex;
var element = $("<div id='" + id + "'></div>");
var _templateText = sender.htmlTemplateText;
$.each(itemDataSource, function (i, item) {
var regStr = "/\\{%" + i + "%\\}/g";
tempHtm = tempHtm.replace(reg, item);
if (sender.className && sender.className.length > 0)
element.attr("class", sender.className);
sender.htmlElement = element;
itemTemplate.prototype.bindEvent = function () {
var element = sender.htmlElement;
var events = sender.event;
$.each(events, function (eventKey, funcName) {
// alert(funcKey + "---" + funcValue);
if (funcName && typeof (funcName) == "function") {
_event = _event.substring(2, _event.length);
_event = _event.toLowerCase();
element.bind(_event, function () {
itemTemplate.prototype.getItemElement = function (elementKey) {
var id = "#" + sender.id + " " + elementKey;
itemTemplate.prototype.bindAllElementEvent = function () {
var itemElementEvents = sender.elementEvent;
// alert(element+"=="+id);
$.each(itemElementEvents, function (eventObjKey, eventObj) {
var elementKey = eventObj.elementKey;
var eventType = eventObj.eventType;
var funcName = eventObj.funcName;
sender.bindElementEvent(elementKey, eventType, funcName);
itemTemplate.prototype.bindElementEvent = function (elementKey, eventType, funcName) {
var id = "#" + sender.id + " " + elementKey;
if (funcName && typeof (funcName) == "function") {
if (eventType == "ready") {
element.ready(function () {
element.unbind(eventType);
element.bind(eventType, function () {
using System.Collections.Generic;
using System.Web.UI.WebControls;
public partial class js仿net控件_02dataList_Ajax : System.Web.UI.Page
protected void Page_Load(object sender, EventArgs e)
DataAccess db = new DataAccess();
if (Request["sql"] != null)
sql = Request.QueryString["sql"].ToString();
dt = db.GetDataTable(sql);
string jsonText = getJson(dt);
Response.ContentType = "application/json";
Response.Write(jsonText);
private string getJson(DataTable dt)
string jsonText = JsonConvert.SerializeObject(dt);
private string getStr(DataTable dt)
for (int i = 0; i < dt.Rows.Count; i++)
json = json + "row_"+i.ToString()+":"+"{";
for (int j = 0; j < dt.Columns.Count; j++)
string colKey = dt.Columns[j].ColumnName;
string colValue = dt.Rows[i][j].ToString();
//colValue = colValue.Replace("\"","\\\"");
json = json + colKey + ":" + colValue + ",";
json = json.Substring(0, json.Length - 1);
json = json.Substring(0, json.Length - 1);
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<script src="scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script src="js/itemTemplate.js" type="text/javascript"></script>
<script src="js/dataList.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
url: "Ajax.aspx?sql=select top 3 * from Item where ItemKind=1 ",
success: function (data) {
var listItem = new dataList("newsItem", "itemTemplate/items.spt");
var itemElementEvents = {
funcName: elementDatabind
elementKey: ".maxOrMinSize",
funcName: newsMaxOrMinSizeClick
listItem.itemElementEvent = itemElementEvents;
listItem.dataSource = dataItems;
function newsMaxOrMinSizeClick() {
var $itemId = sender.getItemElement("#itemId");
var $maxNews = $("#maxNews");
url: "Ajax.aspx?sql=select top 10 newsId,newsName, newsContent from news where itemId='" + id + "' ",
success: function (data) {
var _itemElementEvents = {
funcName: maxContentMoreClick
var newsMaxList = new dataList("newsMax", "itemTemplate/itemMax.spt");
newsMaxList.deleteButton.visible = true;
newsMaxList.deleteButton.html = $("<input value='最小化' type='button' ></a>");
newsMaxList.deleteButton.clickEvent = newsMin;
newsMaxList.editButton.visible = true;
newsMaxList.editButton.html = $("<input value='编辑' type='button' ></a>");
newsMaxList.editButton.clickEvent = newsMin;
newsMaxList.itemEvent.onMousemove = itemmousemove;
newsMaxList.itemEvent.onMouseout = itemmouseout;
newsMaxList.itemElementEvent = _itemElementEvents;
newsMaxList.dataSource = dataNews;
newsMaxList.dataBind($maxNews);
function elementDatabind() {
var $itemId = sender.getItemElement("#itemId");
var $itemNews = sender.getItemElement("#itemNews");
var s = $itemNews.html();
url: "Ajax.aspx?sql=select top 5 newsId,newsName, newsContent from news where itemId='" + id + "' ",
success: function (data) {
var listItemNews = new dataList(id + "_news", "itemTemplate/itemTemplate.spt");
listItemNews.itemEvent.onMousemove = itemmousemove;
listItemNews.itemEvent.onMouseout = itemmouseout;
listItemNews.dataSource = dataNews;
listItemNews.dataBind($itemNews);
var $maxNews = $("#maxNews");
function maxContentMoreClick() {
var newsContent = sender.getItemElement(".newsContent");
var contentMore = sender.getItemElement(".newsMore");
if (newsContent.css("display") == "none") {
contentMore.attr("value", "隐藏");
newsContent.css("display", "");
contentMore.attr("value", "详情");
newsContent.css("display", "none");
function itemmousemove() {
var $ee = sender.htmlElement;
$ee.css("background", "Gray");
function itemmouseout() {
var $ee = sender.htmlElement;
$ee.css("background", "white");
<div id="maxNews" style=" display:none;">
[{"ItemID":79,"ParentID":0,"ItemName":"学院新闻11","ItemContent":"","ItemSort":7,"ItemKind":1,"ItemUrl":"","IsTop":0,
"IsImportant":null,"IsHome":null,"NewsSort":null},{"ItemID":150,"ParentID":79,"ItemName":"学生工作","ItemContent":"",
"ItemSort":1,"ItemKind":1,"ItemUrl":"","IsTop":1,"IsImportant":null,"IsHome":1,"NewsSort":null},{"ItemID":162,"ParentID":129
,"ItemName":"常规工作","ItemContent":"","ItemSort":4,"ItemKind":1,"ItemUrl":"","IsTop":1,"IsImportant":null,"IsHome":1,"NewsSort":null}]
var listItem = new dataList("newsItem", "itemTemplate/items.spt");
var itemElementEvents = {
funcName: elementDatabind
elementKey: ".maxOrMinSize",
funcName: newsMaxOrMinSizeClick
listItem.itemElementEvent = itemElementEvents;
listItem.dataSource = dataItems;
② 初始化datalist为其设置id与对应模板文件地址(其实数据源与模板文件后期必须想法接受多个方案,比如xml或者数组、地址什么的)
③ 因为模板里面的元素我们无法控制,所有使用jquery的选择器进行元素选择(这个必须在该元素生成结束才能事件绑定,这个地方有问题)
注意第一个事件绑定,在这里html元素生成后,便会执行此函数,但是不知道这样写有没有问题
④ 然后bind结束第一个datalist生成结束
function elementDatabind() {
var $itemId = sender.getItemElement("#itemId");
var $itemNews = sender.getItemElement("#itemNews");
var s = $itemNews.html();
url: "Ajax.aspx?sql=select top 5 newsId,newsName, newsContent from news where itemId='" + id + "' ",
success: function (data) {
var listItemNews = new dataList(id + "_news", "itemTemplate/itemTemplate.spt");
listItemNews.itemEvent.onMousemove = itemmousemove;
listItemNews.itemEvent.onMouseout = itemmouseout;
listItemNews.dataSource = dataNews;
listItemNews.dataBind($itemNews);
此处接着第一个datalist的事件绑定,绑定结束后便又初始化各个datalist,并加入对应容器中。并加上新闻列滑动事件。
function newsMaxOrMinSizeClick() {
var $itemId = sender.getItemElement("#itemId");
var $maxNews = $("#maxNews");
url: "Ajax.aspx?sql=select top 10 newsId,newsName, newsContent from news where itemId='" + id + "' ",
success: function (data) {
var _itemElementEvents = {
funcName: maxContentMoreClick
var newsMaxList = new dataList("newsMax", "itemTemplate/itemMax.spt");
newsMaxList.deleteButton.visible = true;
newsMaxList.deleteButton.html = $("<input value='最小化' type='button' ></a>");
newsMaxList.deleteButton.clickEvent = newsMin;
newsMaxList.editButton.visible = true;
newsMaxList.editButton.html = $("<input value='编辑' type='button' ></a>");
newsMaxList.editButton.clickEvent = newsMin;
newsMaxList.itemEvent.onMousemove = itemmousemove;
newsMaxList.itemEvent.onMouseout = itemmouseout;
newsMaxList.itemElementEvent = _itemElementEvents;
newsMaxList.dataSource = dataNews;
newsMaxList.dataBind($maxNews);
那撒,说是详细说明好像也不详细。最后效果是想以此为基础模拟igoogle的效果。可惜我不是美工,我那个悲剧的css水平确实不行。
本文转自叶小钗博客园博客,原文链接http://www.cnblogs.com/yexiaochai/archive/2012/01/25/2329489.html,如需转载请自行联系原作者