开源框架之TAB控件
我的开源框架之TAB控件
需求
(1)支持iframe、html、json格式的tab内容远程请求
(2)支持动态添加tab
(3)支持远程加载完成监听,支持tab激活事件监听
(4)支持reload tab内容【如果是远程加载】
(5)支持邮件菜单【未实现】
实现图例
客户代码
1 <body>
2 <div id="text">
3 <h3>无题</h3>
4 <p>月落湖面两清影,</p>
5 <p>岸柳丝丝弄轻盈。</p>
6 <p>此番凉意写不出,</p>
7 <p>难画秋月一片晴。</p> </div>
8 <div style="padding-left:100px; padding-bottom:12px;">
9 <div id="tabContainer" style="width:800px;height:260px">
10 <div title="静态html" closable="true" >项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1项目1</div>
11 <div title="iframe加载" isiframe="true" url="/innerpage.html" iconcls="icon-edit" closable="true">
12 </div>
13 <div title="远程HTML加载" dataType="html" url="/content.html" iconcls="icon-save" closable="true">
14 </div>
15 </div>
16 </div>
17 <script type="text/javascript">
18 var tabs;
19 $(function () {
20 tabs = $("#tabContainer").tabs({
21 items: [{
22 title: '远程加载JSON数据',
23 closable: false,
24 iconcls: 'icon-print',
25 actived: true,// 激活状态
26 url: 'testServer/jsonQuestTest.ashx',//如果不配置采用公用 $.fn.tabs.defaults里的配置
27 dataType: 'json'// //如果不配置采用公用 $.fn.tabs.defaults里的配置
28 },{
29 title: '文本测试',
30 closable: false,
31 iconcls: 'icon-back',
32 actived: false,// 激活状态
33 content: $("#text") //'<a>我是测试内容.....................</a>'// 可以是文本,可以是$("#id")对象
34 }],
35 onLoadSuccess: function (title, context) {
36 console.log(title + "加载完成");
37 if (title == "远程加载JSON数据" || title == "动态添加tab") {
38 context.target.html(JSON.stringify(context.data));
39 }
40 },
41 activedHandler: function (tilte,context) {
42 console.log("actived=" + tilte);
43 },
44 closedHandler: function (title) {
45 console.log("closed=" + title);
46 }
47 });
48 });
49 function addTab() {
50 tabs.tabs("addTabs", {
51 title: '动态添加tab',
52 closable: true,
53 iconcls: 'icon-back',
54 actived: false,// 激活状态
55 //content: '<a>我是动态tab内容</a>'
56 url: 'testServer/jsonQuestTest.ashx',//如果不配置采用公用 $.fn.tabs.defaults里的配置
57 dataType: 'json',// //如果不配置采用公用 $.fn.tabs.defaults里的配置
58 onLoadSuccess: function (title, context) {
59 context.target.html(title+"loadsucc;我自己注册的事件 "+JSON.stringify(context.data));
60 }
61 });
62 }
63 function getSelectedTab() {
64 var res = tabs.tabs("getSelectedTab");
65 alert(res.titleObj.attr("title"));
66 }
67 function reload() {
68 var itemsopt = $("#itemsopt").children("option[selected]");
69 tabs.tabs("reLoadTab", itemsopt.val());
70 if (tabs.tabs("isExist", itemsopt.val())) {
71 console.log(itemsopt.val()+"exist");
72 } else {
73 console.log(itemsopt.val() + "no exist");
74 }
75
76 }
77 </script>
78 </body>
组件代码
1 /**************************************************************
2 *作者:hjwen
3 *电邮:hjwen88@126.com
4 *版本:1.0
5 *版权许可:中国通用开源许可协议V1.0
6 *说明:myui组件tabs组件
7 ***************************************************************/
8 (function ($) {
9 /******
10 *渲染目标:renderHtml为构建html结构的函数,init初始化会调用
11 *******/
12 var contentPadding = 6;
13 var showTitleItem = null;
14 var showContentItem = null;
15 var itemTitleContainer, itemContentContainer, existItems;
16 var headerWith = 0;
17 var itemsWidth = 0;
18 var leftMoreBtn = null, rightMoreBtn = null;
19 function renderHtml(target, opts) {
20 itemContentContainer = target;
21 var panel = target.panel({ expandable: false, maximizable: false, closeable: false, expanded: false });
22 var titleWrap = target.prev("div");
23 headerWith = titleWrap.width();
24 var panelTitle = titleWrap.children(".panel-tilte");
25 itemTitleContainer = $("<ul class=\"tabsul\"></ul>").appendTo(panelTitle);
26 target.css({ "overflow": "hidden", "padding": "0px" });
27 existItems.css({ "width": target.width() - contentPadding * 2 + "px", "height": target.height() - contentPadding * 2 + "px", "margin": "0px", "padding": contentPadding + "px", "overflow": "auto" }).hide();
28 createTabs(opts.items);
29 existItems = null;
30 };
31 /**********私有方法开始********************/
32 function createTabs(items) {
33 $.each(items, function (i, item) {
34 createTab(item, i);
35 });
36 showContentItem.show();
37 showTitleItem.attr("actived", "true").children("a").addClass("tabs_selected").css("border-bottom", "1px solid #FFFFFF");
38 }
39 function createTab(item, index) {
40 //创建tab标题项
41 var a_tag = "<a href='javascript:void(0)'>";
42 if (item.iconcls != '')
43 a_tag = a_tag + "<span class='item_title_ioc " + item.iconcls + "'></span>";
44 if (item.closable)
45 a_tag = a_tag + "<span class='item_title_text'>" + item.title + "</span><span for=" + index + " class='item_title_close' ></span></a>";
46 else
47 a_tag = a_tag + "<span class='item_title_text'>" + item.title + "</span></a>";
48 var itemTitleLi = $("<li contextmenu=\"" + item.contextMenu + "\" datatype=\"" + item.dataType + "\" url=\"" + item.url + "\" isiframe=\"" + item.isiframe + "\" title=\"" + item.title + "\" closable=\"" + item.closable + "\" actived=\"" + item.actived + "\" for=" + index + ">" + a_tag + "</li>").appendTo(itemTitleContainer);
49 itemTitleLi.bind({
50 "click": function () {
51 var $this = $(this);
52 if ($this.attr("actived") == "true")
53 return;
54 var idx = $this.attr("for");
55 showContentItem.hide();
56 showTitleItem.attr("actived", "false").children("a").removeClass("tabs_selected").css("border-bottom", "1px solid #99BBE8");
57 $.each(itemContentContainer.children("div"), function (j, obj) {
58 var $obj = $(obj);
59 if (j == parseInt(idx)) {
60 $this.attr("actived", "true").children("a").addClass("tabs_selected").css("border-bottom", "1px solid #FFFFFF");
61 showContentItem = $obj.show();
62 showTitleItem = $this;
63 }
64 });
65 if (item.activedHandler != null) {
66 item.activedHandler(showTitleItem.attr("title"), { titleObj: showTitleItem, conetentObj: showContentItem });
67 }
68 }
69 });
70 //如果可以关闭
71 if (item.closable) {
72 itemTitleLi.children("a").children(".item_title_close").bind({
73 click: function () {
74 var allIts = itemContentContainer.children("div");
75 var $t = $(this);
76 var foridx = parseInt($t.attr("for"));
77 var removeContent = null;
78 for (var k = 0, len = allIts.length; k < len; ++k) {
79 if (foridx == k) {
80 removeContent = $(allIts[k]);
81 break;
82 }
83 };
84 //如果关闭的是激活的tab,则需要调整激活的tab
85 var showIdx = 0;
86 var titleLi = $t.parent("a").parent("li");
87 if (titleLi.attr("actived") == "true") {
88 var showIt = titleLi.prev("li");
89 showIdx = foridx - 1;
90 if (showIt.length == 0) {
91 showIt = titleLi.next("li");
92 showIdx = foridx + 1;
93 }
94 showTitleItem = showIt;
95 showTitleItem.attr("actived", "true").children("a").addClass("tabs_selected").css("border-bottom", "1px solid #FFFFFF");
96 //激活对应的内容div
97 for (var k = 0, len = allIts.length; k < len; ++k) {
98 if (showIdx == k) {
99 $(allIts[k]).show();
100 break;
101 }
102 };
103 }
104 //修改删除项目后面所有li项的for属性
105 var nextAll = titleLi.nextAll();
106 if (nextAll.length > 0) {
107 setTimeout(function () {
108 $.each(nextAll, function (j, obj) {
109 var $obj = $(obj);
110 var curFor = parseInt($obj.attr("for"));
111 var newFor = curFor - 1;
112 $obj.attr("for", newFor);
113 $obj.children("a").children(".item_title_close").attr("for", newFor);
114 });
115 }, 0);
116 }
117 var title = titleLi.attr("title");
118 itemsWidth = itemsWidth - titleLi.outerWidth()-11;
119 titleLi.remove();
120 removeContent.remove();
121 showMoreBtn();
122 if (item.closedHandler != null)
123 item.closedHandler(title);
124 },
125 mouseover: function () {
126 $(this).css("background-color", "#8DE2B3");
127 },
128 mouseout: function () {
129 $(this).attr("style", "");
130 }
131 });
132 }
133 var contentDiv;
134 if (item.exist) {//已经存在的不用再创建内容div
135 contentDiv = $(existItems[index]);
136 } else {
137 contentDiv = $("<div></div>").appendTo(itemContentContainer).css({ "width": itemContentContainer.width() - contentPadding * 2 + "px", "height": itemContentContainer.height() - contentPadding * 2 + "px", "margin": "0px", "padding": contentPadding + "px", "overflow": "auto" }).hide();;
138 }
139 if (item.content != "") {//优先取content
140 if ($.isPlainObject(item.content)) {
141 item.content.remove().appendTo(contentDiv);
142 } else {
143 contentDiv.html(item.content);
144 }
145 } else {
146 //是否有url 远程加载
147 if (item.url != "") {
148 load(contentDiv, item,false);
149 }
150 }
151 if (index == 0) {//默认第一个为激活状态
152 showTitleItem = itemTitleLi;
153 showContentItem = contentDiv;
154 }
155 if (item.actived) {
156 showTitleItem = itemTitleLi;
157 showContentItem = contentDiv;
158 }
159 itemsWidth = itemsWidth + itemTitleLi.outerWidth()+11;
160 showMoreBtn();
161 };
162 function load(target,item,isReload) {
163 if (item.isiframe) {
164 target.css({ "overflow": "hidden", "padding": "0", "width": target.width() + contentPadding * 2 + "px", "height": target.height() + contentPadding * 2 + "px" });
165 var loading = $("<div class='loading icon-loading'>正在加载......</div>").appendTo(target);
166 var iframe;
167 if (isReload) {
168 iframe = target.children("iframe")[0];
169 iframe.contentWindow.location.reload();
170 } else {
171 iframe = $("<iframe title='" + item.title + "' frameborder='0' style='overflow:visible' scrolling='auto' width='100%' height='100%' src='" + item.url + "' ></iframe>").appendTo(target);
172 iframe.load(function () {
173 loading.remove();
174 if (item.onLoadSuccess != null)
175 item.onLoadSuccess($(this).attr('title'), target);
176 });
177 }
178 } else {
179 if (item.dataType == "json") {
180 var ajaxopt = {
181 url: item.url,
182 loadingContainer: target,
183 returnParams: true,
184 params: { title: encodeURIComponent(item.title) }
185 };
186 if (item.onLoadSuccess != null)
187 ajaxopt.okdeal = function (data, extParams) {
188 item.onLoadSuccess(decodeURIComponent(extParams.title), { data: data, target: target });
189 };
190 $.myui.ajaxRequest(ajaxopt);
191 } else {
192 var settings = { url: item.url, extParam: item.title };
193 if (item.onLoadSuccess != null)
194 settings.loaded = function (t, extParam) {
195 item.onLoadSuccess(extParam, t);
196 };
197 $.myui.objectLoadContect({
198 target: target,
199 settings: settings
200 });
201 }
202 }
203 };
204 function showMoreBtn() {
205 if (itemsWidth > headerWith) {
206 itemTitleContainer.css("padding-left","9px");
207 if (leftMoreBtn == null) {
208 var headerWrap = itemTitleContainer.parent("div").parent("div");
209 leftMoreBtn = $("<a class='leftMoreBtn'></a>").appendTo(headerWrap);
210 rightMoreBtn = $("<a class='rightMoreBtn'></a>").appendTo(headerWrap);
211 leftMoreBtn.bind('click', function () {
212 var position = itemTitleContainer.position();
213 if (position.left < 9) {
214 var pos = position.left +80;
215 itemTitleContainer.animate({ left: pos },500);
216 }
217 });
218 rightMoreBtn.bind('click', function () {
219 var position = itemTitleContainer.position();
220 var pos = position.left -80;
221 itemTitleContainer.animate({ left: pos},500);
222 });
223 } else {
224 leftMoreBtn.show();
225 rightMoreBtn.show();
226 }
227 var diff = itemsWidth - headerWith;
228 itemTitleContainer.animate({ left: -diff }, 500);
229 } else {
230 if (leftMoreBtn != null) {
231 itemTitleContainer.css("padding-left", "0px");
232 leftMoreBtn.hide();
233 rightMoreBtn.hide();
234 var position = itemTitleContainer.position();
235 if (position.left < 0) {
236 itemTitleContainer.animate({ left: 0 }, 500);
237 }
238 }
239 }
240 }
241 /**********私有方法结束*******************/
242 /*****************************************************************************
243 *对外的函数统一封装到methods中
244 *调用方式:$.pluginInstance.pluginName("methodName",params)
245 ******************************************************************************/
246 var methods = {
247 init: function (options) {
248 return this.each(function () {
249 var $this = $(this);
250 var settings
251 if (typeof options == 'undefined')
252 settings = $.fn.tabs.defaults;
253 else
254 settings = $.extend({}, $.fn.tabs.defaults, options);
255 var newItemArr = [];
256 existItems = $this.children("div");//已经存在的item项
257 if (existItems.length > 0) {
258 $.each(existItems, function (i, it) {
259 var $it = $(it);
260 newItemArr.push({
261 title: $it.attr("title"),
262 content: '',
263 contextMenu: false,
264 closable: $it.attr("closable") == "true" ? true : false,
265 iconcls: $it.attr("iconcls") == undefined ? "" : $it.attr("iconcls"),
266 actived: $it.attr("actived") == "true" ? true : false,// 激活状态
267 isiframe: $it.attr("isiframe") == "true" ? true : false,//如果不配置采用公用 $.fn.tabs.defaults里的配置
268 url: $it.attr("url") == undefined ? "" : $it.attr("url"),//如果不配置采用公用 $.fn.tabs.defaults里的配置
269 dataType: $it.attr("dataType") == undefined ? "json" : $it.attr("dataType"), //如果不配置采用公用 $.fn.tabs.defaults里的配置
270 exist: true, //
271 onLoadSuccess: settings.onLoadSuccess,//fn(tabtitle,resdata)
272 activedHandler: settings.activedHandler,//fn(tabtitle,context)
273 closedHandler: settings.closedHandler //fn(tabtitle) tab被关闭时触发
274 });
275 });
276 }
277 //合并每一个tab项的默认设置
278 $.each(settings.items, function (i, item) {
279 var newIt = $.extend({}, $.fn.tabs.itemdefaults, item);
280 newIt.exist = false;
281 if (typeof newIt.onLoadSuccess!='function')
282 newIt.onLoadSuccess = settings.onLoadSuccess;//fn(tabtitle,resdata)
283 if (typeof newIt.activedHandler != 'function')
284 newIt.activedHandler = settings.activedHandler;//fn(tabtitle,context)
285 if (typeof newIt.closedHandler != 'function')
286 newIt.closedHandler = settings.closedHandler; //fn(tabtitle) tab被关闭时触发
287 newItemArr.push(newIt);
288 });
289 settings.items = newItemArr;
290 //创建ui布局
291 renderHtml($this, settings);
292 if ($.myui.isDebug) {
293 $.myui.log("jQuery.tabs init finish......");
294 }
295 $this.data('settings', settings);
296 });
297 },
298 destroy: function (options) {
299 return $(this).each(function () {
300 var $this = $(this);
301 $this.removeData('settings');
302 });
303 },
304 /***
305 *opt={
306 title: 'tab标题',
307 closable: false,
308 iconcls: '',
309 actived: false,// 激活状态
310 isiframe: false,//如果不配置采用公用 $.fn.tabs.defaults里的配置
311 url: '',//如果不配置采用公用 $.fn.tabs.defaults里的配置
312 content: '',//内容默认为空,如果该属性有值,则优先默认采用这个,即使设置url也不会去远程加载数据,content可以是html对象,也可以是文本
313 dataType: 'json',// //如果不配置采用公用 $.fn.tabs.defaults里的配置
314 contextMenu: false //右键菜单未实现
315 }
316 ***/
317 addTabs: function (opts) {
318 var newOpt = $.extend({}, $.fn.tabs.itemdefaults, opts);
319 newOpt.actived = true;
320 return $(this).each(function () {
321 var $this = $(this);
322 var settings = $this.data('settings');
323 if (showContentItem != null)
324 showContentItem.hide();
325 if (showTitleItem != null)
326 showTitleItem.attr("actived", "false").children("a").removeClass("tabs_selected").css("border-bottom", "1px solid #99BBE8");
327 itemContentContainer = $this;
328 var index = $this.children("div").length;
329 if (typeof newOpt.onLoadSuccess != 'function')
330 newOpt.onLoadSuccess = settings.onLoadSuccess;//fn(tabtitle,resdata)
331 if (typeof newOpt.activedHandler != 'function')
332 newOpt.activedHandler = settings.activedHandler;//fn(tabtitle,context)
333 if (typeof newOpt.closedHandler != 'function')
334 newOpt.closedHandler = settings.closedHandler; //fn(tabtitle) tab被关闭时触发
335 createTab(newOpt, index);
336 showContentItem.show();
337 showTitleItem.attr("actived", "true").children("a").addClass("tabs_selected").css("border-bottom", "1px solid #FFFFFF");
338 });
339 },
340 /**
341 * 获取选中的tab,返回值{titleObj:...,contentObj:...}
342 ***/
343 getSelectedTab: function () {
344 return { titleObj: showTitleItem, contentObj: showContentItem };
345 },
346 /***
347 *重新加载某个tab,以title为标准
348 ****/
349 reLoadTab: function (title) {
350 var $this = $(this);
351 var titlelis = $this.prev().children(".panel-tilte").children("ul").children();
352 var forIdx = -1;
353 var url = '';
354 var isIframe = false;
355 var dataType = "html";
356 var currShowTitle = null;
357 for (var i = 0, len = titlelis.length; i < len; ++i) {
358 var $li = $(titlelis[i]);
359 if ($li.attr("title") == title && $li.attr("url") != undefined && $li.attr("url")!='') {
360 forIdx = i;
361 url = $li.attr("url");
362 if ($li.attr("isiframe") != undefined) {
363 isIframe = $li.attr("isiframe") == 'true';
364 }
365 if ($li.attr("datatype") != undefined) {
366 dataType = $li.attr("datatype");
367 }
368 currShowTitle = $li;
369 break;
370 }
371 }
372 if (forIdx != -1) {
373 var childs = $this.children();
374 var updateContent = null;
375 for (var i = 0, len = childs.length; i < len;++i){
376 if (i == forIdx) {
377 updateContent = $(childs[i]);
378 }
379 }
380 if (updateContent != null) {
381 var opts = $this.data('settings');
382 var it;
383 for (var j = 0, len = opts.items.length; j < len;++j){
384 if (forIdx == j)
385 it = opts.items[j];
386 }
387 if (showTitleItem.attr("title") != title) {
388 showContentItem.hide();
389 showTitleItem.attr("actived", "false").children("a").removeClass("tabs_selected").css("border-bottom", "1px solid #99BBE8");
390 showContentItem= updateContent.show();
391 showTitleItem = currShowTitle.attr("actived", "true");
392 showTitleItem.children("a").addClass("tabs_selected").css("border-bottom", "1px solid #FFFFFF");
393 }
394 load(updateContent, it, true);
395 }
396 }
397 return $this;
398 },
399 /****
400 * 判断某个tab是否存在
401 ****/
402 isExist: function (title) {
403 var $this = $(this);
404 var titlelis = $this.prev().children(".panel-tilte").children("ul").children();
405 var forIdx = -1;
406 for (var i = 0, len = titlelis.length; i < len; ++i) {
407 var $li = $(titlelis[i]);
408 if ($li.attr("title") == title && $li.attr("url") != undefined && $li.attr("url") != '') {
409 forIdx = i;
410 break;
411 }
412 }
413 if (forIdx > -1)
414 return true;
415 else
416 return false;
417 }
418 };
419 /********************
420 *组件的构造函数
421 *********************/
422 $.fn.tabs = function () {
423 var method = arguments[0];
424 if (methods[method]) {
425 method = methods[method];
426 arguments = Array.prototype.slice.call(arguments, 1);
427 } else if (typeof (method) == 'object' || !method) {
428 if ($.myui.isDebug) {
429 $.myui.log("jQuery.tabs init.....");
430 }
431 method = methods.init;
432 } else {
433 $.error('Method ' + method + ' does not exist on jQuery.tabs');
434 return this;
435 }
436 return method.apply(this, arguments);
437 };
438 /********************
439 *组件的默认配置值
440 *options={
441 items: [], //tab项配置,对应$.fn.tabs.itemdefaults
442 isiframe: false,// 是否嵌入iframe,嵌入iframe 需要与url配合使用,即采用url加载远程页面时【dataType=html】才起作用
443 url: '',
444 dataType: 'json',// json/html 远程加载时的数据格式
445 onLoadSuccess: null,//fn(tabtitle,resdata)
446 activedHandler: null,//fn(tabtitle,context)
447 closedHandler: null //fn(tabtitle) tab被关闭时触发
448 }
449 *********************/
450 $.fn.tabs.defaults = {
451 items: [], //tab项配置,对应$.fn.tabs.itemdefaults
452 isiframe: false,// 是否嵌入iframe,嵌入iframe 需要与url配合使用,即采用url加载远程页面时【dataType=html】才起作用
453 url: '',
454 dataType: 'json',// json/html 远程加载时的数据格式
455 onLoadSuccess: null,//fn(tabtitle,resdata)
456 activedHandler: null,//fn(tabtitle)
457 closedHandler: null //fn(tabtitle) tab被关闭时触发
458 };
459 /***
460 *每一个tab项目的默认配置
461 ****/
462 $.fn.tabs.itemdefaults = {
463 title: 'tab标题',
464 closable: false,
465 iconcls: '',
466 actived: false,// 激活状态
467 isiframe: false,//如果不配置采用公用 $.fn.tabs.defaults里的配置
468 url: '',//如果不配置采用公用 $.fn.tabs.defaults里的配置
469 content: '',//内容默认为空,如果该属性有值,则优先默认采用这个,即使设置url也不会去远程加载数据,content可以是html对象,也可以是文本
470 dataType: 'json',// //如果不配置采用公用 $.fn.tabs.defaults里的配置
471 contextMenu: false //右键菜单未实现
472 }
473 })(jQuery);
开源框架之TAB控件的更多相关文章
- 我的开源框架之TAB控件
需求 (1)支持iframe.html.json格式的tab内容远程请求 (2)支持动态添加tab (3)支持远程加载完成监听,支持tab激活事件监听 (4)支持reload tab内容[如果是远程加 ...
- 我的开源框架之Accordion控件
需求: (1)实现手风琴面板控件,支持静态HTML与JSON方式创建控件 (2)支持远程加载数据 (3)支持面板激活.远程加载事件注册 (4)支持动态添加.删除项目 实现图例 客户代码 <div ...
- Android开源的精美日历控件,热插拔设计的万能自定义UI
Android开源的精美日历控件,热插拔设计的万能自定义UI UI框架应该逻辑与界面实现分离,该日历控件使用了热插拔的设计 ,简单几步即可实现你需要的UI效果,热插拔的思想是你提供你的实现,我提供我的 ...
- 网页Tab控件
网页Tab控件 找到:http://www.open-open.com/ajax/2_Tabs.htm 页面,查看了若干Tab控件, 找到了:http://www.open-open.com/ajax ...
- 扩展easyUI tab控件,添加加载遮罩效果
项目里要用HighChart显示图表,如果返回的数量量太多,生成图表是一个很耗时的过程.tab控件又没有显示遮罩的设置(至少本菜是没有找到), Google了一下,根据另一个兄台写的方法,拿来改造了一 ...
- NVelocity+Bootstrap tab控件 异常之
异常信息:Encountered "tings" at line 54, column 55.Was expecting one of: "(" ... ...
- [转]几个开源的.net界面控件
转自原文 几个不错的开源的.net界面控件,介绍几个自己觉得不错的几个开源的.net界面控件. DockPanel Suite:开发类似VS.net的界面,#Develop就是使用的这个控件. 网址: ...
- Android Tab控件简介
在Android中,Tab控件是一种很常用的控件:Tab控件即标签页,可以在一页中切换显示N页内容: Tab控件具有两种实现过程,一是在同一个Activity中切换显示不同的标签页,这种主要是通过修改 ...
- Web端的Tab控件在切换Tab时Load数据出错的处理
我们在应用Web端的Tab控件时,不管是Jquery easyui的还是Ext的Tab控件都会遇到一个问题,在Tab1正在加载数据的时候我们切换到Tab2,再切换回来,Load数据的控件就会出错,出错 ...
随机推荐
- android app启动过程(转)
Native进程的运行过程 一般程序的启动步骤,可以用下图描述.程序由内核加载分析,使用linker链接需要的共享库,然后从c运行库的入口开始执行. 通常,native进程是由shell或者init启 ...
- sk_buff整理笔记(两、操作函数)
承接上一:sk_buff 整理笔记(一.数据结构)这一篇要讲的是内核为sk_buff结构提供的一些操作函数. 第一.首先要讲的是sk_buff中的四大指针: 四大指针各自是:head.data.tai ...
- iframe参数
iframe参数: <iframe src="test.jsp" width="100″ height="50″ frameborder="no ...
- Sql Server之旅——第五站 确实不得不说的DBCC命令
原文:Sql Server之旅--第五站 确实不得不说的DBCC命令 今天研发中心办年会,晚上就是各自部门聚餐了,我个人喜欢喝干红,在干红中你可以体味到那种酸甜苦辣...人生何尝不是这样呢???正好 ...
- SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器
原文:SSIS从理论到实战,再到应用(3)----SSIS包的变量,约束,常用容器 上期回顾: SSIS从理论到实战,再到应用(2)----SSIS包的控制流 首先我们来看看包里面的变量 SSIS ...
- [WPF] 动画Completed事件里获取执行该动画的UI对象
原文:[WPF] 动画Completed事件里获取执行该动画的UI对象 昨天群里有位童鞋提出如何在动画完成事件Completed里获取到执行该动画的UI对象. WPF里动画的Completed的本身并 ...
- springmvc实现long-pulling技术
背景介绍: 项目中有一个通讯模块,本来是用websocket全双工技术实现的,但IE10下面不支持websocket,而国内的360.2345浏 览器封装的所有是IE10下面的内核,考虑到站点在国内的 ...
- checkbox属性checked="checked"但状态不是勾选状态的解决办法
原因: jQuery API明确说明,1.6+的jQuery要用prop,不能用attr否则无效,尤其是checkBox的checked的属性的判断.
- Python系列教程大汇总
Python初级教程 Python快速教程 (手册) Python基础01 Hello World! Python基础02 基本数据类型 Python基础03 序列 Python基础04 运算 Pyt ...
- 初创互联网公司简明创业指南 - YC新掌门Sam Altman
本文只是一个创业指南的简明版 - 更详细的版本请查看:http://startupclass.samaltman.com 创业之前,你更应该去拥有一个好的创意,而不是一个公司.如果开始前你拥有一个好的 ...