channel标签用来显示网站的频道,有多种用法,涉及到换行、分列等功能。网上的资料有限,下面我们就结合默认模板详细讲解一下这个标签的用法。 ¢channel|频道标签 标签名称:channel
标记简介:织梦常用标记,通常用于网站顶部以获取站点栏目信息,方便网站会员分类浏览整站信息
功能说明:用于获取栏目列表
适用范围:全局使用
基本语法:
{dede:channel type='top' row='8' current~typelink~' >~typename~</a> </li>"}
<li><a href='/blog_article/[field_typelink/]/index.html'>[field:typename/]</a> </li>
{/dede:channel}
相关函数:
文件\include\taglib\channel.lib.php第2行
function lib_channel(&$ctag,&$refObj)
参数说明:
typeid = '0' 栏目ID type = ‘son | sun’ son表示下级栏目,self表示同级栏目,top顶级栏目
reid = ‘0’ 上级栏目ID
row = ‘100’ 调用栏目数
col = ‘1’ 分多少列显示(默认为单列)
currentstyle = '' 应用样式
底层模板字段: ID(同 id),typeid, typelink, typename, typeurl,typedir(仅表示栏目的网址) 例: {dede:channel type='top'} <a href='/blog_article/[field_typelink /]/index.html'>[field:typename/]</a> {/dede:channel}
注:在没有指定typeid的情况下,type标记与模板的环境有关,如,模板生成到栏目一,那么type='son'就表示栏目一的所有子类 ¢频道的分列显示 除了在channel里面设置col属性外,还要在dedecms.css中添加对dl标签的格式控制。如下: #navMenu dl{ width:500px; margin-right:8px; margin-top:2px; } 另外需要更改#navMenu的高度控制。 并且指定新的背景,如下: .blue .top { background-image: url("/images/green_skin2.png"); background-position: 0 -108px; background-repeat: repeat-x; height: 100px; } .blue .top .t_l { background-position: 0 72px; background-repeat: no-repeat; height: 70px; width: 5px; } .blue .top .t_r { background-position: -6px 72px; background-repeat: no-repeat; height: 70px; width: 5px; } ¢type|指定栏目 ¢标签名称:type
功能说明:表示指定的单个栏目的链接
适用范围:全局使用
基本语法:
{dede:type}
< a href="[field:typelink /]">[field:typename /]</a>
{/dede:type}
相关函数:
文件\include\taglib\type.lib.php第5行
function lib_type(&$ctag,&$refObj)
参数说明:
typeid='' 指定栏目ID
底层模板字段:
typename,typelink(仅表示栏目的网址), 栏目表dede_arctype的所有字段
使用实例:
如果不指定typeid£¬默认为0,这时候获取栏目会根据栏目的环境变量改变而改变 ¢channelartlist|频道文档 ¢标签名称:channelartlist
标记简介:
功能说明:获取当前频道的下级栏目的内容列表标签
适用范围:全局使用
基本语法:
{dede:channelartlist row=6}
< dl>
<dt><a href='/blog_article/{dede_field name=/index.html'typeurl'/}'>{dede:field name='typename'/}</a></dt>
<dd>
{dede:arclist titlelen='42' row='10'} <ul >
<li><a href="/blog_article/[field_arcurl /]/index.html">[field:title /]</a></li>
<li>([field:pubdate function="MyDate('m-d',@me)"/])</li>
</ul>
{/dede:arclist}
< /dl>
{/dede:channelartlist}
相关函数:
文件\include\taglib\channelartlist.lib.php第6行
function lib_channelartlist(&$ctag,&$refObj)
参数说明:
typeid = '0' 频道ID,多个请用","分隔 row = '20' 获取的栏目返回值 其他说明: 除了宏标记外,channelArtlist 是唯一一个可以直接嵌套其它标记的标记,不过仅限于嵌套 {dede:type}{/dede:type} 和 {dede:arclist}{/dede:arclist} 两个标记。
底层模板变量:
包含{dede:type}{/dede:type}及{dede:arclist}{/dede:arclist}下面所有底层模板变量。 ¢频道的分组显示 如果频道很多要在一页的不同位置以不同的格式显示,这时可以使用channelartlist和type的组合。
<ul>
{dede:channelartlist typeid='1,51,6,7,8,9' row=6}
<dl><dd>
{dede:type}
<li><a href="/blog_article/[field_typeurl /]/index.html"><span>[field:typename /]</span></a></li>
{/dede:type}
</dd></dl>
{/dede:channelartlist}
</ul><br>
<ul>
{dede:channelartlist typeid='10,11,12,54,55,56,57' row=7}
<dl> <dd>
{dede:type}
<li><a href="/blog_article/[field_typeurl /]/index.html"><span>[field:typename /]</span></a></li>
{/dede:type}
</dd></dl>
{/dede:channelartlist}
</ul>
本文链接
起因
将代码组织到类中的一个重要原因是让代码更加“模块化”,可以在很多不同的场景中实现代码的重用。但类不是唯一的模块化代码的方式。
一般来讲,模块是一个独立的JS文件。模块文件可以包含一个类定义、一组相关类、一个实用函数库或者一些待执行的代码。
模块化的目标是支持大规模的程序开发,处理分散源中代码的组装,并且能让代码正确运行,哪怕包含了不需要的模块代码,也可以正确执行代码。
理想状态下,所有模块都不应当定义超过一个全局标识。
模块函数
通过把模块定义在某个函数的内部来实现,定义的变量和函数都属于该函数的局部变量,在函数外不可见。实际上,可以将这个函数作用域用做模块的命名空间(模块函数)
一旦将模块代码封装进一个函数中,就需要一些方法导出公用API,以便在模块函数外部调用它们。下面有几种方式导出公用API:
首先创建一个命名空间
var school; // 创建school命名空间
if(!school) school = {};
1. 利用构造函数
school.Student = (function() {
function Student() {
}
// ...... 定义Student的原型对象和私有属性和方法 ........
return Student; // 返回Student构造方法导出公共API
})();
2. 返回命名空间对象
如果模块API包括多个单元,则它可以返回命名空间对象
school.students = (function() {
// 这里定义了很多类如课程类/成绩类, 使用局部变量和函数
function Subject() { /* ... */ }
function Grade() { /* ... */ }
// 通过返回命名空间对象将API导出
return {
Subject: Subject,
Grade: Grade
};
})();
3. 通过关键字new调用
另外一种类似类似技术:把模块函数当做构造函数,通过new来调用。把它们(公共API)赋值给this属性来将其导出
// ..... 这里省略了代码 ......
// 将API导到this对象中
this.Subject = Subject;
this.Grade = Grade;
// 注意,这里没有返回值
}()); // 括号写在里面。这里是创建新实例,new后面应紧跟构造函数的调用而不是表达式
4. 已定义命名空间对象
作为一种替代方案,如果已经定义了全局命名空间对象,通过模块函数可以直接设置那个对象的属性。
var school; // 创建school命名空间
if(!school) school = {};
school.students = {}; // student命名空间已经定义
(function(students) {
// ..... 这里省略了代码 ......
// 将公共API导到上面定义的命名空间中
students.Subject = Subject;
students.Grade = Grade;
// 这里也不需要返回值
})(school.students);
为此,导出公共API的方式已经讲完。
本文链接
最近接到一个功能拓展需求,新需求中所引用的数据接口却只能提供XML格式……无奈自身功力有限,没有想到JS方面理想的解决方案,只好寻求AS工程师的帮忙,经过近2天的联调,最终解决了各浏览下的跨域访问。
下面记录demo版代码:
父页面HTML:
<button value="获取数据" onclick="getData()"></button>
<!-- 为什么没有直接display:none;或者visibility: hidden;? 【稍后解释:标记】-->
父页面JS:
function getData(data) {
if (data == "" || data == undefined || data == null) {
sendData("a=1&b=2"); //参数格式任意,相当于你get请求时发的参数
}
else {
alert("获取的数据:" + data)
}
}
function sendData(param) {
var childWindow = document.getElementById('testIframe').contentWindow;
childWindow.sendData(param); //驱动作用,驱动隐藏域内的方法去调用AS中获取XML的API方法
}
function change() {
document.getElementById("testIframe").src = "xx.html"; //隐藏域URL
}
子页面JS:
function sendData(paramFromParent) {
var severUrl = 'xxx.com';
//此处对paramFromParent进行处理 获得完整的方位xxx.xml的URL
//然后调用AS的URLLoader方法去获取URL下的数据
//获取成功后调用下面的方法驱动父页面中的getData方法
}
function getData(backData) {
window.parent.getData(backData);
}
标记:没有用display或者visibility是因为:在IE浏览器下,当你的iframe元素设置样式为此两点时候,框架内的JS不进行加载,也就无法进行通信了......
成功跨域...下班...~
本文链接