元素行为

元素行为是微软Internet Explorer 5.5中最有意义的新功能之一。它们提供了定义自定义元素并如一般的HTML元素一样在网页中使用的能力。元素行为可以使用脚本编写在一份HTML组件(HTC)文件中,也可以通过一个二进制编码的动态HTML(DHTML)行为来实现。元素行为是封装的组件,因此它们可以添加新的有趣的功能以改进网页中内容、功能和样式的组织性。

DHTML行为从Internet Explorer 5中开始引入,它可以通过设置层叠样式表(CSS)的behavior属性或在脚本中使用addBehavior方法来修改标准HTML元素的行为。这一部分的DHTML行为现在作为附加性行为来访问,以此区别使用不同的绑定机制和拥有其他独有特性的元素行为。

元素行为可用于实现从一个简单的滚动效果到复杂的交互式组件的任何内容。一个特殊的处理指令被用于向网页中导入元素行为,导入的同时关联到一个自定义元素。一旦元素行为下载完毕并解析完成,文档层次中就添加了一个元素并一直保持到文档关闭。在这个角度上看,元素行为与附加性行为完全不同。一个附加性行为异步地绑定到一个元素上并修改它的行为,而且它可以使用程序来完成附加或移除。

Internet Explorer 5.5中元素行为给行为组件模型带来了一些改进。这些改进给附加性行为的已有功能提供了新的特征,并提供了更多的可靠性和活力。但是,附加性行为并未被元素行为所替代,在许多情况下依旧很有用。

元素行为的被命名为viewlink的新特性,让HTC文件可以封装私有的文档树,并将其与主页面的内容区分开来。这向我们展现了另一个隐藏在《ViewLink简介》中的可能的领域。

元素行为可以使用HTC文件或二进制编码的DHTML行为来实现,而这两种途径所使用的技术是有很大区别的。本文关注于如何使用HTC文件来编写元素行为。欲了解关于编写二进制编码的元素行为的更多信息,请阅读《如何使用ATL创建二进制编码元素行为》。

此文档中讨论下面的主题。

    * 术语
    * 先决条件
    * 优势
    * 创建一个自定义元素
    * 创建一个滚动标签
    * 行内元素?还是块元素?
    * 轻量的HTC文件
    * 固化内容
    * defaults对象
    * 访问自定义元素的内容
    * 组件初始化
    * 二进制编码的行为
    * 下载许可
    * 防止打印的难题
    * 使用空元素标签
    * 相关主题

Terminology术语

此部分定义了本文中使用到的术语。
附加性行为         异步方式绑定到标准HTML元素上的DHTML行为。可以使用CSS中的behavior属性或使用脚本中的addBehavior行为来附加DHTML行为。
元素行为         Internet Explorer 5.5的特性,允许DHTML行为以同步方式转变为自定义元素。由元素行为转变来的自定义元素可以像其他元素一样在HTML文档中使用,该行为的功能绝对不会从该元素上移除。
viewlink         元素行为的特性,让HTC文件的内容可以显示在网页中。
主文档         客户端正在浏览的网页。
文档片段         独立存在于主文档正文内容之外的一个或多个HTML元素。Viewlink特性或其他诸如appendChild的脚本方法,可以用于插入一个文档片段到主文档中并渲染此片段。
自定义元素         用户自行定义的元素,也可以理解为自定义标签。要使用自定义元素必需为HTML文档声明相应的命名空间。
主元素         实现Viewlink方式的元素行为的自定义元素。Viewlink让元素行为的文档片段可以作为主文档中的内容被渲染。
轻量的HTC         不使用或不渲染其独有的HTML内容的HTML组件文件。当需要使组件的初始化过程最优化或尽可能提升网页的渲染速度时可用。
命名空间         可供自定义元素和属性使用的名称的集合。命名空间用于确保每个元素都能被唯一性的识别。欲了解更多的信息,请阅读《XML指南:使用命名空间》。

此总概关注于使用HTC文件来实现自定义元素的元素行为上。因此,除非是其他的一些特定情况,否则本总概中的元素行为都不通过二进制编码的形式实现。

虽然元素行为可用于定义自定义元素,但这并非自定义元素的唯一使用方法。例如,附加性行为同样可以加载到自定义元素上。
Prerequisites先决条件

你需要熟悉DHTML行为和HTC组件的概念。如果你才刚刚接触DHTML行为,那么总概《DHTML行为简介》和HTC参考都有助于理解元素行为的基础知识。
Benefits优势

元素行为最主要的优势在于,它们让创建如同标准HTML元素一般能够在网页中使用的自定义元素变得可行。Internet Explorer 5.5是支持将自定义元素定义在HTC文件中的第一个浏览器。附加性行为重载了元素的默认行为,而元素行为则用于定义新的元素。自从元素行为封装入HTC文件开始,网页中使用自定义元素的实现过程就变得更容易组织,而主文档的内容也不再像之前那么混乱。HTC文件定义的DHTML行为可以用在同域的任何页面中,因此元素行为是创建强大的、复用性高的组件的一种卓越的途径。

从一个元素行为同步加载开始,其相应的自定义元素便立即在行为下载并解析完毕后完成它的初始化过程。同步绑定元素行为的用法使它们能够与正规的HTML元素和平相处并继续保持活性。元素行为的活性由其绑定机制决定,但对任何组件而言,元素行为的可靠性和功能性还是依靠于其实现的质量。元素行为无法通过脚本或其他的机制与其相应的自定义元素断开关联,在很多DHTML行为的程序中这都是一个很令人满意的特性。因此,元素行为应该被理解为真实的HTML元素;一旦它被解析并渲染,那么它就作为一个元素存在于文档树中。

以HTC文件编写的元素行为几乎可以实现二进制编码DHTML行为所能实现的所有效果。但实现使用HTC文件的元素行为明显要快捷的多,在使用脚本编写完功能后,唯一的结果便是开发者不再需要去学习微软的Visual C++来编写自定义的浏览器控件而减轻了痛苦。同样的,当你选择使用HTC文件来建立元素行为时,你明显不再受到组件可实现功能的选择范围的限制。唯一必需使用二进制DHTML行为的情形是:当你需要编写一个渲染行为或当组件不得不使用到查询服务。

在使用HTC文件来实现元素行为时浏览器安全的问题则比较简单,主要是因为客户端必需在二进制编码的组件在下载到客户端之前提供相应的许可权限。但当元素行为是以HTC文件的方式实现时,它自动作为网页的一部分而被下载,其结果是在浏览过程中组件下载过程对客户端而言是不可见的。HTC文件在Internet Explorer中的实现需要HTC文件放置在主文档的相同域中,否则会返回一个访问被拒绝的错误。

开发另人注目的交互性的网页需要几个技巧,另外需要编写者、程序员和设计师协同工作一起来开发网页。传统页面的编制工作意味着单一的HTML文档,其中包含一定的脚本、内容和排版。这种情况因HTML文档的普及的激发出来,但实际上一份HTML文件很难找到一个合适的方法来让一个团队进行合作。HTC文件的美丽之处正在于它将内容、脚本和样式封装到独立的容器中,让不同领域的专家只专注于自己的工作中。

Internet Explorer 5.5中的行为组件模型给我们带来了很多基于组件的网络开发中的好处。就比如可以构建强大的HTC文件库系统,使代码更容易管理,而维护所需的消耗更加低廉。
Creating a Custom Element创建一个自定义元素

下面的步骤大致描述了网页中自定义元素创建和使用的基本过程。

    * 在HTC文件中定义元素行为。
    * 在主文档中导入自定义元素的定义。

使用HTC文件实现元素行为与附加性行为的编写非常相似。最主要的区别在于组件在主文档中的实现。对于附加性行为,行为通过设置behavior属性为HTC文件的地址来加载到HTML元素上,而元素行为这是在创建自定义元素时完成行为的绑定工作。
定义元素行为

要定义一个元素行为,主要的任务是编写HTC文件。每个HTC文件使用一个PUBLIC:COMPONENT元素;此元素提供了一个其他用于定义组件接口和设置组件默认属性的元素的容器。HTC参考提供了所有可用在PUBLIC:COMPONENT元素中的子元素的信息。

元素行为使用PUBLIC:COMPONENT标签的tagName属性来指定自定义元素的名称。在下面的例子里实现了一个名为checkers的自定义元素。
<PUBLIC:COMPONENT tagname="checkers">
</PUBLIC:COMPONENT>

到目前为止,这个checkers标签的实现还仅仅完成了一个框架,还缺乏属性来设置其外观、功能强度、或其他别的内容。自定义元素的属性可以使用PUBLIC:PROPERTY属性来进行定义。下面的例子里给checkers增加了一个名为boardWidth的属性:
<PUBLIC:COMPONENT tagname="checkers">
  <PUBLIC:PROPERTY name="boardWidth" />
</PUBLIC:COMPONENT>

HTC文件中的脚本函数可以设置为对其他组件或主文档中的脚本是公共可访问的。在下面的例子里,组件中又新增了一个PUBLIC:METHOD元素,它使用newGame函数来开始一盘新的checkers游戏。同样的,新增了PUBLIC:ATTACH元素映射了用于处理onmouseover事件实例的mouseover函数。
<PUBLIC:COMPONENT tagname="checkers">
  <PUBLIC:PROPERTY name="boardWidth" />
  <PUBLIC:METHOD name="newGame()" />
  <PUBLIC:ATTACH event="onmouseover" onevent="mouseover()" />
</PUBLIC:COMPONENT>

<SCRIPT language="Javascript">
function newGame(){
// insert code to initialize a new game here
}

function mouseover(){
// insert code to handle mouseover events
}
</SCRIPT>
<BODY>
</BODY>

要完成这个行为,还需要在PUBLIC:COMPONENT元素中添加更多的元素,来定义checkers组件的其他方法、属性和事件处理函数。一份完成的checkers组件大体上还应该包含checkers游戏的执行脚本。一旦完成,那么checkers游戏的实现便完全封装在Checkers.htc文件中。

注意checkers组件的实现过程中并没有涉及到命名空间;命名空间是在主文档中声明的,此部分会在下一段中给出详细的解释。同一元素行为可以在单一的主文档中导入到不同的命名空间中,虽然这一技术并未在样例中使用,但对于很多其他类型的组件还是很有用处的。

正如例子所展示的,推荐将脚本块放置在PUBLIC:COMPONENT的定义之后。同样的,脚本块应该防止在<BODY>标签之前,或者直接放置在</SPAN>标签之前。

欲了解关于在行为中使用PUBLIC:COMPONENT标签的信息,请阅读《使用HTML组件在脚本中实现DHTML行为》。
导入自定义元素

主文档需要一些简单的附加信息来导入自定义元素。HTML文档首先声明一个命名空间,用于确保自定义信息是确保唯一的。下面的HTML元素通过XMLNS属性声明了一个被命名为games的命名空间。设置这个属性让自定义元素可以在主文档中通过附加"games"前缀来被使用。
<HTML XMLNS:games

下一步是导入自定义元素到此命名空间中。在下面的例子中,命名空间games导入了Checkers.htc文件中的checkers元素的实现内容。
<?IMPORT namespace="games" implementation="checkers.htc" />

IMPORT指令是在主文档中实现元素行为的真正关键之处。当浏览器开始处理IMPORT指令时,它将一直等待直到HTC文件完全下载完备,而后才继续处理后面的内容。此指令处理的方式是为什么行为会同步加载到自定义元素的根本性原因。

最后,自定义元素必须在主文档正文的某个地方添插进去。自定义元素可以如其他标签一样被使用,只是自定义元素将其命名空间作为前缀在使用。checkers游戏的自定义元素可以如下面这般被定义:
<games:checkers></games:checkers>

简单的自定义元素无须写成块元素的结构,所以在这种情况下也可以使用下面的方式。
<games:checkers />

如果自定义元素在使用中并没有关闭标签,正如前面例子里的那样,最后一个元素属性必须与结束的/>字符分隔开,或者该属性的值必须加上引号。阅读《使用空元素标签》以获得更多的信息。

下面显示的,是实现了checkers元素的完成版本的HTML文件。
<HTML xmlns:games>
<HEAD>
<?IMPORT namespace="games" implementation="checkers.htc" />
</HEAD>
<BODY>
<games:checkers />
</BODY>
</HTML>

现在创建元素行为的基本步骤已经介绍完毕,下面是时候继续实现一个更强功能的实例了。
Creating a Rollover Tag创建一个滚动标签

这个实例使用元素行为来创建一个实现了滚动效果的自定义元素。滚动是文本块比较常见的功能,在鼠标指针移至文本块上时,它改变了文本块的外观。它们用于提供可视的回执信息来指明该元素是可以被点击的。

一种较好的实现简单滚动效果的方法是使用附加性行为来改变A标签的行为,因为简单的滚动效果并不一定需要去创建自定义元素。不过本实例示范了一些经常使用于更复杂的应用程序中的实用技术。需要了解附加性行为如何实现滚动,请阅读《使用DHTML行为》。
创建Rollover组件

HTC文件包含了rollover标签的实现过程。该标签只有一个被命名为href的属性,是用户点击此rollover时的访问网页的超链接。

rollover标签需要处理下面的事件:

    * onmouseover发生在当鼠标指针移至rollover元素的时候。事件处理函数改变文本颜色为红色,加上下划线,并将指针改变为手的形状。
    * onmouseout发生在当鼠标指针从rollover移开的时候。事件处理函数将文本还原为它的初始状态。
    * onclick发生在该rollover被点击的时候。事件处理函数在确定设置了href属性之后载入该属性指定的网页。

下面的实例展示了如何为rollover标签创建HTC文件。

   1.

      创建HTC文件。

      创建一个命名为rollover.htc的文本文件并添加PUBLIC:COMPONENT标签。
      <PUBLIC:COMPONENT tagname="rollover">
      </PUBLIC:COMPONENT>

      PUBLIC:COMPONENT标签指明该HTC文件包含了一个名为"rollover"的标签的实现过程。
   2.

      添加属性定义。

      在第一行之后,添加href属性的定义。
      <PUBLIC:PROPERTY name="href" />

      这个实例为rollover标签定义了属性href。
   3.

      创建事件处理函数。

      将rollover标签的三个不同事件附加上处理函数。
      <PUBLIC:ATTACH event="onmouseover" for="element" onevent="Hilite()" />
      <PUBLIC:ATTACH event="onmouseout" for="element" onevent="UnHilite()" />
      <PUBLIC:ATTACH event="onclick" for="element" onevent="GotoLink()" />

      这个实例附加了下列事件到rollover元素上:
          * onmouseover触发Hilite()
          * onmouseout触发UnHilite()
          * onclick触发GotoLink()
   4.

      编写事件处理函数脚本。

      在PUBLIC:COMPONENT之后添加<SCRIPT>标签来封闭脚本和事件处理函数。
      <SCRIPT language="JScript">
      </SCRIPT>

      在script标签之间,添加每个事件处理函数的定义和其他用于实现行为功能的脚本。Hilite事件处理函数如下:
      function Hilite()
      {
        normalColor = element.style.color;
        normalDecoration = style.textDecoration;
        element.style.color = "red";
        element.style.cursor = "hand";
        element.style.textDecoration = "underline";
      }

      Hilite事件处理函数保存了rollover标签内文本的颜色和文本修饰状态,并设置颜色为红色,设置鼠标指针为手形(指明这是一个超链接),同时还设置文本修饰为下划线。

      UnHilite事件处理函数如下:
      function UnHilite()
      {
        element.style.color = normalColor;
        element.style.textDecoration = normalDecoration;
        element.style.cursor = "";
      }

      此事件处理函数将rollover标签内文本的颜色和文本修饰状态还原为Hilite事件处理函数所保存的值。

      最后,GotoLink事件处理函数如下:
      function GotoLink()
      {
        if(element.href)
        {
          location.href=element.href;
        }
      }

      此事件处理函数检查是否定义了href属性,如果有定义,则跳转访问href属性指定的网页地址。

到目前为止,rollover标签已经完全实现,可以在主文档中使用了。
创建Rollover自定义标签

此部分展示如何实现rollover自定义元素。

   1.

      创建HTML文件。

      创建一份HTML文件并在文件的顶部声明使用的命名空间。此实例使用名为addon的命名空间。该命名空间的名称并不重要,但必须声明一个。
   2.

      声明命名空间。

      要声明自己的命名空间,使用:
      <HTML XMLNS:addon>
   3.

      导入标签的实现。

      通过在<HTML元素之后添加下面的指令以导入标签的实现过程:
      <?IMPORT namespace="addon" implementation="rollover.htc" />

      IMPORT标签是处理指令,或缩写为PI。使用<?来替代<字符开始该标签,以区别于规则的HTML元素。
   4.

      添加新的自定义元素。

      自定义元素现在就可以使用了。例如:
      <BODY>
      <addon:rollover href="http://www.microsoft.com">visit the microsoft web site</addon:rollover>
      </BODY>

当鼠标指针移至rollover标签时,该标签内文本的颜色变为红色,添加了下划线,同时鼠标指针变为手形。当鼠标指针移出该标签时,鼠标指针还原为箭头,同时文本返回其初始状态。如果用户点击了该标签内的文本,同时定义了href属性,该属性指定的网页地址被载入。
Inline vs. Block Elements行内元素?还是块元素?

默认的,元素行为在主文档中作为行内元素被渲染。需要将元素行为作为块元素被渲染,你需要设置元素的显示属性为"block"。

此样例HTC文件中的元素行为渲染为行内元素。样例中的脚本在元素被点击时设置主元素的display属性为"block"。
<PUBLIC:COMPONENT tagname="animals">
  <PUBLIC:ATTACH event="onclick" onevent="makeBlock()" />
  <SCRIPT language="JScript">
  //The element behavior renders as an inline element by default.
  element.innerHTML = "*Element behavior: Click me if you dare.";
  element.style.cursor = "hand";
  element.style.backgroundColor = "orange";
  function makeBlock() {
    element.innerHTML = "Element behavior: Lions and tigers and bears.";
    //Setting the element's style to 'block' renders it as a block element
    //in the primary page.
  element.style.display = "block";
  }
  </SCRIPT>
  <BODY>
  </BODY>
</PUBLIC:COMPONENT>

此样例的主文档包含了文档片段。
<HTML XMLNS:element>
<HEAD>
<?IMPORT namespace="element" implementation="animalBehavior2.htc" />
</HEAD>
<BODY>
<BASEFONT face="Verdana" size="4" />
  <DIV style="BACKGROUND-COLOR: green; color: white;">
    Containing page: The tortoise and the hare. </DIV>
  <ELEMENT:animals />
  <DIV style="FONT-SIZE: x-small">
    <P>*Click the element behavior to change it into a block element.</P>
  </DIV>
</BODY>
</HTML>
Lightweight HTC Files轻量的HTC文件

Internet Explorer在主文档中为行为元素的每次实用都创建不同的文档树。当一份HTC文件实际上也是一份HTML文档时,一个由其内容组成的文档树会在其被解析的时候被建立。当大量的元素行为组合在单一页面时,其结果是使页面的载入变得异常缓慢。

事实上经常会有需要去编写一个并不含任何HTML的HTC文件;当需要完成这项任务时,PUBLIC:COMPONENT的新属性lightweight将开始有用起来。当这个属性被设置时,HTC文件会以尽可能高效的方式被处理。轻量的HTC的处理过程中,那些毫无用处的解析过程和创建的空文档树都被消除掉了。因此,使用一个轻量的HTC的结果是让页面载入的更快,尤其在同一自定义元素多次被实例化的时候。

如果一个组件包含一份文档片段并在主文档中使用viewlink来进行渲染,那么HTC文件会被非常高效的处理掉。在需要由HTC文件组成的应用程序中,行为并不需要使用viewlink来渲染内容,甚至简单到根本就没有内容需要渲染;在这种情况下,可以指定一个轻量的组件来纠正无用的内存开支。

因此,当组件在实现时如果无需拥有它自己的文档树,轻量的组件会是最好的实现选择。而达到这个目的的方法,就如下面实例所展示的,设置PUBLIC:COMPONENT元素的lightweight属性:
<PUBLIC:COMPONENT tagname="rollover" lightweight="true">
</PUBLIC:COMPONENT>

轻量的HTC文件只支持下面的标签。
<PUBLIC:COMPONENT>
<?IMPORT>
<PUBLIC:PROPERTY>
<PUBLIC:METHOD>
<PUBLIC:ATTACH>
<PUBLIC:DEFAULTS>
<SCRIPT>
<HTML>

因为rollover标签实例在HTC文件中并未使用HTML,也因为它可以在一份常见的网页中多次使用,因此它是轻量元素行为的好样例。checkers自定义元素同样可以作为轻量的HTC文件来实现。

尽管轻量的HTC文件并没有自己的文档结构,并因此没有document对象可以引用,但实际上轻量的HTC文件依旧可以包含HTML,只是这些内容被忽略掉了。HTC文件中的脚本可以在主文档中以element.document.createElement的格式使用createElement方法来添加内容。

因为<?IMPORT>处理指定可以在轻量的HTC文件中使用,故可以嵌套HTC文件。
Literal Content固化内容

当自定义元素标记为固化内容时,因为不会被解析并渲染,开始和结束标签之间的内容可以达到很多目的。组件的作者可以操作自定义元素的内容,或以组件实现的目标方式进行解析。当固化内容的组件被定义时,自定义元素的innerHTML并未被解析或添加到文档树中,但仍然可以通过脚本进行访问。HTML文档中最为常见的三个使用固化内容的元素是<SCRIPT>、<XML>和<STYLE>标签。

固化内容的元素行为需要指定PUBLIC:COMPONENT元素的literalContent属性:
<PUBLIC:COMPONENT tagname="myTag" literalcontent="true">
</PUBLIC:COMPONENT>

当自定义元素以固化元素行为方式实现时,innerText属性是不可用的。任何设置该自定义元素的innerText的尝试都会导致错误。如果在脚本中获取固化内容的元素行为的innerText属性,null会被返回。

innerHTML属性可以用于设置及获取自定义元素的固化内容。自定义元素的innerHTML属性在oncontentready事件发生后才可用。否则,会出现一个错误以指明innerHTML属性当前不可用。

oncontentsave事件发生在进行保存、复制、获取innerText、获取innerHTML或托拽操作的时候。因此该事件在编写固化内容的元素行为时是很有用处的。

可扩展标记语言(XML)的数据岛就是一个很好的固化内容的样例。欲获取更多信息,请阅读《XML数据岛》。
The defaults Objectdefaults对象

defaults对象用于设置及获取HTC文件的默认属性。此对象同样拥有声明方式,PUBLIC:DEFAULTS元素,用于HTC的组件定义部分中设置行为属性的初始状态。

当viewlink属性被设置为一个对象的包含文档的内容时,该元素行为的viewlink状态是肯定的。此时viewlink属性的值引用到文档片段上。默认的,viewlink属性的初始值为null,意味着不存在文档片段。欲了解更多信息,请阅读《ViewLink简介》。

PUBLIC:DEFAULTS元素的部分属性与defaults对象的部分属性是相对应的,因此你可以通过脚本或声明中的任意一种方式来设置属性。

下面的样例展示了PUBLIC:DEFAULTS元素如何为元素行为定义默认的CSS样式属性:
<PUBLIC:COMPONENT tagname="myTag">
<PUBLIC:DEFAULTS style="FONT-WEIGHT:bold;FONT-STYLE:italic" tabstop="true" />
</PUBLIC:COMPONENT>

本样例中tabStop属性同样设置为真,这意味着该元素行为存在于TAB移焦序列中并可以获得焦点。
Accessing the Content of Custom Elements访问自定义元素的内容

要访问自定义元素的内容,使用element对象。HTC文件中的脚本可以通过引用element对象来访问并修改自定义元素的内容。
element.style.color = "red";

前面的实例改变了该标签包含的文本的颜色为红色。

主文档树同样在组件脚本中被访问到,但需使用下面的格式:
element.document

如果单独使用document对象,访问到的将是HTC文件的document对象。
Component Initialization组件初始化

元素行为同步绑定到自定义元素上。因此无须添加事件处理函数来检测组件是否下载完毕并被解析。组件在执行时便已实时地被解析。

HTC文件的行内脚本在浏览器可以运行该文件时便会被执行,因此这部分脚本的任何初始化操作都应仅仅应用到不依赖于自定义元素状态的物件上,或任何存在于主文档的内容上。

当oncontentready事件发生时,自定义元素的内容已被成功解析并建立。HTC文件如果需要设置任何应用到该自定义元素或其内容的属性,都应该添加一个此事件的处理函数。同样的,oncontentready是在脚本中初始化viewlink行为的正确事件。

当ondocumentready事件发生时,文档已经完全解析并建立。如果组件的初始化过程涉及到主文档的结构,那么相应的代码应该放置在这里。ondocumentready事件通告组件,整个页面都已被载入,然后在主文档的onload事件发生前,该事件便会发生。

一些新的方法,诸如doScroll,需要主文档被完全载入。如果这些方法是任何初始化函数的一部分,那么这些代码应该在ondocumentready事件发生时便进行处理。
Binary Behaviors二进制编码的行为

元素行为同样可以使用二进制编码的DHTML行为实现。二进制编码的行为一般使用诸如Visual C++的语言进行编写。在这部分网页中二进制编码的DHTML行为的使用只是稍稍带过,二进制编码的行为如何编写并不在本文的涉及范围内。欲了解更多关于使用或编写二进制编码的行为的信息,请阅读《实现二进制编码的DHTML行为》。

下面的代码样例说明了在主文档中导入二进制编码的DHTML行为的基本方法。
<HTML XMLNS:mybb>
<HEAD>
<OBJECT id="mytag" ... ></OBJECT>
<?IMPORT namespace="mybb" implementation="#mytag" />
</HEAD>
<BODY>
<MYBB:MYTAG></MYBB:MYTAG>
</BODY>
</HTML>

样例在<HEAD>部分包含有object元素,二进制编码的DHTML行为推荐使用该元素来完成实现过程。该元素的ID属性值为mytag,其他属性为了简洁并未显示出来。二进制编码的行为使用了类似于HTC文件的导入方法,但implementation属性被设置为引用object元素标识的#mytag,而非HTC文件的地址。

IMPORT处理指令可以出现在HTML文件的任何地方,但在实现二进制编码的行为时必须放置在object标签之前。另一个将object标签放置在头部分的原因是该标签并不渲染任何二进制编码的DHTML行为的内容,因此不应归在正文部分中。任何不在文档正文中的object标签都应放置在文档的头部分。IMPORT处理指令并不是HTML元素,它不会在主文档中被渲染,也不属于文档树的一部分。
Download Permissions下载许可

HTC的内容被理解为主文档的一部分,因此HTC文件被自动下载到浏览器,而无须在下载前由用户赋予权限。HTC文件的一个权限需求是必须放置在与主文档同域的地址上,否则会出现访问被拒绝的错误。欲了解关于组件下载情况的更多信息,请阅读《HTC参考》和《DHTML行为简介》。

二进制编码的组件不同于HTC文件,它们基本上都以微软ActiveX组件的形式被处理,因此对安全性有更高的要求。一般来说,它们都需要用户确认以获取下载权限,除非主文档所在站点已被设置在安全设定中。
Preventing Printing Problems防止打印的难题

如果元素行为通过脚本修改了主文档的元素树,当页面被打印时该元素行为的内容可能会出现两次。同样的,HTC文件中的脚本会被再次执行。通过添加下面的条件语句来封闭更改元素树的脚本,你可以解决掉打印的问题。
if(document.media != "print") {
// script that modifies the element tree goes here
}
Using Empty-Element Tags使用空元素标签

当你使用诸如<A:B />的空元素标签时,结束的/>字符串可能会被曲解为某个属性值得一部分。下面的表格展示了在空元素标签中定义属性并能被正确解析的各种方式。
标签         Internet Explorer         注意
<A:B value=c/>         不合法         Internet Explorer无法判定该标签是否封闭,因此会尝试检索</A:B>封闭标签。
<A:B value=c />         合法         c之后的空格结束了value属性。
<A:B value="c"/>         合法         c之后的引号结束了value属性。

转载于:https://www.cnblogs.com/zhjxiao/archive/2010/08/31/1813373.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值