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