2019-04-21 11:50:48 +08:00

242 lines
15 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<article class="" id="post-">
<header class="entry-header">
<h1 class="entry-title">.live()</h1>
<div class="entry-meta">
所属分类:<span class="category"><a href="/category/events/">事件</a> &gt; <a href="/category/events/event-handler-attachment/">绑定事件处理器</a></span><span class="category-divider"> | </span><span class="category"><a href="/category/deprecated/">弃用</a> &gt; <a href="/category/deprecated/deprecated-1.7/">1.7 版本弃用的 API</a></span><span class="category-divider"> | </span><span class="category"><a href="/category/removed/">已删除的函数</a></span>
<span class="pull-right">英文文档:<a href="https://api.jquery123.com/live/" target="_blank">.live()</a></span>
</div><!-- .entry-meta -->
</header><!-- .entry-header -->
<!-- .entry-header -->
<div class="entry-content">
<article class="entry method" id="live1"><h2 class="section-title">
<span class="name">.live( events, handler(eventObject) )</span><span class="returns">返回: <a href="/Types/#jQuery">jQuery</a></span><span class="version-details">version deprecated: <a href="/category/version/1.7/">1.7</a>, removed: <a href="/category/version/1.9/">1.9</a></span>
</h2>
<div class="entry-wrapper">
<p class="desc"><strong>描述: </strong>附加一个事件处理器到匹配目前选择器的所有元素,现在和未来。</p>
<ul class="signatures">
<li class="signature" id="live-events-handlereventObject">
<h4 class="name">
<span class="version-details">添加的版本: <a href="/category/version/1.3/">1.3</a></span>.live( events, handler(eventObject) )</h4>
<ul>
<li>
<div><strong>events</strong></div>
<div>类型: <a href="/Types/#String">String</a>
</div>
<div>
一个包含一个JavaScript事件类型的字符串比如"click"或"keydown,"或自定义事件的名称。从jQuery 1.4开始,字符串可以包含多个空格分隔的事件类型或自定义事件的名称。</div>
</li>
<li>
<div><strong>handler(eventObject)</strong></div>
<div>类型: <a href="/Types/#Function">Function</a>()</div>
<div>每当事件触发时执行的函数。</div>
</li>
</ul>
</li>
<li class="signature" id="live-events-data-handlereventObject">
<h4 class="name">
<span class="version-details">添加的版本: <a href="/category/version/1.4/">1.4</a></span>.live( events, data, handler(eventObject) )</h4>
<ul>
<li>
<div><strong>events</strong></div>
<div>类型: <a href="/Types/#String">String</a>
</div>
<div>
一个包含一个JavaScript事件类型的字符串比如"click"或"keydown,"或自定义事件的名称。从jQuery 1.4开始,字符串可以包含多个空格分隔的事件类型或自定义事件的名称。</div>
</li>
<li>
<div><strong>data</strong></div>
<div>类型: <a href="/Types/#PlainObject">PlainObject</a>
</div>
<div>一个包含数据的对象将被传递到事件处理程序。</div>
</li>
<li>
<div><strong>handler(eventObject)</strong></div>
<div>类型: <a href="/Types/#Function">Function</a>()</div>
<div>每当事件触发时执行的函数。</div>
</li>
</ul>
</li>
<li class="signature" id="live-events">
<h4 class="name">
<span class="version-details">添加的版本: <a href="/category/version/1.4.3/">1.4.3</a></span>.live( events )</h4>
<ul><li>
<div><strong>events</strong></div>
<div>类型: <a href="/Types/#PlainObject">PlainObject</a>
</div>
<div>一个或多个JavaScript事件类型的一个普通的对象及其对应的执行函数组成的映射。。</div>
</li></ul>
</li>
</ul>
<div class="longdesc" id="entry-longdesc">
<p>
<strong>从jQuery1.7开始</strong>
 <code>.live()</code> 方法已经过时了。请使用<a href="/on"><code>.on()</code></a>附加事件处理程序。
旧版本的jQuery中用户应优先使用<a href="/delegate"><code>.delegate()</code></a>来取代<code>.live()</code></p>
<p>这个方法提供了一种手段,将委托的事件处理程序附加到一个页面的<code>document</code>元素,从而简化了在页面上动态添加的内容上事件处理的使用。直接与委派事件的讨论,请查看<a href="/on"><code>.on()</code></a>方法的更多信息。</p>
<p>在其继承者重写<code>.live()</code>方法是简单的;以下是三种事件添加方法的模板,它们是等价的:</p>
<div class="syntaxhighlighter javascript nogutter">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line n1">1</div>
<div class="line n2">2</div>
<div class="line n3">3</div>
</td>
<td class="code">
<pre><div class="container"><div class="line"><code>$(selector).live(events, data, handler); <span class="comment">// jQuery 1.3+</span></code></div></div><div class="container"><div class="line"><code>$(document).delegate(selector, events, data, handler); <span class="comment">// jQuery 1.4.3+</span></code></div></div><div class="container"><div class="line"><code>$(document).on(events, selector, data, handler); <span class="comment">// jQuery 1.7+</span></code></div></div></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>
<code>events</code> 参数可以是一个空格隔开的事件类型名称的列表和可选的命名空间,或事件名称字符串和处理程序的对象。<code>data</code>参数是可选的,可以省略。例如,以下三种方法调用方式在功能上是相同的(后文还提供了更有效,性能更好的添加代理事件处理的方式):
</p>
<div class="syntaxhighlighter javascript nogutter">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line n1">1</div>
<div class="line n2">2</div>
<div class="line n3">3</div>
</td>
<td class="code">
<pre><div class="container"><div class="line"><code>$(<span class="string">"a.offsite"</span>).live(<span class="string">"click"</span>, <span class="keyword">function</span>(){ alert(<span class="string">"Goodbye!"</span>); }); <span class="comment">// jQuery 1.3+</span></code></div></div><div class="container"><div class="line"><code>$(document).delegate(<span class="string">"a.offsite"</span>, <span class="string">"click"</span>, <span class="keyword">function</span>(){ alert(<span class="string">"Goodbye!"</span>); }); <span class="comment">// jQuery 1.4.3+</span></code></div></div><div class="container"><div class="line"><code>$(document).on(<span class="string">"click"</span>, <span class="string">"a.offsite"</span>, <span class="keyword">function</span>(){ alert(<span class="string">"Goodbye!"</span>); }); <span class="comment">// jQuery 1.7+</span></code></div></div></pre>
</td>
</tr>
</tbody>
</table>
</div>
<p>因为更高版本的jQuery提供了更好的方法没有<code>.live()</code>方法的缺点,所以<code>.live()</code>方法不再推荐使用。特别是,使用<code>.live()</code>出现的以下问题:</p>
<ul>
<li>在调用 <code>.live()</code> 方法之前jQuery 会先获取与指定的选择器匹配的元素,这一点对于大型文档来说是很花费时间的。
</li>
<li>不支持链式写法。例如,<code>$("a").find(".offsite, .external").live( ... ); </code> 这样的写法是<em>不合法</em>的,并不能像期待的那样起作用。
</li>
<li>由于所有的 <code>.live()</code> 事件被添加到 <code>document</code> 元素上,所以在事件被处理之前,可能会通过最长最慢的那条路径之后才能被触发。
</li>
<li>在移动 iOS (iPhone, iPad 和 iPod Touch) 上,对于大多数元素而言,<code>click</code> 事件不会冒泡到文档 body 上,并且如果不满足如下情况之一,就不能和 <code>.live()</code> 方法一起使用:
<ol>
<li>使用原生的可被点击的元素,例如, <code>a</code><code>button</code>,因为这两个元素可以冒泡到 <code>document</code>
</li>
<li><code>document.body</code> 内的元素使用 <code>.on()</code><code>.delegate()</code> 进行绑定,因为移动 iOS 只有在 body 内才能进行冒泡。
</li>
<li>需要 click 冒泡到元素上才能应用的 CSS 样式 <code>cursor:pointer</code> (或者是父元素包含 <code>document.documentElement</code>)。但是依需注意的是,这样会禁止元素上的复制/粘贴功能,并且当点击元素时,会导致该元素被高亮显示。
</li>
</ol>
</li>
<li>在事件处理中调用 <code><a href="event.stopPropagation.htm">
event.stopPropagation()</a></code>
来阻止事件处理被添加到 document 之后的节点中,是效率很低的。因为事件已经被传播到 <code>document</code> 上。
</li>
<li><code>.live()</code> 方法与其它事件方法的相互影响是会令人感到惊讶的。例如,<code>$(document).unbind("click")</code> 会移除所有通过 <code>.live()</code> 添加的 click 事件!
</li>
</ul>
<p>对于仍在使用<code>.live()</code>的页面,那么下面关于该方法在不同版中的区别,可能会对您有一定帮助:</p>
<ul>
<li>在 jQuery 1.7 之前,如果想阻止通过 <code>.live()</code> 绑定的事件被冒泡到其它元素上,必须在事件处理中返回 <code>false</code>。调用 <code>.stopPropagation()</code> 是不起作用的。
</li>
<li><b>jQuery 1.4</b> 开始,<code>.live()</code> 方法支持自定义事件,也支持<em>所有 JavaScript 事件冒泡</em>。它还支持一些原本不能冒泡的事件,包括 <code>change</code>, <code>submit</code>, <code>focus</code><code>blur</code>
</li>
<li><b>jQuery 1.3.x</b> 中,只能绑定如下 JavaScript 事件:<code>click</code>, <code>dblclick</code>, <code>keydown</code>, <code>keypress</code>, <code>keyup</code>, <code>mousedown</code>, <code>mousemove</code>, <code>mouseout</code>, <code>mouseover</code>, 和 <code>mouseup</code>.
</li>
</ul>
</div>
<section class="entry-examples" id="entry-examples"><header><h2 class="underline">例子:</h2></header><div class="entry-example" id="example-0">
<h4>Example: <span class="desc">点击段落时,添加另一个段落。注意,.live() 会为所有的段落(包括新生成的段落)绑定事件。</span>
</h4>
<div class="syntaxhighlighter javascript ">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line n1">1</div>
</td>
<td class="code">
<pre><div class="container"><div class="line"><code>$(<span class="string">"a"</span>).live(<span class="string">"click"</span>, <span class="keyword">function</span>() { <span class="keyword">return</span> <span class="literal">false</span>; })</code></div></div></pre>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="entry-example" id="example-1">
<h4>Example: <span class="desc">通过使用 preventDefault 方法仅取消默认的动作。</span>
</h4>
<div class="syntaxhighlighter javascript ">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line n1">1</div>
<div class="line n2">2</div>
<div class="line n3">3</div>
</td>
<td class="code">
<pre><div class="container"><div class="line"><code>$(<span class="string">"a"</span>).live(<span class="string">"click"</span>, <span class="keyword">function</span>(event){</code></div></div><div class="container"><div class="line"><code> event.preventDefault();</code></div></div><div class="container"><div class="line"><code>});</code></div></div></pre>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="entry-example" id="example-2">
<h4>Example: <span class="desc">使用 .live() 绑定自定义事件。</span>
</h4>
<div class="syntaxhighlighter javascript ">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line n1">1</div>
<div class="line n2">2</div>
<div class="line n3">3</div>
<div class="line n4">4</div>
<div class="line n5">5</div>
<div class="line n6">6</div>
<div class="line n7">7</div>
<div class="line n8">8</div>
<div class="line n9">9</div>
</td>
<td class="code">
<pre><div class="container"><div class="line"><code>$(<span class="string">"p"</span>).live(<span class="string">"myCustomEvent"</span>, <span class="keyword">function</span>(e, myName, myValue) {</code></div></div><div class="container"><div class="line"><code> $(<span class="keyword">this</span>).text(<span class="string">"Hi there!"</span>);</code></div></div><div class="container"><div class="line"><code> $(<span class="string">"span"</span>).stop().css(<span class="string">"opacity"</span>, <span class="number">1</span>)</code></div></div><div class="container"><div class="line"><code> .text(<span class="string">"myName = "</span> + myName)</code></div></div><div class="container"><div class="line"><code> .fadeIn(<span class="number">30</span>).fadeOut(<span class="number">1000</span>);</code></div></div><div class="container"><div class="line"><code>});</code></div></div><div class="container"><div class="line"><code>$(<span class="string">"button"</span>).click(<span class="function"><span class="keyword">function</span> <span class="params">()</span> {</span></code></div></div><div class="container"><div class="line"><code> $(<span class="string">"p"</span>).trigger(<span class="string">"myCustomEvent"</span>);</code></div></div><div class="container"><div class="line"><code>});</code></div></div></pre>
</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="entry-example" id="example-3">
<h4>Example: <span class="desc">使用映射绑定多个事件处理。注意,.live() 会为所有的段落(包括新生成的段落)绑定 click, mouseover, 和 mouseout 事件。</span>
</h4>
<div class="syntaxhighlighter javascript ">
<table>
<tbody>
<tr>
<td class="gutter">
<div class="line n1">1</div>
<div class="line n2">2</div>
<div class="line n3">3</div>
<div class="line n4">4</div>
<div class="line n5">5</div>
<div class="line n6">6</div>
<div class="line n7">7</div>
<div class="line n8">8</div>
<div class="line n9">9</div>
<div class="line n10">10</div>
<div class="line n11">11</div>
</td>
<td class="code">
<pre><div class="container"><div class="line"><code>$(<span class="string">"p"</span>).live({</code></div></div><div class="container"><div class="line"><code> click: <span class="keyword">function</span>() {</code></div></div><div class="container"><div class="line"><code> $(<span class="keyword">this</span>).after(<span class="string">"&lt;p&gt;Another paragraph!&lt;/p&gt;"</span>);</code></div></div><div class="container"><div class="line"><code> },</code></div></div><div class="container"><div class="line"><code> mouseover: <span class="keyword">function</span>() {</code></div></div><div class="container"><div class="line"><code> $(<span class="keyword">this</span>).addClass(<span class="string">"over"</span>);</code></div></div><div class="container"><div class="line"><code> },</code></div></div><div class="container"><div class="line"><code> mouseout: <span class="keyword">function</span>() {</code></div></div><div class="container"><div class="line"><code> $(<span class="keyword">this</span>).removeClass(<span class="string">"over"</span>);</code></div></div><div class="container"><div class="line"><code> }</code></div></div><div class="container"><div class="line"><code>});</code></div></div></pre>
</td>
</tr>
</tbody>
</table>
</div>
</div></section>
</div></article> </div>
</article>