Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
實(shí)際運(yùn)用中啊隨處可見的就是PC端的字?jǐn)?shù)控制案例,如標(biāo)題只能多少字 內(nèi)容多少字 密碼多少長度等等等等,那么這些功能它是怎么實(shí)現(xiàn)的呢,今兒這個(gè)小分享道哥就給大家分享一下怎么用js去實(shí)現(xiàn)文字的輸入控制。
已知有如下html代碼
<p class="p1"> 計(jì)算剩余字?jǐn)?shù)<br> <textarea cols="70" rows="8" id="msg" onkeyup="test()"></textarea><br> <span id="msg_s"></span> </p>
要實(shí)現(xiàn)在文本域textarea中輸入長度不能超過50的字符并且剩余字?jǐn)?shù)跟隨輸入的內(nèi)容不斷變化,提示還可以輸入多少個(gè)字符 (要注意的是一個(gè)中文占兩個(gè)字符 一個(gè)英文字母或者符號占一個(gè)字符)
代碼如下
<script type="text/javascript"> function test2(){ //取出文本框中文本內(nèi)容 var a=document.getElementById("msg"); var len=50-a.value.length; //與50作比較,得道剩余字?jǐn)?shù) if(len>0){ //如果剩余字?jǐn)?shù)大于0,則提示剩余字?jǐn)?shù) document.getElementById("msg_s").innerHTML="您還剩余"+len+"個(gè)字"; }else{ //如果剩余字?jǐn)?shù)小于0,即字?jǐn)?shù)已超出,則只留前50個(gè)字 document.getElementById("msg_s").innerHTML="您還剩余0個(gè)字"; a.value=a.value.substr(0,50); } } </script>
運(yùn)行結(jié)果如下
文為大家推薦一些實(shí)用的JavaScript鍵盤封裝器,希望在今后的前端過程中有所幫助!
1、mousetrap(處理鍵盤快捷鍵的 JavaScript 庫)
2、Keypress(鍵入捕捉工具庫,任何鍵都可以成為一個(gè)修飾健)
3、KeyboardJS(一個(gè)用于綁定鍵盤組合的 JavaScript 庫,讓你脫離快捷鍵和快捷鍵組合沖突的痛苦)
4、jquery.hotkeys(jQuery Hotkeys 能讓你在代碼任何的地方監(jiān)聽鍵盤事件,并幾乎支持所有按鍵組合)
5、jwerty(令人驚嘆的鍵盤事件處理庫)
6、keymaster(定義和調(diào)度鍵盤快捷鍵的小型庫)
切版 qieban(.cn)
ut.js 是 Node.js 的桌面自動化框架,允許您使用 JavaScript 或 TypeScript 對鼠標(biāo)和鍵盤進(jìn)行編程!
nut.js 的第一步——從安裝到自動化鼠標(biāo)移動
nut.js 為您各自的目標(biāo)平臺提供了預(yù)構(gòu)建版本的 OpenCV。為了使用這些預(yù)編譯的綁定,必須滿足某些運(yùn)行時(shí)條件。
如果您運(yùn)行的是 Windows 10 N 并且想要使用 ImageFinder 插件,請確保安裝了媒體功能包。
在 macOS 上,需要 Xcode 命令行工具。您可以通過運(yùn)行以下命令來安裝它們:
xcode-select --install
注意:
如果您遇到鼠標(biāo)不動或鍵盤不打字等問題,請確保為您執(zhí)行測試的進(jìn)程提供可訪問權(quán)限。
如果缺少權(quán)限,nut.js 會給你一個(gè)提示:
##### WARNING! The application running this script is not a trusted process! Please visit https://github.com/nut-tree/nut.js#macos #####
當(dāng)應(yīng)用程序想要使用輔助功能時(shí),應(yīng)該顯示權(quán)限彈出窗口。如果沒有,您可以嘗試手動添加運(yùn)行腳本的應(yīng)用程序。
設(shè)置 -> 安全和隱私 -> 隱私選項(xiàng)卡 -> 輔助功能 -> 添加...
例如,如果你想在iTerm2執(zhí)行你的node腳本,您必須將 iTerm.app 添加到列表中。從內(nèi)置終端運(yùn)行腳本時(shí),例如 VSCode 或 IntelliJ,您必須添加相應(yīng)的 IDE。
根據(jù)您的發(fā)行版,Linux 設(shè)置可能會有所不同。
一般來說,nut.js 需要 libXtst
在 *buntu 發(fā)行版上安裝:
sudo apt-get install build-essential libxtst-dev
其他linux發(fā)行版的設(shè)置可能不同。
nut.js 針對各種版本的node.js構(gòu)建和測試的。但是,為了獲得最佳兼容性,建議運(yùn)行node.js的最新可用 LTS 版本(在撰寫本文時(shí)為 lts/gallium)并使用像 nvm 這樣的版本管理器。
滿足我們的先決條件后,讓我們繼續(xù)安裝。以下步驟將在您選擇的目錄中執(zhí)行。我們將此目錄簡稱為工作目錄。
讓我們首先通過執(zhí)行以下命令在我們的工作目錄中初始化一個(gè)新的 npm 項(xiàng)目:
npm init
隨意填寫交互式對話,但這并不是繼續(xù)初始設(shè)置的硬性要求。
(你可以通過運(yùn)行 npm init -y 來接受所有默認(rèn)值)
運(yùn)行
npm i @nut-tree/nut-js
或
yarn add @nut-tree/nut-js
在我們新創(chuàng)建的 npm 項(xiàng)目中,將安裝 nut.js 及其所需的依賴項(xiàng)。
nut.js 還提供快照版本,允許測試即將推出的功能。
運(yùn)行
npm i @nut-tree/nut-js@next
或者
yarn add @nut-tree/nut-js@next
將安裝最新的 nut.js 開發(fā)版本。
注意:雖然快照版本非常適合在新的穩(wěn)定版本之前與即將推出的功能一起使用,但它仍然是快照版本。請記住,快照版本在將來可能會發(fā)生變化和/或中斷,因此不建議在生產(chǎn)中使用它們 .
現(xiàn)在都已準(zhǔn)備就緒,是時(shí)候開始行動了!
在我們的工作目錄中,讓我們創(chuàng)建一個(gè)新文件 index.js。
在您喜歡的編輯器中打開它并添加以下行以開始使用:
const { mouse }=require("@nut-tree/nut-js");
(async ()=> {
})();
mouse 讓您可以控制您的鼠標(biāo),讓我們來玩一玩吧!
注意:nut.js 是完全異步的,所以在大多數(shù)示例中你會看到類似上面代碼片段的內(nèi)容,這是一個(gè)異步操作 IIFE,用作在頂層使用 async / await 的變通方法。
const { mouse, left, right, up, down }=require("@nut-tree/nut-js");
(async ()=> {
await mouse.move(left(500));
await mouse.move(up(500));
await mouse.move(right(500));
await mouse.move(down(500))
})();
nut.js 提供了一個(gè)聲明式 API,因此我們可以使用 MovementApi 函數(shù)將光標(biāo)相對于當(dāng)前位置移動,而不是明確指明光標(biāo)移動到的位置。
當(dāng)通過 node index.js 執(zhí)行時(shí),你會看到你的光標(biāo)沿著一個(gè)正方形的變移動,并結(jié)束在它的初始位置。
能夠向上、向下、向左或向右移動光標(biāo)是一個(gè)好的開始,但我們并不是坐在畫板前素描。讓我們看看如何在屏幕上定位特定點(diǎn)。
const { mouse, straightTo, Point }=require("@nut-tree/nut-js");
(async ()=> {
const target=new Point(500, 350);
await mouse.move(straightTo(target));
})();
straightTo 是另一個(gè) MovementApi 函數(shù),它接受一個(gè)目標(biāo)點(diǎn)并計(jì)算一條朝向它的直線,從我們當(dāng)前的光標(biāo)位置開始到目標(biāo)點(diǎn)。
如果您想將鼠標(biāo)移動速度配置得更快/更慢,nut.js 公開的每個(gè)實(shí)例都提供了一個(gè)配置對象。
鼠標(biāo)配置對象允許您配置以像素/秒為單位的移動速度。
const { mouse, straightTo, Point }=require("@nut-tree/nut-js");
(async ()=> {
mouse.config.mouseSpeed=2000;
const fast=new Point(500, 350);
await mouse.move(straightTo(fast));
mouse.config.mouseSpeed=100;
const slow=new Point(100, 150);
await mouse.move(straightTo(slow));
})();
有時(shí)我們不想沿著路徑移動到某個(gè)點(diǎn)。
在這種情況下,我們可以依靠 setPosition 立即將光標(biāo)位置更改為提供的點(diǎn)。
const { mouse, Point }=require("@nut-tree/nut-js");
(async ()=> {
const target=new Point(500, 350);
await mouse.setPosition(target);
})();
了解如何在屏幕上搜索圖像以將其用于自動化
“張圖片勝過千言萬語”
nut.js 允許您在屏幕上定位圖像,這是自動化的一個(gè)關(guān)鍵功能。
為此,我們必須安裝一個(gè)額外的包,提供執(zhí)行圖像比較的功能。否則,所有依賴圖像匹配的函數(shù)都會拋出錯(cuò)誤,如 Error: No ImageFinder registered。
一個(gè)可用的選項(xiàng)是@nut-tree/template-matcher:
npm i @nut-tree/template-matcher
要使用此提供程序包,只需在您的代碼中引入它,例如 index.js:
const { screen, imageResource }=require("@nut-tree/nut-js");
require("@nut-tree/template-matcher"); // 這是新加的
(async ()=> {
try {
await screen.find(imageResource("img.png"));
} catch (e) {
console.error(e);
}
})();
find、findAll 和 waitFor 是圖像搜索的主要函數(shù)。
當(dāng) find 和 findAll 嘗試立即在屏幕上定位圖像時(shí),waitFor 將重復(fù)掃描屏幕以查找圖像,直到達(dá)到特定的超時(shí)時(shí)間。
默認(rèn)情況下,圖像搜索是在多個(gè)尺度上進(jìn)行的。
在自動化更復(fù)雜的任務(wù)時(shí),上述所有功能都是非常強(qiáng)大的幫手,所以讓我們看看如何利用它們來發(fā)揮我們的優(yōu)勢!
為了在您的屏幕上搜索圖像,我們必須提供模板圖像。
這些圖像可以通過它們的完整路徑和 loadImage 加載,也可以相對于可配置的資源目錄加載。
使用資源目錄時(shí),您可以通過文件名引用模板圖像,省略完整路徑。在加載模板圖像時(shí),這些文件名是相對于 screen.config.resourceDirectory 的。
screen.config.resourceDirectory="/path/to/my/template/images"
如果未明確配置,screen.config.resourceDirectory 將設(shè)置為當(dāng)前工作目錄。
不使用 loadImage,而是通過 imageResource 加載所謂的圖像資源。
fetchFromUrl 允許您將 URL 傳遞給位于遠(yuǎn)程主機(jī)上的圖像,該圖像將被獲取并作為 nut.js 圖像返回。
模板圖像是使用其完整路徑直接加載的圖像,相對于可配置的資源目錄或通過 fetchFromUrl 從遠(yuǎn)程主機(jī)加載。
讓我們通過查看示例片段來剖析 screen.find 的工作原理:
const { screen, imageResource }=require("@nut-tree/nut-js");
require("@nut-tree/template-matcher");
(async ()=> {
screen.config.resourceDirectory="/resouce/path";
try {
const region=await screen.find(imageResource("mouse.png"));
console.log(region);
} catch (e) {
console.error(e);
}
})();
首先,在第 1 行和第 2 行設(shè)置導(dǎo)入。
第 5 行設(shè)置我們的資源目錄,盡管最有趣的事情發(fā)生在第 7 行:實(shí)際搜索圖像。
screen.find 將掃描您的主屏幕以查找提供的模板圖像,如果找到匹配項(xiàng),它將返回模板圖像所在的區(qū)域。圖像以每個(gè)像素為基礎(chǔ)進(jìn)行匹配。匹配像素的數(shù)量是可配置的, 通過配置對象的 confidence 屬性設(shè)置。confidence 應(yīng)為 0 到 1 之間的值,默認(rèn)為 0.99(對應(yīng)于 99% 匹配)。
nut.js 目前不支持多顯示器設(shè)置
資源目錄起初可能看起來讓你很混亂,但它實(shí)際上有一個(gè)非常好的副作用。想象一下編寫一個(gè)跨平臺的自動化腳本,我們正在處理不同的 UI,因此需要處理不同的模板圖像。
使用資源目錄,我們可以根據(jù)當(dāng)前平臺配置目錄:
screen.config.resourceDirectory=`/path/to/the/project/${process.platform}`;
這樣,我們可以將所有特定于平臺的模板圖像保存在單獨(dú)的文件夾中,這樣我們不必關(guān)心我們的代碼了。
通過使用依賴于平臺的資源目錄,我們不必處理平臺特定的文件名。相同的文件名將為當(dāng)前平臺加載正確的模板圖像,無需進(jìn)一步操作!
萬一我們搞砸了,nut.js 會通過拒絕拋出錯(cuò)誤讓我們知道。
Searching for mouse.png failed. Reason: 'Error: Failed to load /foo/bar/mouse.png. Reason: 'Failed to load image from '/foo/bar/mouse.png''.'
Searching for mouse.png failed. Reason: 'Error: No match with required confidence 0.99. Best match: 0 at (0, 0, 477, 328)'
findAll 與 find 的用法非常相似。兩者之間的主要區(qū)別在于 findAll 將在主屏幕上返回所有檢測到的匹配項(xiàng)的列表。
find 中提到的所有其他內(nèi)容也適用于 findAll。
能夠在我們的屏幕上定位圖像在自動化時(shí)是一個(gè)巨大的有事,但實(shí)際上,我們必須處理時(shí)間超時(shí)。waitFor 在這里幫助我們指定一個(gè)超時(shí)時(shí)長,希望多久時(shí)間內(nèi)我們的模板圖像出現(xiàn)在屏幕上 !
模板圖像是使用其完整路徑直接加載的圖像,相對于可配置的資源目錄或通過 fetchFromUrl 從遠(yuǎn)程主機(jī)加載。
讓我們稍微調(diào)整一下查找示例中使用的代碼片段:
const { screen, imageResource }=require("@nut-tree/nut-js");
require("@nut-tree/template-matcher");
(async ()=> {
screen.config.resourceDirectory="/resouce/path";
try {
const region=await screen.waitFor(imageResource("mouse.png"));
console.log(region);
} catch (e) {
console.error(e);
}
})();
waitFor 基本上與 find 完全相同,但在指定的時(shí)間段內(nèi)執(zhí)行多次。
它會掃描您的主屏幕以查找給定的模板圖像,但如果找不到它,它會再試一次。這些重試發(fā)生的時(shí)間間隔也是可配置的。
const { screen, imageResource }=require("@nut-tree/nut-js");
require("@nut-tree/template-matcher");
(async ()=> {
screen.config.resourceDirectory="/resouce/path";
try {
const region=await screen.waitFor(imageResource("mouse.png"), 5000, 1000);
console.log(region);
} catch (e) {
console.error(e);
}
})();
在上面的代碼片段中,我們告訴 waitFor 最多尋找模板圖像五秒鐘,每秒重試一次。
如果在配置的毫秒超時(shí)后仍然找不到圖像,它將拒絕。否則,它將返回它定位圖像的區(qū)域,就像查找一樣。
find 中提到的所有內(nèi)容也適用于 waitFor。
操作在 5000 毫秒后超時(shí)
正如我們之前了解到的,waitFor 將重復(fù)搜索我們的屏幕以查找給定的模板圖像。
這種巨大的靈活性不是免費(fèi)的,因此我們可能不想等待超時(shí)觸發(fā)才能取消正在進(jìn)行的搜索。nut.js 遵循與瀏覽器獲取 API 相同的取消方法,使用 AbortController。
在我們實(shí)際查看示例之前,我們必須為我們的項(xiàng)目安裝一個(gè)額外的包:
npm i node-abort-controller
現(xiàn)在,讓我們看一個(gè)(人為的)例子:
const { screen, Region, imageResource }=require("@nut-tree/nut-js");
require("@nut-tree/template-matcher");
const { AbortController }=require("node-abort-controller");
(async ()=> {
const controller=new AbortController();
screen.waitFor(imageResource("test.png"), 5000, 1000, {abort: controller.signal});
setTimeout(()=> controller.abort(), 2000);
})();
我們在第 6 行實(shí)例化我們的 AbortController 并將其信號作為 OptionalSearchParameter 傳遞給 waitFor。
waitFor 配置了 5000 毫秒的超時(shí),1000 毫秒后重試,但 2000 毫秒后,我們在 AbortController 上調(diào)用 abort() ,這將取消正在進(jìn)行的搜索:
Action aborted by signal
特別是在開發(fā)過程中,我們可能希望直觀地跟蹤執(zhí)行腳本時(shí)發(fā)生的情況。尤其是在當(dāng)涉及到圖像搜索時(shí)。 我們找到匹配項(xiàng)的日志,但視覺指示器會更好。
高亮就是用來解決這個(gè)問題的!
通過用不透明的突出顯示窗口覆蓋感興趣區(qū)域來突出顯示區(qū)域。
高亮顯示持續(xù)時(shí)間和不透明度成為 screen.config 對象上的可配置屬性。
highlight 接收一個(gè) Region 指定要突出顯示的區(qū)域。然后它將用不透明的突出顯示窗口覆蓋給定的區(qū)域。
const { screen, Region }=require("@nut-tree/nut-js");
(async ()=> {
screen.config.highlightDurationMs=3000;
const highlightRegion=new Region(50, 100, 200, 300);
await screen.highlight(highlightRegion);
})();
API 的結(jié)構(gòu)方式非常容易突出顯示位于例如位置的區(qū)域。 尋找:
const { screen, imageResource }=require("@nut-tree/nut-js");
require("@nut-tree/template-matcher");
(async ()=> {
screen.config.resourceDirectory="/resouce/path";
screen.config.highlightDurationMs=3000;
await screen.highlight(screen.find(imageResource("image.png")));
})();
然而,手動添加突出顯示不僅麻煩,而且還需要額外的工作,因?yàn)槲覀冊谏a(chǎn)環(huán)境中運(yùn)行腳本之前要再次刪除它。
因此,nut.js 提供了一種自動高亮機(jī)制,可通過配置屬性切換。在開發(fā)期間突出顯示,在生產(chǎn)中禁用它!
const { screen, imageResource }=require("@nut-tree/nut-js");
require("@nut-tree/template-matcher");
(async ()=> {
screen.config.resourceDirectory="/resouce/path";
screen.config.autoHighlight=true;
screen.config.highlightDurationMs=1500;
await screen.find(imageResource("test.png"));
})();
開啟自動高亮后,我們再也不用關(guān)心手動高亮查找結(jié)果了。一旦find返回一個(gè)有效的Region,它就會被高亮顯示。而且由于waitFor重用了find,自動高亮也在那里起作用!
find、findAll 和 waitFor 接受 OptionalSearchParameters 以微調(diào)搜索。
這允許例如 將搜索空間限制在屏幕的特定部分:
const { screen, Region, OptionalSearchParameters, imageResource }=require("@nut-tree/nut-js");
require("@nut-tree/template-matcher");
const { AbortController }=require("node-abort-controller");
(async ()=> {
// 配置你希望搜索的區(qū)域的位置和大小
const searchRegion=new Region(10, 10, 500, 500);
// 配置您希望 Nut 在找到匹配項(xiàng)之前擁有的相似度比率
const confidence=0.88;
// 配置一個(gè) Abort controller,這樣可以隨時(shí)取消查找操作
const controller=new AbortController();
const { signal }=controller;
// 將您的參數(shù)輸入 OptionalSearchParameters 構(gòu)造函數(shù)以確保它們符合規(guī)范
const fullSearchOptionsConfiguration=new OptionalSearchParameters(searchRegion, confidence, signal);
//.find() 將根據(jù)您的搜索參數(shù)和提供的圖像數(shù)據(jù)返回找到匹配項(xiàng)的區(qū)域
const matchRegion=await screen.find(imageResource("image.png"), fullSearchOptionsConfiguration);
const cancelFindTimeout=setTimeout(()=> {
controller.abort();
}, 5000);
})();
多尺度圖像搜索讓您在多個(gè)屏幕分辨率之間切換時(shí)具有彈性,但也有代價(jià)。與在單一尺度上搜索相比,在多個(gè)尺度上搜索時(shí)可能需要更長的時(shí)間。
根據(jù)您手頭的任務(wù),您可能不需要這種額外的靈活性,而是希望從更快的執(zhí)行中獲益。有關(guān)示例,請參見此示例測試結(jié)果:
hyperfine --warmup 3 'node multi-scale.js' 'node single-scale.js' --show-output
Benchmark 1: node multi-scale.js
Time (mean ± σ): 933.5 ms ± 10.4 ms [User: 1647.4 ms, System: 433.8 ms]
Range (min … max): 920.9 ms … 948.4 ms 10 runs
Benchmark 2: node single-scale.js
Time (mean ± σ): 526.8 ms ± 9.3 ms [User: 400.2 ms, System: 108.4 ms]
Range (min … max): 514.3 ms … 544.4 ms 10 runs
Summary
'node single-scale.js' ran
1.77 ± 0.04 times faster than 'node multi-scale.js'
了解如何通過使用窗口來增強(qiáng)您的工作流程
getActiveWindow 允許您在函數(shù)調(diào)用時(shí)獲取系統(tǒng)焦點(diǎn)窗口的 Window 引用。getActiveWindow 將作為 Promise 返回。
const { getActiveWindow }=require('@nut-tree/nut-js');
(async ()=> {
const windowRef=await getActiveWindow();
})();
現(xiàn)在單獨(dú)輸出這個(gè)不會很有用,記住它只是一個(gè)參考:
// source:
// ...
const windowRef=await getActiveWindow();
console.log(windowRef);
// ...
// output:
Window {
providerRegistry: DefaultProviderRegistry {
// ...
},
windowHandle: 2165090
}
相反,我們想利用窗口的標(biāo)題和區(qū)域?qū)傩浴?不過要小心,這些是 getter 屬性,每個(gè)屬性都返回一個(gè) Promise 而不是一個(gè)普通值——所以我們必須使用 await :
const { getActiveWindow }=require('@nut-tree/nut-js');
(async ()=> {
const windowRef=await getActiveWindow();
const title=await windowRef.title
const region=await windowRef.region
console.log(title, region)
})();
您還可以并行而不是順序等待這些值,如下所示:
const { getActiveWindow }=require('@nut-tree/nut-js');
(async ()=> {
const windowRef=await getActiveWindow();
const [title, region]=await Promise.all([windowRef.title, windowRef.region])
console.log(title, region)
})();
此外,請注意此腳本將始終詳細(xì)說明您從中運(yùn)行它的 shell 的窗口信息。 要嘗試獲取不同窗口的詳細(xì)信息,請考慮在調(diào)用 getActiveWindow 之前添加延遲。 我們可以使用 nut.js 自帶的 sleep 輔助函數(shù)來實(shí)現(xiàn):
const { getActiveWindow, sleep }=require('@nut-tree/nut-js');
(async ()=> {
await sleep(4000) //延遲 4 秒再繼續(xù)
const windowRef=await getActiveWindow();
const [title, region]=await Promise.all([windowRef.title, windowRef.region])
console.log(title, region)
})();
const { getActiveWindow, centerOf, randomPointIn, mouse, sleep }=require('@nut-tree/nut-js');
(async ()=> {
const windowRef=await getActiveWindow();
const region=await windowRef.region
await mouse.setPosition(await centerOf(region))
await mouse.leftClick()
await sleep(1000)
await mouse.setPosition(await randomPointIn(region))
await mouse.leftClick()
})();
*請認(rèn)真填寫需求信息,我們會在24小時(shí)內(nèi)與您取得聯(lián)系。