<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>Magic</title><link>http://www.yolinsoft.com/</link><description>专注前端架构</description><item><title>Javascript之事件监听</title><link>http://www.yolinsoft.com/?id=20</link><description>&lt;h3 data-first-child=&quot;&quot; style=&quot;font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-stretch: inherit; font-size: 1.1em; line-height: 1.5; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-optical-sizing: inherit; font-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; margin: 0px 0px calc(1.27273em); clear: left; color: rgb(25, 27, 31); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;S之事件监听&lt;/h3&gt;&lt;p data-pid=&quot;HLxki7g1&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;font-weight: 600;&quot;&gt;事件监听是JavaScript中的一种功能，可以对页面中的特定元素进行监视，然后在特定的用户操作（例如点击按钮，提交表单等）发生时触发特定的代码。&lt;/span&gt;&lt;/p&gt;&lt;h3 style=&quot;font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-stretch: inherit; font-size: 1.1em; line-height: 1.5; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-optical-sizing: inherit; font-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; margin: calc(1.90909em) 0px calc(1.27273em); clear: left; color: rgb(25, 27, 31); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;一、事件监听的两种模式&lt;/h3&gt;&lt;p data-pid=&quot;8QTykXyG&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在浏览器中，事件监听处理有两种模式，一种是&lt;span style=&quot;font-weight: 600;&quot;&gt;事件冒泡&lt;/span&gt;，另一种是&lt;span style=&quot;font-weight: 600;&quot;&gt;事件捕获&lt;/span&gt;。&lt;/p&gt;&lt;ul style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; padding: 0px; width: 690px; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;事件冒泡（bubbling）：当一个元素接收到事件的时候，会把它接收到的事件传给它的父元素，然后再传给父元素的父元素，一直传递到最顶层的 Document 对象。这种事件处理方式就是事件冒泡。大多数事件都会冒泡。简单来说，如果你点击了一个按钮，那么你不仅仅只是点击了按钮，同时也点击了包含这个按钮的所有父元素。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;事件捕获（capturing）：事件捕获与事件冒泡恰好相反，事件会从最外层元素先接收，然后向内层嵌套的元素传递，最后达到最精确的元素。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style=&quot;font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-stretch: inherit; font-size: 1.1em; line-height: 1.5; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-optical-sizing: inherit; font-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; margin: calc(1.90909em) 0px calc(1.27273em); clear: left; color: rgb(25, 27, 31); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;二、事件监听函数&lt;/h3&gt;&lt;p data-pid=&quot;WDLgaV5B&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在JavaScript中，&lt;span style=&quot;font-weight: 600;&quot;&gt;常用的事件监听函数是&lt;code style=&quot;background-color: rgb(248, 248, 250); border-radius: 3px; font-family: Menlo, Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 0.9em; margin: 0px 2px; padding: 3px 4px;&quot;&gt;addEventListener&lt;/code&gt;&lt;/span&gt;。这个函数可以接受&lt;span style=&quot;font-weight: 600;&quot;&gt;三个参数&lt;/span&gt;&lt;/p&gt;&lt;blockquote data-pid=&quot;wnkaABMD&quot; style=&quot;border-left: 3px solid rgb(196, 199, 206); color: rgb(83, 88, 97); margin: 1.4em 0px; padding-left: 1em; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;·第一个是&lt;span style=&quot;font-weight: 600;&quot;&gt;想监听的事件名称&lt;/span&gt;（例如&amp;quot;click&amp;quot;，&amp;quot;mouseover&amp;quot;等）&lt;br/&gt;·第二个是当事件发生时&lt;span style=&quot;font-weight: 600;&quot;&gt;想运行的函数&lt;/span&gt;。&lt;br/&gt;·第三个是可选参数，用于&lt;span style=&quot;font-weight: 600;&quot;&gt;指定事件是否在捕获或冒泡阶段处理&lt;/span&gt;&lt;/blockquote&gt;&lt;p data-pid=&quot;uXGss0KB&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;例子：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-markup&quot;&gt;&amp;lt;!DOCTYPE&amp;nbsp;html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;

&amp;lt;button&amp;nbsp;id=&amp;quot;myBtn&amp;quot;&amp;gt;点击我&amp;lt;/button&amp;gt;

&amp;lt;script&amp;gt;//js语法
document.getElementById(&amp;quot;myBtn&amp;quot;).addEventListener(&amp;quot;click&amp;quot;,&amp;nbsp;function(){
&amp;nbsp;&amp;nbsp;alert(&amp;quot;按钮被点击了！&amp;quot;);
});
&amp;lt;/script&amp;gt;

&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;&lt;p data-pid=&quot;d_d2rRxP&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在这个例子中，我们&lt;em&gt;监听id为&amp;quot;myBtn&amp;quot;的按钮&lt;/em&gt;，当用户点击按钮时，浏览器会弹出一个警告框。&lt;/p&gt;&lt;ol style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; padding: 0px; width: 690px; counter-reset: ol 0; display: table; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;&lt;code style=&quot;background-color: rgb(248, 248, 250); border-radius: 3px; font-family: Menlo, Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 0.9em; margin: 0px 2px; padding: 3px 4px;&quot;&gt;document.getElementById(&amp;quot;myBtn&amp;quot;)&lt;/code&gt;：这个方法获取了DOM树中ID为&amp;quot;myBtn&amp;quot;的元素。这个元素可能是任何类型的HTML元素，只要它的ID是&amp;quot;myBtn&amp;quot;即可。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code style=&quot;background-color: rgb(248, 248, 250); border-radius: 3px; font-family: Menlo, Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 0.9em; margin: 0px 2px; padding: 3px 4px;&quot;&gt;addEventListener(&amp;quot;click&amp;quot;, function())&lt;/code&gt;：这是一个事件监听器，它告诉浏览器：当用户点击id为&amp;quot;myBtn&amp;quot;的元素时，我希望你执行后面那个函数。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;code style=&quot;background-color: rgb(248, 248, 250); border-radius: 3px; font-family: Menlo, Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 0.9em; margin: 0px 2px; padding: 3px 4px;&quot;&gt;function() {alert(&amp;quot;按钮被点击了！&amp;quot;);}&lt;/code&gt;：这是被注册到点击事件的回调函数。当用户点击id为&amp;quot;myBtn&amp;quot;的元素时，这个函数就会被执行。在这个函数里，我们让浏览器弹出一个警告框，显示&amp;quot;按钮被点击了！&amp;quot;。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p class=&quot;ztext-empty-paragraph&quot; style=&quot;margin-top: -0.8em; margin-bottom: -0.8em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;h3 style=&quot;font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-stretch: inherit; font-size: 1.1em; line-height: 1.5; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-optical-sizing: inherit; font-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; margin: calc(1.90909em) 0px calc(1.27273em); clear: left; color: rgb(25, 27, 31); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;三、所谓第三个可选参数&lt;/h3&gt;&lt;p data-pid=&quot;DEtaDqj5&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;font-weight: 600;&quot;&gt;&lt;code style=&quot;background-color: rgb(248, 248, 250); border-radius: 3px; font-family: Menlo, Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 0.9em; margin: 0px 2px; padding: 3px 4px;&quot;&gt;addEventListener&lt;/code&gt;方法还有第三个可选参数，用于指定事件是否在捕获或冒泡阶段处理。&lt;/span&gt;&lt;/p&gt;&lt;p data-pid=&quot;yte38sXd&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;默认的情况下，&lt;code style=&quot;background-color: rgb(248, 248, 250); border-radius: 3px; font-family: Menlo, Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 0.9em; margin: 0px 2px; padding: 3px 4px;&quot;&gt;addEventListener&lt;/code&gt;&amp;nbsp;使用事件冒泡方式，也就是如果没有提供第三个参数，或者&lt;span style=&quot;font-weight: 600;&quot;&gt;提供的值为&amp;nbsp;&lt;code style=&quot;background-color: rgb(248, 248, 250); border-radius: 3px; font-family: Menlo, Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 0.9em; margin: 0px 2px; padding: 3px 4px;&quot;&gt;false&lt;/code&gt;，那么就采用事件冒泡方式处理&lt;/span&gt;。如果你想让&lt;span style=&quot;font-weight: 600;&quot;&gt;事件以捕获方式触发，你可以提供第三个参数为&amp;nbsp;&lt;code style=&quot;background-color: rgb(248, 248, 250); border-radius: 3px; font-family: Menlo, Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 0.9em; margin: 0px 2px; padding: 3px 4px;&quot;&gt;true&lt;/code&gt;&lt;/span&gt;。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;//&amp;nbsp;使用事件捕获
document.getElementById(&amp;quot;myBtn&amp;quot;).addEventListener(&amp;quot;click&amp;quot;,&amp;nbsp;function(){
&amp;nbsp;&amp;nbsp;alert(&amp;quot;按钮被点击了！&amp;quot;);
},&amp;nbsp;true);&lt;/pre&gt;&lt;p data-pid=&quot;WiaYwe1-&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在实际编程中，与其设置捕获模式，我们更多的是在冒泡阶段处理事件。这样可以最大限度地保证我们代码的兼容性，因为并非所有的事件都支持冒泡，但是更少的事件支持捕获。&lt;/p&gt;&lt;h3 style=&quot;font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-stretch: inherit; font-size: 1.1em; line-height: 1.5; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-optical-sizing: inherit; font-size-adjust: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; margin: calc(1.90909em) 0px calc(1.27273em); clear: left; color: rgb(25, 27, 31); text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;四、添加多个事件监听器&lt;/h3&gt;&lt;p data-pid=&quot;zRn_g9_q&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;需要注意的是，可以为一个元素添加多个事件监听器，甚至可以为同一个事件添加多个监听器，&lt;span style=&quot;font-weight: 600;&quot;&gt;&lt;em&gt;当事件发生时，监听器会按照它们被添加的顺序执行&lt;/em&gt;&lt;/span&gt;。&lt;/p&gt;&lt;ul style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; padding: 0px; width: 690px; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;为一个元素添加多个不同的事件监听器：&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;var&amp;nbsp;btn&amp;nbsp;=&amp;nbsp;document.getElementById(&amp;#39;myBtn&amp;#39;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;修改页面标题
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;btn.addEventListener(&amp;#39;click&amp;#39;,&amp;nbsp;function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;document.title&amp;nbsp;=&amp;nbsp;&amp;#39;你点击了按钮！&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;修改元素背景颜色
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;btn.addEventListener(&amp;#39;mouseover&amp;#39;,&amp;nbsp;function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.style.backgroundColor&amp;nbsp;=&amp;nbsp;&amp;#39;red&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;还原元素背景颜色
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;btn.addEventListener(&amp;#39;mouseout&amp;#39;,&amp;nbsp;function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.style.backgroundColor&amp;nbsp;=&amp;nbsp;&amp;#39;&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;/pre&gt;&lt;blockquote data-pid=&quot;DlUOUSL0&quot; style=&quot;border-left: 3px solid rgb(196, 199, 206); color: rgb(83, 88, 97); margin: 1.4em 0px; padding-left: 1em; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在这个例子中，我们为同一个按钮元素添加了三个事件监听器：&lt;br/&gt;对于点击事件（click），我们将页面的标题修改为“你点击了按钮！”；&lt;br/&gt;对于鼠标移上去的事件（mouseover），我们将按钮的背景色改为红色；&lt;br/&gt;对于鼠标移出去的事件（mouseout），我们将按钮的背景色还原。&lt;/blockquote&gt;&lt;ul style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; padding: 0px; width: 690px; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;同一类型的事件添加多个处理函数：&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;var&amp;nbsp;btn&amp;nbsp;=&amp;nbsp;document.getElementById(&amp;#39;myBtn&amp;#39;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;显示第一个事件处理消息
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;btn.addEventListener(&amp;#39;click&amp;#39;,&amp;nbsp;function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&amp;#39;这是第一个点击事件处理函数&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;显示第二个事件处理消息
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;btn.addEventListener(&amp;#39;click&amp;#39;,&amp;nbsp;function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;console.log(&amp;#39;这是第二个点击事件处理函数&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;/pre&gt;&lt;blockquote data-pid=&quot;jkwkm4yc&quot; style=&quot;border-left: 3px solid rgb(196, 199, 206); color: rgb(83, 88, 97); margin: 1.4em 0px; padding-left: 1em; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;在这个例子中，我们为同一个点击事件（click）绑定了两个处理函数。当点击这个按钮时，将会依次在控制台打印出“这是第一个点击事件处理函数”和“这是第二个点击事件处理函数”两个消息。&lt;br/&gt;&lt;span style=&quot;font-weight: 600;&quot;&gt;这是因为当一个元素的同一事件类型被多次绑定事件处理函数时，这些函数将按照添加的顺序依次执行。&lt;/span&gt;&lt;/blockquote&gt;&lt;p data-pid=&quot;39ppKvI2&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;font-weight: 600;&quot;&gt;注意：在 JavaScript 中，&lt;code style=&quot;background-color: rgb(248, 248, 250); border-radius: 3px; font-family: Menlo, Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 0.9em; margin: 0px 2px; padding: 3px 4px;&quot;&gt;addEventListener&lt;/code&gt;&amp;nbsp;方法只能同时为一个特定事件添加一个监听器&lt;/span&gt;&lt;/p&gt;&lt;p data-pid=&quot;q_1No3-E&quot; style=&quot;margin-top: 1.4em; margin-bottom: 1.4em; color: rgb(25, 27, 31); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: medium; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;如果你想为一个元素的两个事件（例如 &amp;#39;click&amp;#39; 和 &amp;#39;mouseover&amp;#39;）都添加同一个监听器函数，你需要分别调用&amp;nbsp;&lt;code style=&quot;background-color: rgb(248, 248, 250); border-radius: 3px; font-family: Menlo, Monaco, Consolas, &amp;quot;Andale Mono&amp;quot;, &amp;quot;lucida console&amp;quot;, &amp;quot;Courier New&amp;quot;, monospace; font-size: 0.9em; margin: 0px 2px; padding: 3px 4px;&quot;&gt;addEventListener&lt;/code&gt;&amp;nbsp;方法，就像下面这样：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;var&amp;nbsp;btn&amp;nbsp;=&amp;nbsp;document.getElementById(&amp;#39;myBtn&amp;#39;);

var&amp;nbsp;handler&amp;nbsp;=&amp;nbsp;function(){
&amp;nbsp;&amp;nbsp;&amp;nbsp;text.innerText&amp;nbsp;=&amp;nbsp;&amp;#39;文本已发生改变&amp;#39;;
}//设置一个名为handler的函数，能够改变文本内容

btn.addEventListener(&amp;#39;click&amp;#39;,&amp;nbsp;handler);//当事件发生时，调用handler函数
btn.addEventListener(&amp;#39;mouseover&amp;#39;,&amp;nbsp;handler)&lt;/pre&gt;&lt;h3 style=&quot;box-sizing: border-box; outline: 0px; margin: 24px 0px 8px; padding: 0px; font-family: &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, SimHei, Arial, SimSun; font-size: 18px; color: rgb(79, 79, 79); line-height: 28px; font-synthesis-style: auto; overflow-wrap: break-word; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;参数一的事件类型&lt;/h3&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;鼠标事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;click 当用户点击某个对象时调用的事件句柄。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;contextmenu 在用户点击鼠标右键打开上下文菜单时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;dblclick 当用户双击某个对象时调用的事件句柄。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;mousedown 鼠标按钮被按下。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;mouseenter 当鼠标指针移动到元素上时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;mouseleave 当鼠标指针移出元素时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;mousemove 鼠标被移动。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;mouseover 鼠标移到某元素之上。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;mouseout 鼠标从某元素移开。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;mouseup 鼠标按键被松开。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;键盘事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;属性 描述 DOM&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;keydown 某个键盘按键被按下。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;keypress 某个键盘按键被按下并松开。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;keyup 某个键盘按键被松开。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;框架/对象（Frame/Object）事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;abort 图像的加载被中断。 ( )&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;beforeunload 该事件在即将离开页面（刷新或关闭）时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;error 在加载文档或图像时发生错误。 ( , 和 )&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;hashchange 该事件在当前 URL 的锚部分发生修改时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;load 一张页面或一幅图像完成加载。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;pageshow 该事件在用户访问页面时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;pagehide 该事件在用户离开当前网页跳转到另外一个页面时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;resize 窗口或框架被重新调整大小。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;scroll 当文档被滚动时发生的事件。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;unload 用户退出页面。 ( 和 )&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;表单事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;blur 元素失去焦点时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;change 该事件在表单元素的内容改变时触发( , , , 和 )&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;focus 元素获取焦点时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;focusin 元素即将获取焦点是触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;focusout 元素即将失去焦点是触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;input 元素获取用户输入是触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;reset 表单重置时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;search 用户向搜索域输入文本时触发&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;剪贴板事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;copy 该事件在用户拷贝元素内容时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;cut 该事件在用户剪切元素内容时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;paste 该事件在用户粘贴元素内容时触发&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;打印事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;afterprint 该事件在页面已经开始打印，或者打印窗口已经关闭时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;beforeprint 该事件在页面即将开始打印时触发&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;拖动事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;drag 该事件在元素正在拖动时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;dragend 该事件在用户完成元素的拖动时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;dragenter 该事件在拖动的元素进入放置目标时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;dragleave 该事件在拖动元素离开放置目标时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;dragover 该事件在拖动元素在放置目标上时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;dragstart 该事件在用户开始拖动元素时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;drop 该事件在拖动元素放置在目标区域时触发&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;多媒体（Media）事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;abort 事件在视频/音频（audio/video）终止加载时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;canplay 事件在用户可以开始播放视频/音频（audio/video）时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;canplaythrough 事件在视频/音频（audio/video）可以正常播放且无需停顿和缓冲时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;durationchange 事件在视频/音频（audio/video）的时长发生变化时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;emptied The event occurs when the current playlist is empty&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;ended 事件在视频/音频（audio/video）播放结束时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;error 事件在视频/音频（audio/video）数据加载期间发生错误时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;loadeddata 事件在浏览器加载视频/音频（audio/video）当前帧时触发触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;loadedmetadata 事件在指定视频/音频（audio/video）的元数据加载后触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;loadstart 事件在浏览器开始寻找指定视频/音频（audio/video）触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;pause 事件在视频/音频（audio/video）暂停时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;play 事件在视频/音频（audio/video）开始播放时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;playing 事件在视频/音频（audio/video）暂停或者在缓冲后准备重新开始播放时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;progress 事件在浏览器下载指定的视频/音频（audio/video）时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;ratechange 事件在视频/音频（audio/video）的播放速度发送改变时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;seeked 事件在用户重新定位视频/音频（audio/video）的播放位置后触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;seeking 事件在用户开始重新定位视频/音频（audio/video）时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;stalled 事件在浏览器获取媒体数据，但媒体数据不可用时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;suspend 事件在浏览器读取媒体数据中止时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;timeupdate 事件在当前的播放位置发送改变时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;volumechange 事件在音量发生改变时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;waiting 事件在视频由于要播放下一帧而需要缓冲时触发。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; --el-button-hover-bg-color: #6D5FFD; --el-button-hover-border-color: #6D5FFD; --el-button-active-bg-color: #6D5FFD; --el-button-active-border-color: #6D5FFD; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;动画事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;animationend 该事件在 CSS 动画结束播放时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;animationiteration 该事件在 CSS 动画重复播放时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;animationstart 该事件在 CSS 动画开始播放时触发&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;过渡事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;transitionend 该事件在 CSS 完成过渡后触发。&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;其他事件&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;message 该事件通过或者从对象(WebSocket, Web Worker, Event Source 或者子 frame 或父窗口)接收到消息时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;online 该事件在浏览器开始在线工作时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;offline 该事件在浏览器开始离线工作时触发。&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;popstate 该事件在窗口的浏览历史（history 对象）发生改变时触发。 event occurs when the window’s history changes&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;show 该事件当&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; outline: 0px; margin-top: 0px; margin-bottom: 16px; padding: 0px; font-size: 16px; color: rgb(77, 77, 77); line-height: 26px; overflow: auto hidden; font-synthesis-style: auto; overflow-wrap: break-word; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-variant-ligatures: no-common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;mark style=&quot;box-sizing: border-box; outline: 0px; background-color: rgb(248, 248, 64); color: rgb(0, 0, 0); font-synthesis-style: auto; overflow-wrap: break-word;&quot;&gt;元素在上下文菜单显示时触发&lt;/mark&gt;&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;storage 该事件在 Web Storage(HTML 5 Web 存储)更新时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;toggle 该事件在用户打开或关闭 元素时触发&lt;br style=&quot;box-sizing: border-box; outline: 0px; font-synthesis-style: auto; overflow-wrap: break-word;&quot;/&gt;wheel 该事件在鼠标滚轮在元素上下滚动时触发&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 08 Aug 2024 11:15:25 +0800</pubDate></item><item><title>百度万年历API 查询 年工作日，法定节假日，调休工作日</title><link>http://www.yolinsoft.com/?id=19</link><description>&lt;p style=&quot;margin: 10px auto; padding: 0px; list-style-type: none; list-style-image: none; color: rgb(68, 68, 68); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;a href=&quot;https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=2020%E5%B9%B46%E6%9C%88&amp;co=&amp;resource_id=6018&amp;t=d21eb6a7-5de6-4d3f-9b06-09e14e5877e3&amp;ie=utf8&amp;oe=gbk&amp;cb=op_aladdin_callback&amp;format=json&amp;tn=baidu&amp;cb=jQuery110209630343350406516_1544930242767&amp;_=1544930242772&quot; rel=&quot;noopener nofollow&quot; style=&quot;text-decoration-line: none; color: rgb(51, 153, 255);&quot;&gt;https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=2020%E5%B9%B46%E6%9C%88&amp;amp;co=&amp;amp;resource_id=6018&amp;amp;t=d21eb6a7-5de6-4d3f-9b06-09e14e5877e3&amp;amp;ie=utf8&amp;amp;oe=gbk&amp;amp;cb=op_aladdin_callback&amp;amp;format=json&amp;amp;tn=baidu&amp;amp;cb=jQuery110209630343350406516_1544930242767&amp;amp;_=1544930242772&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://opendata.baidu.com/api.php?query=2020%E5%B9%B45%E6%9C%88&amp;resource_id=6018&amp;format=json&quot; rel=&quot;noopener nofollow&quot; style=&quot;text-decoration-line: none; color: rgb(51, 153, 255); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;http://opendata.baidu.com/api.php?query=2020%E5%B9%B45%E6%9C%88&amp;amp;resource_id=6018&amp;amp;format=json&lt;/a&gt;&lt;/p&gt;</description><pubDate>Thu, 08 Aug 2024 10:15:41 +0800</pubDate></item><item><title>正则表达式取反</title><link>http://www.yolinsoft.com/?id=18</link><description>&lt;p&gt;取反正则：^((?!要取反的正则表达式).)*$&lt;/p&gt;&lt;p&gt;示例：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;import&amp;nbsp;java.util.regex.Matcher;
import&amp;nbsp;java.util.regex.Pattern;
&amp;nbsp;
public&amp;nbsp;class&amp;nbsp;Main&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;static&amp;nbsp;void&amp;nbsp;main(String[]&amp;nbsp;args)&amp;nbsp;{
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;匹配以test开头的字符串
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pattern&amp;nbsp;pattern&amp;nbsp;=&amp;nbsp;Pattern.compile(&amp;quot;^test&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Matcher&amp;nbsp;matcher&amp;nbsp;=&amp;nbsp;pattern.matcher(&amp;quot;test11&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(matcher.find());
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;匹配不是以test开头的字符串
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Pattern&amp;nbsp;pattern2&amp;nbsp;=&amp;nbsp;Pattern.compile(&amp;quot;^((?!^test).)*$&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Matcher&amp;nbsp;matcher2&amp;nbsp;=&amp;nbsp;pattern2.matcher(&amp;quot;hellotest&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(matcher2.find());
&amp;nbsp;
&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 08 Aug 2024 10:08:56 +0800</pubDate></item><item><title>getBoundingClientRect</title><link>http://www.yolinsoft.com/?id=17</link><description>&lt;div&gt;&lt;p&gt;getBoundingClientRect() 方法返回元素的大小及其相对于视口的位置。&lt;/p&gt;&lt;h4&gt;API&lt;/h4&gt;&lt;h4&gt;let DOMRect = object.getBoundingClientRect()&lt;/h4&gt;&lt;p&gt;它的返回值是一个 DOMRect 对象，这个对象是由该元素的 getClientRects() 方法返回的一组矩形的集合，就是该元素的 CSS 边框大小。返回的结果是包含完整元素的最小矩形，并且拥有 left, top, right, bottom, x, y, width, 和 height 这几个以像素为单位的只读属性用于描述整个边框。除了 width 和 height 以外的属性是相对于视图窗口的左上角来计算的。&lt;/p&gt;&lt;/div&gt;&lt;br/&gt;&lt;p&gt;&lt;img src=&quot;http://www.yolinsoft.com/zb_users/upload/2024/08/20240808100509172308270995996.png&quot;/&gt;&lt;/p&gt;&lt;h4 style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 16px; color: rgb(64, 64, 64); text-rendering: optimizelegibility; font-size: 20px; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;应用场景&lt;/h4&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 20px; word-break: break-word; color: rgb(64, 64, 64); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;1、获取 dom 元素相对于网页左上角定位的距离&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 20px; word-break: break-word; color: rgb(64, 64, 64); font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;以前的写法是通过 offsetParent 找到元素到定位父级元素，直至递归到顶级元素 body 或 html。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;//&amp;nbsp;获取dom元素相对于网页左上角定位的距离
function&amp;nbsp;offset(el)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;var&amp;nbsp;top&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;var&amp;nbsp;left&amp;nbsp;=&amp;nbsp;0
&amp;nbsp;&amp;nbsp;do&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;top&amp;nbsp;+=&amp;nbsp;el.offsetTop
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;left&amp;nbsp;+=&amp;nbsp;el.offsetLeft
&amp;nbsp;&amp;nbsp;}&amp;nbsp;while&amp;nbsp;((el&amp;nbsp;=&amp;nbsp;el.offsetParent))&amp;nbsp;//&amp;nbsp;存在兼容性问题，需要兼容
&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;top:&amp;nbsp;top,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;left:&amp;nbsp;left
&amp;nbsp;&amp;nbsp;}
}

var&amp;nbsp;odiv&amp;nbsp;=&amp;nbsp;document.getElementsByClassName(&amp;#39;markdown-body&amp;#39;)
offset(a[0])&amp;nbsp;//&amp;nbsp;{top:&amp;nbsp;271,&amp;nbsp;left:&amp;nbsp;136}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #404040; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;现在根据 getBoundingClientRect 这个 api，可以写成这样：&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;var&amp;nbsp;positionX&amp;nbsp;=&amp;nbsp;this.getBoundingClientRect().left&amp;nbsp;+&amp;nbsp;document.documentElement.scrollLeft
var&amp;nbsp;positionY&amp;nbsp;=&amp;nbsp;this.getBoundingClientRect().top&amp;nbsp;+&amp;nbsp;document.documentElement.scrollTop&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #404040; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;2、判断元素是否在可视区域内&lt;/span&gt;&lt;span style=&quot;color: #404040; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;function&amp;nbsp;isElView(el)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;var&amp;nbsp;top&amp;nbsp;=&amp;nbsp;el.getBoundingClientRect().top&amp;nbsp;//&amp;nbsp;元素顶端到可见区域顶端的距离
&amp;nbsp;&amp;nbsp;var&amp;nbsp;bottom&amp;nbsp;=&amp;nbsp;el.getBoundingClientRect().bottom&amp;nbsp;//&amp;nbsp;元素底部端到可见区域顶端的距离
&amp;nbsp;&amp;nbsp;var&amp;nbsp;se&amp;nbsp;=&amp;nbsp;document.documentElement.clientHeight&amp;nbsp;//&amp;nbsp;浏览器可见区域高度。
&amp;nbsp;&amp;nbsp;if&amp;nbsp;(top&amp;nbsp;&amp;lt;&amp;nbsp;se&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;bottom&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;true
&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(top&amp;nbsp;&amp;gt;=&amp;nbsp;se&amp;nbsp;||&amp;nbsp;bottom&amp;nbsp;&amp;lt;=&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;不可见
&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;return&amp;nbsp;false
}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #404040; font-family: -apple-system, &amp;quot;system-ui&amp;quot;, &amp;quot;Apple Color Emoji&amp;quot;, &amp;quot;Segoe UI Emoji&amp;quot;, &amp;quot;Segoe UI Symbol&amp;quot;, &amp;quot;Segoe UI&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-size: 16px; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 08 Aug 2024 10:02:56 +0800</pubDate></item><item><title>git怎样恢复删除的远程分支</title><link>http://www.yolinsoft.com/?id=16</link><description>&lt;p&gt;方法：1、利用reflog操作找到最后一次commitid，语法为“git reflog --date=iso”；&lt;/p&gt;&lt;p&gt;2、利用checkout切出分支即可恢复删除的远程分支，语法为“git checkout -b 分支名 commitid”。&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.yolinsoft.com/zb_users/upload/2024/08/20240808095455172308209539914.jpg&quot; alt=&quot;git怎样恢复删除的远程分支&quot;/&gt;&lt;/p&gt;&lt;p&gt;实际工作上，肯定会有不小心的时候，比如我吧，删除了本地dev分支，intellij idea提示是否将tracked branch也删掉，结果一不小心将远程分支也删除了，接下来就是我的救赎之旅。&lt;/p&gt;&lt;p&gt;查看reflog，找到最后一次commitid&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;git&amp;nbsp;reflog&amp;nbsp;--date=iso&lt;/pre&gt;&lt;p&gt;reflog是reference log的意思，也就是引用log，记录HEAD在各个分支上的移动轨迹。选项 --date=iso，表示以标准时间格式展示。这里你肯定会问，为什么不用git log？git log是用来记录当前分支的commit log，分支都删除了，找不到commit log了。&lt;/p&gt;&lt;p&gt;找到目标分支最后一次的commitid，&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;D:\&amp;gt;git&amp;nbsp;reflog&amp;nbsp;--date=iso
287ba1b&amp;nbsp;HEAD@{2019-05-13&amp;nbsp;15:35:18&amp;nbsp;+0800}:&amp;nbsp;checkout:&amp;nbsp;moving&amp;nbsp;from&amp;nbsp;dev&amp;nbsp;to&amp;nbsp;deploy
528a169&amp;nbsp;HEAD@{2019-05-13&amp;nbsp;09:23:58&amp;nbsp;+0800}:&amp;nbsp;commit&amp;nbsp;:&amp;nbsp;添加忽略，.idea,*.iml,*.log&lt;/pre&gt;&lt;p&gt;切出分支&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;git&amp;nbsp;checkout&amp;nbsp;-b&amp;nbsp;recovery_branch_name&amp;nbsp;commitid&lt;/pre&gt;&lt;p&gt;切出分支后，本地有分支了，再push到远程仓库就可以了&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;git&amp;nbsp;push&amp;nbsp;origin&amp;nbsp;recovery_branch_name&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 08 Aug 2024 09:48:15 +0800</pubDate></item><item><title>关于高德地图崩溃的问题</title><link>http://www.yolinsoft.com/?id=15</link><description>&lt;p style=&quot;margin-top: 0px; margin-bottom: 16px; padding: 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; color: rgb(77, 77, 77); overflow-x: auto; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 26px !important;&quot;&gt;开发中依赖高德地图sdk&lt;br style=&quot;margin: 0px; padding: 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);&quot;/&gt;implementation &amp;#39;com.amap.api:search:8.1.0&amp;#39;&lt;br style=&quot;margin: 0px; padding: 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);&quot;/&gt;implementation &amp;#39;com.amap.api:3dmap:9.1.0&amp;#39;&lt;br style=&quot;margin: 0px; padding: 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0);&quot;/&gt;使用中并无问题，但在页面finish的时候按照文档销毁资源的时候却出现了问题。&lt;/p&gt;&lt;p style=&quot;margin-top: 0px; margin-bottom: 16px; padding: 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; color: rgb(77, 77, 77); overflow-x: auto; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 26px !important;&quot;&gt;代码如下，我在页面销毁时，调用销毁地图资源的方法，并在前后都加上了日志。&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;@Override
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;void&amp;nbsp;onDestroy()&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.onDestroy();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.d(TAG,&amp;nbsp;&amp;quot;onDestroy()&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(null&amp;nbsp;!=&amp;nbsp;mMapView)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.d(TAG,&amp;nbsp;&amp;quot;mMapView&amp;nbsp;onDestroy()&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mMapView.onDestroy();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log.d(TAG,&amp;nbsp;&amp;quot;mMapView&amp;nbsp;onDestroy()&amp;nbsp;end&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;结果在退出页面后，app就崩了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin-top: 0px; margin-bottom: 16px; padding: 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; color: rgb(77, 77, 77); overflow-x: auto; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 26px !important;&quot;&gt;&amp;nbsp;&amp;quot;mMapView onDestroy()&amp;quot;日志正常输出，但是却没有&amp;quot;mMapView onDestroy() end&amp;quot;的日志，实际上我打断点追进去也确定了，崩溃就是发生在MapView的onDestory方法内部，但里面都是混淆过的代码，实在找不到原因。&lt;/p&gt;&lt;p style=&quot;margin-top: 0px; margin-bottom: 16px; padding: 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; color: rgb(77, 77, 77); overflow-x: auto; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255); line-height: 26px !important;&quot;&gt;而且这崩溃并没有抛出明确的异常，我用try-catch没有效果；将其放入子线程也无法阻止应用崩溃。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;好消息，官方客服终于给了有用的解答。&lt;/span&gt;&lt;br style=&quot;margin: 0px; padding: 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; color: rgb(77, 77, 77); font-size: 16px; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;在清单文件中的application里加上android:allowNativeHeapPointerTagging=&amp;quot;false&amp;quot;&lt;/span&gt;&lt;br style=&quot;margin: 0px; padding: 0px; box-sizing: border-box; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; color: rgb(77, 77, 77); font-size: 16px; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;/&gt;&lt;span style=&quot;color: #4D4D4D; font-family: -apple-system, &amp;quot;SF UI Text&amp;quot;, Arial, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Hiragino Sans GB&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif, SimHei, SimSun; font-size: 16px; font-variant-ligatures: common-ligatures; text-wrap: wrap; background-color: #FFFFFF;&quot;&gt;亲测有效。&lt;/span&gt;&lt;/p&gt;</description><pubDate>Thu, 08 Aug 2024 09:39:45 +0800</pubDate></item><item><title>Bad credentials异常</title><link>http://www.yolinsoft.com/?id=14</link><description>&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;在spring-security中出现Bad credentials异常，可能是如下情况：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;一.username和password错误&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;二.访问权限不够&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;三.密码加密问题，对于密码加密问题可能是如下情况：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;1.密码无加密，这时应该在密码前加上 {noop},具体原因请翻阅官方api&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-java&quot;&gt;User&amp;nbsp;user&amp;nbsp;=&amp;nbsp;new&amp;nbsp;User(userInfo.getUsername(),&amp;quot;{noop}&amp;quot;+&amp;nbsp;userInfo.getPassword(),getAuthority(userInfo.getRoles()));&lt;/pre&gt;&lt;p&gt;&amp;nbsp;2.在配置文件中设置了密码加密却没有对其在service中对其应用&lt;/p&gt;</description><pubDate>Thu, 08 Aug 2024 09:33:44 +0800</pubDate></item><item><title>Lodop打印控件打印机可打区域的影响 设置纸张边缘为基点</title><link>http://www.yolinsoft.com/?id=13</link><description>&lt;p style=&quot;margin: 10px auto; padding: 0px; list-style-type: none; list-style-image: none; color: rgb(68, 68, 68); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;由于打印机千差万别，打印开发也要注意针对客户各种打印机进行处理，Lodop提供了打印维护（&lt;span style=&quot;color: #000080;&quot;&gt;PRINT_SETUP&lt;/span&gt;）可针对每个客户端进行微调，保存结果保存在客户端本地，对其他访问网站的客户没有影响。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; list-style-type: none; list-style-image: none; color: rgb(68, 68, 68); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;由于打印机的限制，有些打印机不能打印某些规格的纸张，或打印区域有限制，不是所有打印机都支持自定义纸张，也不是所有打印机可打区域都相同，在打印预览界面里选择真实打印机，有时候&lt;span style=&quot;color: #000000; background-color: #FFFF99;&quot;&gt;预览能看到一些虚线，这些虚线是打印机的可打区域，&lt;span style=&quot;color: #800000;&quot;&gt;受打印机的影响&lt;/span&gt;&lt;/span&gt;。&lt;br/&gt;虚线外是不可打的，因此Lodop对打印项的top、left等起始点默认是从可打区域的边缘为起始位置的，这样可以避免有内容超过可打区域造成打印不全，但是这样一来不同打印机可打区域不同，所以坐标的基点不同，也就造成内容在纸张中位置不同，如果不想这样，也可以设置以纸张边缘为基点，那么起始位置就不再是可打区域的边缘了，需要注意内容不要在可打区域外输出。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; list-style-type: none; list-style-image: none; color: rgb(68, 68, 68); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;如图，左侧是默认以可打区域（&lt;span style=&quot;background-color: #CC99FF;&quot;&gt;不同打印机可打区域不同&lt;/span&gt;）为基点，打印项top、left均设置成0，却还有边距，这是由于默认不是以纸张边缘为基点。&lt;br/&gt;右侧是设置以纸张边缘为基点后，打印项起始位置变成了纸张最左上角，由于在可打区域外，因此那部分打印不出来，该top、left的依据是纸张边缘。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; list-style-type: none; list-style-image: none; color: rgb(68, 68, 68); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;top值为0,left为0，应该是在纸张的最左上角位置显示，用虚拟打印机可以看出，top值为0,left为0确实是在纸张的最左上角，然而实际用打印机打印中不一定在最左上角。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; list-style-type: none; list-style-image: none; color: rgb(68, 68, 68); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&lt;span style=&quot;background-color: #CCFFFF;&quot;&gt;虚线是打印机的可打印区域边界，也就是打印机走纸的物理边界&lt;/span&gt;。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; list-style-type: none; list-style-image: none; color: rgb(68, 68, 68); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;不同的打印机边界值不同，一般是1——5mm的差异。&lt;br/&gt;打印机预留的物理边距，不可以取消，有个别打印可以提供修改，具体查看一下相应的打印管理程序。&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; list-style-type: none; list-style-image: none; color: rgb(68, 68, 68); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;以可打区域为基点，能保证内容不会超出可打区域，从而把内容都打印出来。&lt;br/&gt;以纸张边缘为基点，能更好的设计，让不同打印机内容在纸张中的位置一样。&lt;br/&gt;可根据需要，选择默认，或以纸张边缘为基点（设置以纸张边缘为基点需要加如下语句）&lt;br/&gt;&lt;span style=&quot;color: #000080;&quot;&gt;LODOP.SET_PRINT_MODE(&amp;quot;POS_BASEON_PAPER&amp;quot;,true);&lt;span style=&quot;color: #008000;&quot;&gt;//设置以纸张边缘为基点&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; list-style-type: none; list-style-image: none; color: rgb(68, 68, 68); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;&amp;nbsp;&lt;/p&gt;&lt;p style=&quot;margin: 10px auto; padding: 0px; list-style-type: none; list-style-image: none; color: rgb(68, 68, 68); font-family: Tahoma, Arial, Helvetica, sans-serif; text-wrap: wrap; background-color: rgb(255, 255, 255);&quot;&gt;注意：&lt;span style=&quot;color: #993300;&quot;&gt;&lt;span style=&quot;background-color: #CCFFCC;&quot;&gt;可打区域外是打印不出来的&lt;/span&gt;，&lt;span style=&quot;color: #000000;&quot;&gt;和打印机有关。&lt;/span&gt;&lt;/span&gt;&lt;br/&gt;&lt;span style=&quot;color: #000000;&quot;&gt;设置以纸张为基点，只是设计的内容的坐标定位的位置有关，如图所示。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.yolinsoft.com/zb_users/upload/2024/08/20240808091839172307991961595.jpg&quot;/&gt;&lt;/p&gt;</description><pubDate>Thu, 08 Aug 2024 09:18:03 +0800</pubDate></item><item><title>js中小数四舍五入和浮点数的研究</title><link>http://www.yolinsoft.com/?id=12</link><description>&lt;p&gt;toFixed可以实现小数四舍五入，但有时候却不正确，1.335.toFixed(2)=1.33，使用提升倍数然后除以倍数有时候也有问题，35.41 * 100 = 3540.9999999999995，本文讲怎么解决这些。 JS中浮点数精度问题 最近在做项目的时候，涉及到商品价格的计算，经常会出现计算出现精度问题。刚开始草草了事，直接用toFixed就解决了问题，并没有好好的思考一下这个问题。后来慢慢的，问题越来越多，连toFixed也出现了（允悲）。&lt;/p&gt;&lt;p&gt;问题的发现&lt;/p&gt;&lt;p&gt;总结了一下，一共有以下两种问题&lt;/p&gt;&lt;p&gt;浮点数运算后的精度问题&lt;/p&gt;&lt;p&gt;在计算商品价格加减乘除时，偶尔会出现精度问题，一些常见的例子如下：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;//&amp;nbsp;加法&amp;nbsp;=====================
0.1&amp;nbsp;+&amp;nbsp;0.2&amp;nbsp;=&amp;nbsp;0.30000000000000004
0.7&amp;nbsp;+&amp;nbsp;0.1&amp;nbsp;=&amp;nbsp;0.7999999999999999
0.2&amp;nbsp;+&amp;nbsp;0.4&amp;nbsp;=&amp;nbsp;0.6000000000000001

//&amp;nbsp;减法&amp;nbsp;=====================
1.5&amp;nbsp;-&amp;nbsp;1.2&amp;nbsp;=&amp;nbsp;0.30000000000000004
0.3&amp;nbsp;-&amp;nbsp;0.2&amp;nbsp;=&amp;nbsp;0.09999999999999998
&amp;nbsp;
//&amp;nbsp;乘法&amp;nbsp;=====================
19.9&amp;nbsp;*&amp;nbsp;100&amp;nbsp;=&amp;nbsp;1989.9999999999998
0.8&amp;nbsp;*&amp;nbsp;3&amp;nbsp;=&amp;nbsp;2.4000000000000004
35.41&amp;nbsp;*&amp;nbsp;100&amp;nbsp;=&amp;nbsp;3540.9999999999995

//&amp;nbsp;除法&amp;nbsp;=====================
0.3&amp;nbsp;/&amp;nbsp;0.1&amp;nbsp;=&amp;nbsp;2.9999999999999996
0.69&amp;nbsp;/&amp;nbsp;10&amp;nbsp;=&amp;nbsp;0.06899999999999999&lt;/pre&gt;&lt;p&gt;toFixed奇葩问题&lt;/p&gt;&lt;p&gt;在遇到浮点数运算后出现的精度问题时，刚开始我是使用toFixed(2)来解决的，因为在W3school和菜鸟教程（他们均表示这锅不背）上明确写着定义：toFixed()方法可把Number四舍五入为指定小数位数的数字。 但是在chrome下测试结果不太令人满意：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;1.35.toFixed(1)&amp;nbsp;//&amp;nbsp;1.4&amp;nbsp;正确
1.335.toFixed(2)&amp;nbsp;//&amp;nbsp;1.33&amp;nbsp;错误
1.3335.toFixed(3)&amp;nbsp;//&amp;nbsp;1.333&amp;nbsp;错误
1.33335.toFixed(4)&amp;nbsp;//&amp;nbsp;1.3334&amp;nbsp;正确
1.333335.toFixed(5)&amp;nbsp;&amp;nbsp;//&amp;nbsp;1.33333&amp;nbsp;错误
1.3333335.toFixed(6)&amp;nbsp;//&amp;nbsp;1.333333&amp;nbsp;错误&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;使用IETester在IE下面测试的结果却是正确的。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;为什么会产生&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;让我们来看一下为什么0.1+0.2会等于0.30000000000000004，而不是0.3。首先，想要知道为什么会产生这样的问题，让我们回到大学里学的复（ku）杂（zao）的计算机组成原理。虽然已经全部还给大学老师了，但是没关系，我们还有百度嘛。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;浮点数的存储&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;和其它语言如Java和Python不同，JavaScript中所有数字包括整数和小数都只有一种类型 — Number。它的实现遵循 IEEE 754 标准，使用64位固定长度来表示，也就是标准的 double 双精度浮点数（相关的还有float 32位单精度）。 这样的存储结构优点是可以归一化处理整数和小数，节省存储空间。 64位比特又可分为三个部分：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;符号位S：第 1 位是正负数符号位（sign），0代表正数，1代表负数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;指数位E：中间的 11 位存储指数（exponent），用来表示次方数&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;尾数位M：最后的 52 位是尾数（mantissa），超出的部分自动进一舍零&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.yolinsoft.com/zb_users/upload/2024/08/20240808091121172307948180289.png&quot; alt=&quot;vaENNzE&quot;/&gt;&lt;/p&gt;&lt;p&gt;浮点数的运算&lt;/p&gt;&lt;p&gt;那么JavaScript在计算0.1+0.2时到底发生了什么呢？ 首先，十进制的0.1和0.2会被转换成二进制的，但是由于浮点数用二进制表示时是无穷的：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;0.1&amp;nbsp;-&amp;gt;&amp;nbsp;0.0001&amp;nbsp;1001&amp;nbsp;1001&amp;nbsp;1001...(1100循环)
0.2&amp;nbsp;-&amp;gt;&amp;nbsp;0.0011&amp;nbsp;0011&amp;nbsp;0011&amp;nbsp;0011...(0011循环)&lt;/pre&gt;&lt;p&gt;IEEE 754 标准的 64 位双精度浮点数的小数部分最多支持53位二进制位，所以两者相加之后得到二进制为：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;0.0100110011001100110011001100110011001100110011001100&lt;/pre&gt;&lt;p&gt;因浮点数小数位的限制而截断的二进制数字，再转换为十进制，就成了0.30000000000000004。所以在进行算术计算时会产生误差。&lt;/p&gt;&lt;p&gt;解决方法&lt;/p&gt;&lt;p&gt;针对以上两个问题，网上搜了一波解决方法，基本都大同小异的，分别来看一下。&lt;/p&gt;&lt;p&gt;解决toFixed&lt;/p&gt;&lt;p&gt;针对toFixed的兼容性问题，我们可以把toFix重写一下来解决，代码如下：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;//&amp;nbsp;toFixed兼容方法
Number.prototype.toFixed&amp;nbsp;=&amp;nbsp;function(len){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(len&amp;gt;20&amp;nbsp;||&amp;nbsp;len&amp;lt;0){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;RangeError(&amp;#39;toFixed()&amp;nbsp;digits&amp;nbsp;argument&amp;nbsp;must&amp;nbsp;be&amp;nbsp;between&amp;nbsp;0&amp;nbsp;and&amp;nbsp;20&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;.123转为0.123
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;number&amp;nbsp;=&amp;nbsp;Number(this);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(isNaN(number)&amp;nbsp;||&amp;nbsp;number&amp;nbsp;&amp;gt;=&amp;nbsp;Math.pow(10,&amp;nbsp;21))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;number.toString();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(typeof&amp;nbsp;(len)&amp;nbsp;==&amp;nbsp;&amp;#39;undefined&amp;#39;&amp;nbsp;||&amp;nbsp;len&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;(Math.round(number)).toString();
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;result&amp;nbsp;=&amp;nbsp;number.toString(),
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numberArr&amp;nbsp;=&amp;nbsp;result.split(&amp;#39;.&amp;#39;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(numberArr.length&amp;lt;2){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//整数的情况
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;padNum(result);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;intNum&amp;nbsp;=&amp;nbsp;numberArr[0],&amp;nbsp;//整数部分
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deciNum&amp;nbsp;=&amp;nbsp;numberArr[1],//小数部分
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastNum&amp;nbsp;=&amp;nbsp;deciNum.substr(len,&amp;nbsp;1);//最后一个数字
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(deciNum.length&amp;nbsp;==&amp;nbsp;len){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//需要截取的长度等于当前长度
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(deciNum.length&amp;nbsp;&amp;lt;&amp;nbsp;len){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//需要截取的长度大于当前长度&amp;nbsp;1.3.toFixed(2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;padNum(result)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//需要截取的长度小于当前长度，需要判断最后一位数字
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;intNum&amp;nbsp;+&amp;nbsp;&amp;#39;.&amp;#39;&amp;nbsp;+&amp;nbsp;deciNum.substr(0,&amp;nbsp;len);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(parseInt(lastNum,&amp;nbsp;10)&amp;gt;=5){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//最后一位数字大于5，要进位
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;times&amp;nbsp;=&amp;nbsp;Math.pow(10,&amp;nbsp;len);&amp;nbsp;//需要放大的倍数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;changedInt&amp;nbsp;=&amp;nbsp;Number(result.replace(&amp;#39;.&amp;#39;,&amp;#39;&amp;#39;));//截取后转为整数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;changedInt++;//整数进位
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;changedInt&amp;nbsp;/=&amp;nbsp;times;//整数转为小数，注：有可能还是整数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;padNum(changedInt+&amp;#39;&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//对数字末尾加0
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;padNum(num){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;dotPos&amp;nbsp;=&amp;nbsp;num.indexOf(&amp;#39;.&amp;#39;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(dotPos&amp;nbsp;===&amp;nbsp;-1){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//整数的情况
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num&amp;nbsp;+=&amp;nbsp;&amp;#39;.&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;i&amp;lt;len;i++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num&amp;nbsp;+=&amp;nbsp;&amp;#39;0&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;num;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//小数的情况
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;need&amp;nbsp;=&amp;nbsp;len&amp;nbsp;-&amp;nbsp;(num.length&amp;nbsp;-&amp;nbsp;dotPos&amp;nbsp;-&amp;nbsp;1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(var&amp;nbsp;j&amp;nbsp;=&amp;nbsp;0;j&amp;lt;need;j++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;num&amp;nbsp;+=&amp;nbsp;&amp;#39;0&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;num;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;p&gt;我们通过判断最后一位是否大于等于5来决定需不需要进位，如果需要进位先把小数乘以倍数变为整数，加1之后，再除以倍数变为小数，这样就不用一位一位的进行判断。&lt;/p&gt;&lt;p&gt;解决浮点数运算精度&lt;/p&gt;&lt;p&gt;既然我们发现了浮点数的这个问题，又不能直接让两个浮点数运算，那怎么处理呢？ 我们可以把需要计算的数字升级（乘以10的n次幂）成计算机能够精确识别的整数，等计算完成后再进行降级（除以10的n次幂），这是大部分变成语言处理精度问题常用的方法。例如：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;0.1&amp;nbsp;+&amp;nbsp;0.2&amp;nbsp;==&amp;nbsp;0.3&amp;nbsp;//false
(0.1*10&amp;nbsp;+&amp;nbsp;0.2*10)/10&amp;nbsp;==&amp;nbsp;0.3&amp;nbsp;//true&lt;/pre&gt;&lt;p&gt;但是这样就能完美解决么？细心的读者可能在上面的例子里已经发现了问题：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;35.41&amp;nbsp;*&amp;nbsp;100&amp;nbsp;=&amp;nbsp;3540.9999999999995&lt;/pre&gt;&lt;p&gt;看来进行数字升级也不是完全的可靠啊（允悲）。 但是魔高一尺道高一丈，这样就能难住我们么，我们可以将浮点数toString后indexOf(‘.’)，记录一下小数位的长度，然后将小数点抹掉，完整的代码如下：&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-javascript&quot;&gt;/***&amp;nbsp;method&amp;nbsp;**
&amp;nbsp;*&amp;nbsp;&amp;nbsp;add&amp;nbsp;/&amp;nbsp;subtract&amp;nbsp;/&amp;nbsp;multiply&amp;nbsp;/divide
&amp;nbsp;*&amp;nbsp;floatObj.add(0.1,&amp;nbsp;0.2)&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;0.3
&amp;nbsp;*&amp;nbsp;floatObj.multiply(19.9,&amp;nbsp;100)&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;1990
&amp;nbsp;*
&amp;nbsp;*/
var&amp;nbsp;floatObj&amp;nbsp;=&amp;nbsp;function(){

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;判断obj是否为一个整数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;isInteger(obj){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;Math.floor(obj)&amp;nbsp;===&amp;nbsp;obj
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;将一个浮点数转成整数，返回整数和倍数。如&amp;nbsp;3.14&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;314，倍数是&amp;nbsp;100
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;floatNum&amp;nbsp;{number}&amp;nbsp;小数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@return&amp;nbsp;{object}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;{times:100,&amp;nbsp;num:&amp;nbsp;314}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;toInteger(floatNum){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;{times:&amp;nbsp;1,&amp;nbsp;num:&amp;nbsp;0}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(isInteger(floatNum))&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret.num&amp;nbsp;=&amp;nbsp;floatNum
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;ret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;strfi&amp;nbsp;&amp;nbsp;=&amp;nbsp;floatNum&amp;nbsp;+&amp;nbsp;&amp;#39;&amp;#39;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;dotPos&amp;nbsp;=&amp;nbsp;strfi.indexOf(&amp;#39;.&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;len&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;strfi.substr(dotPos+1).length
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;times&amp;nbsp;&amp;nbsp;=&amp;nbsp;Math.pow(10,&amp;nbsp;len)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;intNum&amp;nbsp;=&amp;nbsp;Number(floatNum.toString().replace(&amp;#39;.&amp;#39;,&amp;#39;&amp;#39;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret.times&amp;nbsp;&amp;nbsp;=&amp;nbsp;times
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret.num&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;=&amp;nbsp;intNum
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;ret
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;核心方法，实现加减乘除运算，确保不丢失精度
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;思路：把小数放大为整数（乘），进行算术运算，再缩小为小数（除）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;a&amp;nbsp;{number}&amp;nbsp;运算数1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;b&amp;nbsp;{number}&amp;nbsp;运算数2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;digits&amp;nbsp;{number}&amp;nbsp;精度，保留的小数点数，比如&amp;nbsp;2,&amp;nbsp;即保留为两位小数
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;op&amp;nbsp;{string}&amp;nbsp;运算类型，有加减乘除（add/subtract/multiply/divide）
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;operation(a,&amp;nbsp;b,&amp;nbsp;digits,&amp;nbsp;op){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;o1&amp;nbsp;=&amp;nbsp;toInteger(a)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;o2&amp;nbsp;=&amp;nbsp;toInteger(b)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;n1&amp;nbsp;=&amp;nbsp;o1.num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;n2&amp;nbsp;=&amp;nbsp;o2.num
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;t1&amp;nbsp;=&amp;nbsp;o1.times
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;t2&amp;nbsp;=&amp;nbsp;o2.times
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;max&amp;nbsp;=&amp;nbsp;t1&amp;nbsp;&amp;gt;&amp;nbsp;t2&amp;nbsp;?&amp;nbsp;t1&amp;nbsp;:&amp;nbsp;t2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;result&amp;nbsp;=&amp;nbsp;null
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch&amp;nbsp;(op)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;#39;add&amp;#39;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(t1&amp;nbsp;===&amp;nbsp;t2)&amp;nbsp;{&amp;nbsp;//&amp;nbsp;两个小数位数相同
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;n1&amp;nbsp;+&amp;nbsp;n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(t1&amp;nbsp;&amp;gt;&amp;nbsp;t2)&amp;nbsp;{&amp;nbsp;//&amp;nbsp;o1&amp;nbsp;小数位&amp;nbsp;大于&amp;nbsp;o2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;n1&amp;nbsp;+&amp;nbsp;n2&amp;nbsp;*&amp;nbsp;(t1&amp;nbsp;/&amp;nbsp;t2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&amp;nbsp;//&amp;nbsp;o1&amp;nbsp;小数位&amp;nbsp;小于&amp;nbsp;o2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;n1&amp;nbsp;*&amp;nbsp;(t2&amp;nbsp;/&amp;nbsp;t1)&amp;nbsp;+&amp;nbsp;n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result&amp;nbsp;/&amp;nbsp;max
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;#39;subtract&amp;#39;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(t1&amp;nbsp;===&amp;nbsp;t2)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;n1&amp;nbsp;-&amp;nbsp;n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;if&amp;nbsp;(t1&amp;nbsp;&amp;gt;&amp;nbsp;t2)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;n1&amp;nbsp;-&amp;nbsp;n2&amp;nbsp;*&amp;nbsp;(t1&amp;nbsp;/&amp;nbsp;t2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;n1&amp;nbsp;*&amp;nbsp;(t2&amp;nbsp;/&amp;nbsp;t1)&amp;nbsp;-&amp;nbsp;n2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result&amp;nbsp;/&amp;nbsp;max
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;#39;multiply&amp;#39;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;(n1&amp;nbsp;*&amp;nbsp;n2)&amp;nbsp;/&amp;nbsp;(t1&amp;nbsp;*&amp;nbsp;t2)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case&amp;nbsp;&amp;#39;divide&amp;#39;:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;(n1&amp;nbsp;/&amp;nbsp;n2)&amp;nbsp;*&amp;nbsp;(t2&amp;nbsp;/&amp;nbsp;t1)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;加减乘除的四个接口
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;add(a,&amp;nbsp;b,&amp;nbsp;digits){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;operation(a,&amp;nbsp;b,&amp;nbsp;digits,&amp;nbsp;&amp;#39;add&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;subtract(a,&amp;nbsp;b,&amp;nbsp;digits){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;operation(a,&amp;nbsp;b,&amp;nbsp;digits,&amp;nbsp;&amp;#39;subtract&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;multiply(a,&amp;nbsp;b,&amp;nbsp;digits){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;operation(a,&amp;nbsp;b,&amp;nbsp;digits,&amp;nbsp;&amp;#39;multiply&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;divide(a,&amp;nbsp;b,&amp;nbsp;digits){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;operation(a,&amp;nbsp;b,&amp;nbsp;digits,&amp;nbsp;&amp;#39;divide&amp;#39;)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;exports
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;add:&amp;nbsp;add,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;subtract:&amp;nbsp;subtract,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;multiply:&amp;nbsp;multiply,
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;divide:&amp;nbsp;divide
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}();&lt;/pre&gt;&lt;p&gt;如果觉得floatObj调用麻烦，我们可以在Number.prototype上添加对应的运算方法。&lt;/p&gt;</description><pubDate>Thu, 08 Aug 2024 09:03:12 +0800</pubDate></item><item><title>真正可用的CSS文字两端对齐</title><link>http://www.yolinsoft.com/?id=11</link><description>&lt;p&gt;最近在工作项目中接触到Web界面设计的问题，要实现文字两端对齐的效果。在网上搜索了一下，差不多都是互相转帖，用的都是类似的技巧：&lt;/p&gt;&lt;pre&gt;text-align:justify;
text-justify:inter-ideograph;&lt;/pre&gt;&lt;p&gt;但问题是，我怎么就看不到效果呢？无论是英文还是中文，在IE和chrome下都不起作用。后来，终于在StackOverflow上找到解决方法了。&lt;/p&gt;&lt;p&gt;样式：&lt;/p&gt;&lt;pre&gt;div.justify&amp;nbsp;{&amp;nbsp;text-align:&amp;nbsp;justify;&amp;nbsp;width:200px;&amp;nbsp;font-size:15px;&amp;nbsp;color:red;&amp;nbsp;border:1px&amp;nbsp;solid&amp;nbsp;blue;&amp;nbsp;height:18px;}
div.justify&amp;nbsp;&amp;gt;&amp;nbsp;span&amp;nbsp;{&amp;nbsp;display:&amp;nbsp;inline-block&amp;nbsp;/*&amp;nbsp;Opera&amp;nbsp;*/;&amp;nbsp;padding-left:&amp;nbsp;100%;&amp;nbsp;}&lt;/pre&gt;&lt;p&gt;HTML：&lt;br/&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;div&amp;nbsp;class=&amp;quot;justify&amp;quot;&amp;gt;hello,&amp;nbsp;text&amp;nbsp;justify.&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;div&amp;nbsp;class=&amp;quot;justify&amp;quot;&amp;gt;&amp;nbsp;hello,&amp;nbsp;text&amp;nbsp;justify.&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;div&amp;nbsp;class=&amp;quot;justify&amp;quot;&amp;gt;中&amp;nbsp;文&amp;nbsp;两&amp;nbsp;端&amp;nbsp;对&amp;nbsp;齐&amp;lt;/div&amp;gt;&amp;lt;br/&amp;gt;
&amp;lt;div&amp;nbsp;class=&amp;quot;justify&amp;quot;&amp;gt;中&amp;nbsp;文&amp;nbsp;两&amp;nbsp;端&amp;nbsp;对&amp;nbsp;齐&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;&lt;p&gt;效果图：&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://www.yolinsoft.com/zb_users/upload/2024/08/20240807145823172301390345367.jpg&quot;/&gt;&lt;/p&gt;&lt;p&gt;从效果图可以看到，除了要在块级元素加text-align:justify样式外，还需要在里面加一个空的span元素，并应用样式。另外，对于中文还必须用空格隔开汉字，否则也没有两端对齐的效果。英文每个单词都有空格隔开，所以没问题。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;h1&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;兼容safiri 文字两端对齐&lt;/span&gt;&lt;/h1&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;p&gt;text-align: justify在当文案只有一行的时候是不会生效的。&lt;/p&gt;&lt;p&gt;解决方案是用text-align-last: justify来修复text-align: justify对最后一行不起作用的问题。&lt;/p&gt;&lt;p&gt;Android还是有一定的支持度的，但是ios就惨了，完全不支持，所以只能改。&lt;br/&gt;分析text-align: justify不生效的原因就是文字在最后一行，所以可以再想要两端对齐的文字前后分别加一个标签，然后把文字挤在不是最后一行的位置上。&lt;/p&gt;&lt;/div&gt;&lt;pre class=&quot;prism-highlight prism-language-css&quot;&gt;.content&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width:&amp;nbsp;100px;/*要有固定宽度，不然没法两端对齐*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;text-align:&amp;nbsp;justify;/*设置两端对齐属性*/
}
.content:before,&amp;nbsp;.content:after&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;display:&amp;nbsp;inline-block;/*行内元素*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;content:&amp;nbsp;&amp;#39;&amp;#39;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;width:&amp;nbsp;100%;/*可以挤掉文字，保证不跟文字在同一行*/
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;height:&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;visibility:&amp;nbsp;hidden;
}&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 07 Aug 2024 14:56:16 +0800</pubDate></item></channel></rss>