⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 the room widget the dojo toolkit.mht

📁 dojo学习资料,从初级开始学起,是初学都认识dojo的好帮手.
💻 MHT
📖 第 1 页 / 共 5 页
字号:
class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>joining</SPAN>.<SPAN class=3Dme1>className</SPAN>=3D<SPAN=20
class=3Dst0>''</SPAN>;<BR>&nbsp; &nbsp; <SPAN =
class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>joined</SPAN>.<SPAN class=3Dme1>className</SPAN>=3D<SPAN=20
class=3Dst0>'hidden'</SPAN>;<BR>&nbsp; &nbsp; <SPAN=20
class=3Dco1>//this.username.focus();</SPAN><BR>&nbsp; &nbsp; <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>username</SPAN>.<SPAN=20
class=3Dme1>setAttribute</SPAN><SPAN class=3Dbr0>(</SPAN><SPAN=20
class=3Dst0>"autocomplete"</SPAN>,<SPAN class=3Dst0>"OFF"</SPAN><SPAN=20
class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; <SPAN class=3Dkw1>if</SPAN> <SPAN =

class=3Dbr0>(</SPAN><SPAN class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>registeredAs</SPAN><SPAN class=3Dbr0>)</SPAN> <SPAN =
class=3Dbr0>{</SPAN>=20
<SPAN class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>join</SPAN><SPAN=20
class=3Dbr0>(</SPAN><SPAN class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>registeredAs</SPAN><SPAN class=3Dbr0>)</SPAN>; <SPAN =
class=3Dbr0>}</SPAN>=20
<BR>&nbsp; &nbsp; <SPAN class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>inherited</SPAN><SPAN class=3Dbr0>(</SPAN><SPAN=20
class=3Dst0>"startup"</SPAN>,arguments<SPAN class=3Dbr0>)</SPAN>; =
<BR><SPAN=20
class=3Dbr0>}</SPAN>,</DIV>
<P>this.inherited() acts like Java's super() operator, but more =
generally. Here=20
it calls dijit._Widget.startup(). This is a good practice to get into =
for the=20
widget extension points.</P>
<H2>Joining and Leaving a Room</H2>
<P>Dojo calls the join method upon clicking the Submit button. Just as =
we=20
outlined on the previous page, it establishes the chat connection with =
the=20
operator (only the client calls this particular method). "_join" does =
the same=20
thing in response to keystrokes. </P>
<P>Note how the dojoAttachPoints come in handy here: they make flipping =
the=20
nodes on and off straightforward.</P>
<DIV class=3Dgeshifilter style=3D"FONT-FAMILY: monospace">join: <SPAN=20
class=3Dkw2>function</SPAN><SPAN class=3Dbr0>(</SPAN><SPAN=20
class=3Dkw3>name</SPAN><SPAN class=3Dbr0>)</SPAN><SPAN =
class=3Dbr0>{</SPAN><BR>&nbsp;=20
&nbsp; <SPAN class=3Dkw1>if</SPAN><SPAN class=3Dbr0>(</SPAN><SPAN=20
class=3Dkw3>name</SPAN> =3D=3D <SPAN class=3Dkw2>null</SPAN> || <SPAN=20
class=3Dkw3>name</SPAN>.<SPAN class=3Dme1>length</SPAN>=3D=3D<SPAN=20
class=3Dnu0>0</SPAN><SPAN class=3Dbr0>)</SPAN><SPAN =
class=3Dbr0>{</SPAN><BR>&nbsp;=20
&nbsp; &nbsp; &nbsp; <SPAN class=3Dkw3>alert</SPAN><SPAN =
class=3Dbr0>(</SPAN><SPAN=20
class=3Dst0>'Please enter a username!'</SPAN><SPAN =
class=3Dbr0>)</SPAN>;<BR>&nbsp;=20
&nbsp; <SPAN class=3Dbr0>}</SPAN><SPAN class=3Dkw1>else</SPAN><SPAN=20
class=3Dbr0>{</SPAN><BR>&nbsp; &nbsp; &nbsp; &nbsp; <SPAN =
class=3Dkw1>if</SPAN><SPAN=20
class=3Dbr0>(</SPAN><SPAN class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>isPrivate</SPAN><SPAN class=3Dbr0>)</SPAN><SPAN =
class=3Dbr0>{</SPAN> <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>roomId</SPAN> =3D <SPAN=20
class=3Dkw3>name</SPAN>; <SPAN class=3Dbr0>}</SPAN> <BR>&nbsp; &nbsp; =
&nbsp; &nbsp;=20
<SPAN class=3Dkw1>this</SPAN>._username=3D<SPAN =
class=3Dkw3>name</SPAN>;<BR>&nbsp;=20
&nbsp; &nbsp; &nbsp; <SPAN class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>joining</SPAN>.<SPAN class=3Dme1>className</SPAN>=3D<SPAN=20
class=3Dst0>'hidden'</SPAN>;<BR>&nbsp; &nbsp; &nbsp; &nbsp; <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>joined</SPAN>.<SPAN=20
class=3Dme1>className</SPAN>=3D<SPAN class=3Dst0>''</SPAN>;<BR>&nbsp; =
&nbsp; &nbsp;=20
&nbsp; <SPAN class=3Dkw1>this</SPAN>.<SPAN =
class=3Dme1>phrase</SPAN>.<SPAN=20
class=3Dkw3>focus</SPAN><SPAN class=3Dbr0>(</SPAN><SPAN=20
class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; &nbsp; &nbsp; dojox.<SPAN=20
class=3Dme1>cometd</SPAN>.<SPAN class=3Dme1>subscribe</SPAN><SPAN=20
class=3Dbr0>(</SPAN><SPAN class=3Dst0>"/chat/demo/"</SPAN> + <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>roomId</SPAN>, <SPAN=20
class=3Dkw1>this</SPAN>, <SPAN class=3Dst0>"_chat"</SPAN><SPAN=20
class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; &nbsp; &nbsp; dojox.<SPAN=20
class=3Dme1>cometd</SPAN>.<SPAN class=3Dme1>publish</SPAN><SPAN=20
class=3Dbr0>(</SPAN><SPAN class=3Dst0>"/chat/demo/"</SPAN> + <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>roomId</SPAN>, <BR>&nbsp; =
&nbsp; &nbsp;=20
&nbsp; &nbsp; &nbsp;<SPAN class=3Dbr0>{</SPAN> user: <SPAN=20
class=3Dkw1>this</SPAN>._username, join: <SPAN class=3Dkw2>true</SPAN>, =
<BR>&nbsp;=20
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;chat : <SPAN=20
class=3Dkw1>this</SPAN>._username+<SPAN class=3Dst0>" has joined the=20
room."</SPAN><SPAN class=3Dbr0>}</SPAN><BR>&nbsp; &nbsp; &nbsp; &nbsp; =
<SPAN=20
class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; &nbsp; &nbsp; dojox.<SPAN=20
class=3Dme1>cometd</SPAN>.<SPAN class=3Dme1>publish</SPAN><SPAN=20
class=3Dbr0>(</SPAN><SPAN class=3Dst0>"/chat/demo"</SPAN>, <SPAN =
class=3Dbr0>{</SPAN>=20
user: <SPAN class=3Dkw1>this</SPAN>._username, joined: <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>roomId</SPAN> <SPAN=20
class=3Dbr0>}</SPAN><SPAN class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; <SPAN=20
class=3Dbr0>}</SPAN><BR><SPAN class=3Dbr0>}</SPAN>,<BR =
class=3Dgeshibr>_join: <SPAN=20
class=3Dkw2>function</SPAN><SPAN class=3Dbr0>(</SPAN><SPAN =
class=3DcoMULTI>/* Event=20
*/</SPAN>e<SPAN class=3Dbr0>)</SPAN><SPAN class=3Dbr0>{</SPAN><BR>&nbsp; =
&nbsp;=20
<SPAN class=3Dkw2>var</SPAN> key =3D <SPAN class=3Dbr0>(</SPAN>e.<SPAN=20
class=3Dme1>charCode</SPAN> =3D=3D dojo.<SPAN =
class=3Dme1>keys</SPAN>.<SPAN=20
class=3Dme1>SPACE</SPAN> ? dojo.<SPAN class=3Dme1>keys</SPAN>.<SPAN=20
class=3Dme1>SPACE</SPAN> : e.<SPAN class=3Dme1>keyCode</SPAN><SPAN=20
class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; <SPAN class=3Dkw1>if</SPAN> <SPAN =

class=3Dbr0>(</SPAN>key =3D=3D dojo.<SPAN class=3Dme1>keys</SPAN>.<SPAN=20
class=3Dme1>ENTER</SPAN> || e.<SPAN class=3Dme1>type</SPAN>=3D=3D<SPAN=20
class=3Dst0>"click"</SPAN><SPAN class=3Dbr0>)</SPAN><SPAN=20
class=3Dbr0>{</SPAN><BR>&nbsp; &nbsp; &nbsp; &nbsp; <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>join</SPAN><SPAN =
class=3Dbr0>(</SPAN><SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>username</SPAN>.<SPAN=20
class=3Dme1>value</SPAN><SPAN class=3Dbr0>)</SPAN>; <BR>&nbsp; &nbsp; =
<SPAN=20
class=3Dbr0>}</SPAN><BR><SPAN class=3Dbr0>}</SPAN>,</DIV>
<P>Leaving, for the most part, just reverses the join sequence:</P>
<DIV class=3Dgeshifilter style=3D"FONT-FAMILY: monospace">leave: <SPAN=20
class=3Dkw2>function</SPAN><SPAN class=3Dbr0>(</SPAN><SPAN =
class=3Dbr0>)</SPAN><SPAN=20
class=3Dbr0>{</SPAN> <BR>&nbsp; &nbsp; dojox.<SPAN =
class=3Dme1>cometd</SPAN>.<SPAN=20
class=3Dme1>unsubscribe</SPAN><SPAN class=3Dbr0>(</SPAN><SPAN=20
class=3Dst0>"/chat/demo/"</SPAN> + <SPAN class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>roomId</SPAN>, <SPAN class=3Dkw1>this</SPAN>, <SPAN=20
class=3Dst0>"_chat"</SPAN><SPAN class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; =
dojox.<SPAN=20
class=3Dme1>cometd</SPAN>.<SPAN class=3Dme1>publish</SPAN><SPAN=20
class=3Dbr0>(</SPAN><SPAN class=3Dst0>"/chat/demo/"</SPAN> + <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>roomId</SPAN>, <BR>&nbsp; =
&nbsp; &nbsp;=20
&nbsp;<SPAN class=3Dbr0>{</SPAN> user: <SPAN =
class=3Dkw1>this</SPAN>._username,=20
leave: <SPAN class=3Dkw2>true</SPAN>, <BR>&nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp;chat :=20
<SPAN class=3Dkw1>this</SPAN>._username+<SPAN class=3Dst0>" has left the =

chat."</SPAN><SPAN class=3Dbr0>}</SPAN><BR>&nbsp; &nbsp; <SPAN=20
class=3Dbr0>)</SPAN>;<BR class=3Dgeshibr>&nbsp; &nbsp; <SPAN =
class=3Dco1>// switch the=20
input form back to login mode</SPAN><BR>&nbsp; &nbsp; <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>joining</SPAN>.<SPAN=20
class=3Dme1>className</SPAN>=3D<SPAN class=3Dst0>''</SPAN>;<BR>&nbsp; =
&nbsp; <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>joined</SPAN>.<SPAN=20
class=3Dme1>className</SPAN>=3D<SPAN =
class=3Dst0>'hidden'</SPAN>;<BR>&nbsp; &nbsp;=20
<SPAN class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>username</SPAN>.<SPAN=20
class=3Dkw3>focus</SPAN><SPAN class=3Dbr0>(</SPAN><SPAN=20
class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; <SPAN =
class=3Dkw1>this</SPAN>._username=3D<SPAN=20
class=3Dkw2>null</SPAN>;<BR><SPAN class=3Dbr0>}</SPAN>,</DIV>
<H2>Sending and Receiving a Message</H2>
<P>Finally, the meaty part of the Room widget. Sending is a fairly =
simple matter=20
over our protocol:</P>
<DIV class=3Dgeshifilter style=3D"FONT-FAMILY: monospace">chat: <SPAN=20
class=3Dkw2>function</SPAN><SPAN class=3Dbr0>(</SPAN>text<SPAN=20
class=3Dbr0>)</SPAN><SPAN class=3Dbr0>{</SPAN><BR>&nbsp; &nbsp; <SPAN =
class=3Dco1>//=20
summary: publish a text message to the room</SPAN><BR>&nbsp; &nbsp; =
<SPAN=20
class=3Dkw1>if</SPAN><SPAN class=3Dbr0>(</SPAN>text !=3D <SPAN =
class=3Dkw2>null</SPAN>=20
&amp;&amp; text.<SPAN class=3Dme1>length</SPAN>&gt;<SPAN =
class=3Dnu0>0</SPAN><SPAN=20
class=3Dbr0>)</SPAN><SPAN class=3Dbr0>{</SPAN><BR>&nbsp; &nbsp; &nbsp; =
&nbsp; <SPAN=20
class=3Dco1>// lame attempt to prevent markup</SPAN><BR>&nbsp; &nbsp; =
&nbsp;=20
&nbsp; text=3Dtext.<SPAN class=3Dme1>replace</SPAN><SPAN =
class=3Dbr0>(</SPAN><SPAN=20
class=3Dre0>/&lt;/g</SPAN>,<SPAN class=3Dst0>'&lt;'</SPAN><SPAN=20
class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; &nbsp; &nbsp; text=3Dtext.<SPAN=20
class=3Dme1>replace</SPAN><SPAN class=3Dbr0>(</SPAN><SPAN=20
class=3Dre0>/&gt;/g</SPAN>,<SPAN class=3Dst0>'&gt;'</SPAN><SPAN=20
class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; &nbsp; &nbsp; dojox.<SPAN=20
class=3Dme1>cometd</SPAN>.<SPAN class=3Dme1>publish</SPAN><SPAN=20
class=3Dbr0>(</SPAN><SPAN class=3Dst0>"/chat/demo/"</SPAN> + <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>roomId</SPAN>, <SPAN =
class=3Dbr0>{</SPAN>=20
user: <SPAN class=3Dkw1>this</SPAN>._username, chat: text<SPAN=20
class=3Dbr0>}</SPAN><SPAN class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; <SPAN=20
class=3Dbr0>}</SPAN><BR><SPAN class=3Dbr0>}</SPAN>,</DIV><BR>
<P>Receive is handled by the topic subscriptions, which we connected in =
join().=20
The event mediator sends receive() a message, which becomes the =
parameter=20
"message" here. Then message.data contains the object that the publisher =
sent=20
over.</P>
<DIV class=3Dgeshifilter style=3D"FONT-FAMILY: monospace">_chat: <SPAN=20
class=3Dkw2>function</SPAN><SPAN class=3Dbr0>(</SPAN>message<SPAN=20
class=3Dbr0>)</SPAN><SPAN class=3Dbr0>{</SPAN><BR>&nbsp; &nbsp; <SPAN =
class=3Dco1>//=20
summary: process an incoming message</SPAN><BR>&nbsp; &nbsp; <SPAN=20
class=3Dkw1>if</SPAN> <SPAN class=3Dbr0>(</SPAN>!message.<SPAN=20
class=3Dme1>data</SPAN><SPAN class=3Dbr0>)</SPAN><SPAN =
class=3Dbr0>{</SPAN><BR>&nbsp;=20
&nbsp; &nbsp; &nbsp; console.<SPAN class=3Dme1>warn</SPAN><SPAN=20
class=3Dbr0>(</SPAN><SPAN class=3Dst0>"bad message format =
"</SPAN>+message<SPAN=20
class=3Dbr0>)</SPAN>;<BR>&nbsp; &nbsp; &nbsp; &nbsp; <SPAN=20
class=3Dkw1>return</SPAN>;<BR>&nbsp; &nbsp; <SPAN =
class=3Dbr0>}</SPAN><BR>&nbsp;=20
&nbsp; <SPAN class=3Dkw2>var</SPAN> from=3Dmessage.<SPAN =
class=3Dme1>data</SPAN>.<SPAN=20
class=3Dme1>user</SPAN>;<BR>&nbsp; &nbsp; <SPAN class=3Dkw2>var</SPAN>=20
special=3Dmessage.<SPAN class=3Dme1>data</SPAN>.<SPAN =
class=3Dme1>join</SPAN> ||=20
message.<SPAN class=3Dme1>data</SPAN>.<SPAN =
class=3Dme1>leave</SPAN>;<BR>&nbsp;=20
&nbsp; <SPAN class=3Dkw2>var</SPAN> text=3Dmessage.<SPAN =
class=3Dme1>data</SPAN>.<SPAN=20
class=3Dme1>chat</SPAN>;<BR>&nbsp; &nbsp; <SPAN =
class=3Dkw1>if</SPAN><SPAN=20
class=3Dbr0>(</SPAN>text!=3D<SPAN class=3Dkw2>null</SPAN><SPAN =
class=3Dbr0>)</SPAN><SPAN=20
class=3Dbr0>{</SPAN><BR>&nbsp; &nbsp; &nbsp; &nbsp; <SPAN =
class=3Dkw1>if</SPAN><SPAN=20
class=3Dbr0>(</SPAN>!special &amp;&amp; from =3D=3D <SPAN =
class=3Dkw1>this</SPAN>._last=20
<SPAN class=3Dbr0>)</SPAN><SPAN class=3Dbr0>{</SPAN> from=3D<SPAN=20
class=3Dst0>"..."</SPAN>;<BR>&nbsp; &nbsp; &nbsp; &nbsp; <SPAN=20
class=3Dbr0>}</SPAN><SPAN class=3Dkw1>else</SPAN><SPAN =
class=3Dbr0>{</SPAN><BR>&nbsp;=20
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <SPAN=20
class=3Dkw1>this</SPAN>._last=3Dfrom;<BR>&nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp; &nbsp;=20
from+=3D<SPAN class=3Dst0>":"</SPAN>;<BR>&nbsp; &nbsp; &nbsp; &nbsp; =
<SPAN=20
class=3Dbr0>}</SPAN><BR class=3Dgeshibr>&nbsp; &nbsp; &nbsp; &nbsp; =
<SPAN=20
class=3Dkw1>if</SPAN><SPAN class=3Dbr0>(</SPAN>special<SPAN =
class=3Dbr0>)</SPAN><SPAN=20
class=3Dbr0>{</SPAN><BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <SPAN=20
class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>chatNode</SPAN>.<SPAN=20
class=3Dme1>innerHTML</SPAN> +=3D <BR>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp;=20
&nbsp; &nbsp; <SPAN class=3Dst0>"&lt;span class=3D<SPAN=20
class=3Des0>\"</SPAN>alert<SPAN class=3Des0>\"</SPAN>&gt;&lt;span =
class=3D<SPAN=20
class=3Des0>\"</SPAN>from<SPAN =
class=3Des0>\"</SPAN>&gt;"</SPAN>+from+<BR>&nbsp;=20
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <SPAN=20
class=3Dst0>"&nbsp;&lt;/span&gt;&lt;span class=3D<SPAN =
class=3Des0>\"</SPAN>text<SPAN=20
class=3Des0>\"</SPAN>&gt;"</SPAN>+text+<SPAN=20
class=3Dst0>"&lt;/span&gt;&lt;/span&gt;"</SPAN>;&nbsp; <BR>&nbsp; &nbsp; =
&nbsp;=20
&nbsp; &nbsp; &nbsp; <SPAN class=3Dkw1>this</SPAN>._last=3D<SPAN=20
class=3Dst0>""</SPAN>;<BR>&nbsp; &nbsp; &nbsp; &nbsp; <SPAN=20
class=3Dbr0>}</SPAN><SPAN class=3Dkw1>else</SPAN><SPAN =
class=3Dbr0>{</SPAN><BR>&nbsp;=20
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <SPAN class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>chatNode</SPAN>.<SPAN class=3Dme1>innerHTML</SPAN> +=3D =
<BR>&nbsp; &nbsp;=20
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <SPAN class=3Dst0>"&lt;span =
class=3D<SPAN=20
class=3Des0>\"</SPAN>from<SPAN =
class=3Des0>\"</SPAN>&gt;"</SPAN>+from+<SPAN=20
class=3Dst0>"&nbsp;&lt;/span&gt;&lt;span class=3D<SPAN =
class=3Des0>\"</SPAN>text<SPAN=20
class=3Des0>\"</SPAN>&gt;"</SPAN>+text+<BR>&nbsp; &nbsp; &nbsp; &nbsp; =
&nbsp;=20
&nbsp; &nbsp; &nbsp; <SPAN class=3Dst0>"&lt;/span&gt;"</SPAN>;<BR>&nbsp; =
&nbsp;=20
&nbsp; &nbsp; &nbsp; &nbsp; <SPAN class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>chatNode</SPAN>.<SPAN class=3Dme1>scrollTop</SPAN> =3D <SPAN =

class=3Dkw1>this</SPAN>.<SPAN class=3Dme1>chatNode</SPAN>.<SPAN=20
class=3Dme1>scrollHeight</SPAN> - <SPAN class=3Dkw1>this</SPAN>.<SPAN=20
class=3Dme1>chatNode</SPAN>.<SPAN class=3Dme1>clientHeight</SPAN>;&nbsp; =
&nbsp;=20
<BR>&nbsp; &nbsp; &nbsp; &nbsp; <SPAN class=3Dbr0>}</SPAN><BR>&nbsp; =
&nbsp; <SPAN=20

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -