開發中,我們經常需要獲取用戶在表單中輸入的數據,然后進行處理或提交到服務器。今天我們就來聊一聊,如何用JavaScript獲取HTML表單中的值。
FormData 是一個非常方便的工具,它可以把表單中的所有數據打包成鍵值對的形式。我們來看一個例子,假設我們有一個用戶登錄表單:
<form id="login-form">
用戶名: <input type="text" name="username">
<br />
密碼: <input type="password" name="password">
<br />
<input type="submit" value="登錄">
</form>
現在我們要獲取用戶輸入的用戶名和密碼,可以這樣寫:
const form=document.getElementById('login-form');
form.addEventListener('submit', function (e) {
e.preventDefault(); // 阻止表單的默認提交行為
const formData=new FormData(form); // 創建FormData對象
for (const pair of formData.entries()) {
console.log(`${pair[0]}: ${pair[1]}`); // 輸出每一個表單字段的鍵和值
}
});
假設你在開發一個在線購物的系統,用戶在填寫訂單表單后點擊提交,你可以用上面的方法獲取到用戶的所有輸入數據,然后進行驗證或發送到服務器。
你還可以根據需要,把這些數據通過fetch或axios發送到后端服務器,完成用戶的登錄或其他操作。
form.addEventListener('submit', function (e) {
e.preventDefault();
const formData=new FormData(form);
fetch('/login', {
method: 'POST',
body: formData
})
.then(response=> response.json())
.then(data=> console.log(data))
.catch(error=> console.error('Error:', error));
});
FormData 是處理表單數據的強大工具,特別適合在現代Web開發中使用。它不僅簡化了數據獲取的過程,而且能夠很好地與后端API集成。在下次你需要處理表單數據時,不妨試試這個方法,希望這篇文章能幫助你更好地掌握這一技巧。如果你有任何疑問或其他場景的需求,歡迎在評論區與我交流!
比Python,JavaScript才是更適合寫爬蟲的語言。原因有如下三個方面:
一、任務:爬取用戶在Github上的repo信息
通過實例的方式學習爬蟲是最好的方法,先定一個小目標:爬取github repo信息。入口URL如下,我們只需要一直點擊next按鈕就能夠遍歷到用戶的所有repo。
https://github.com/{{username}}?tab=repositories
獲取repo之后,可以做什么?
二、爬蟲雙股劍:axios和jQuery
axios是JavaScript中很常用的異步網絡請求庫,相比jQuery,它更輕量、更專業。既能夠用于瀏覽器端,也可以用于Node。它的語法風格是promise形式的。在本任務中,只需要了解如下用法就足夠了:
axios.get(url).then((resp)=> { 請求成功,處理resp.data中的html數據 }).catch((err)=> { 請求失敗,錯誤處理 })
請求之后需要處理回復結果,處理回復結果的庫當然是用jQuery。實際上,我們有更好的選擇:cheerio。
在node下,使用jQuery,需要使用jsdom庫模擬一個window對象,這種方法效率較低,四個字形容就是:笨重穩妥。
如下代碼使用jQuery解析haha.html文件
fs=require("fs") jquery=require('jquery') jsdom=require('jsdom') //fs.readFileSync()返回結果是一個buffer,相當于byte[] html=fs.readFileSync('haha.html').toString('utf8') dom=new jsdom.JSDOM(html) $=jquery(dom.window) console.log($('h1'))
cheerio只實現了jQuery中的DOM部分,相當于jQuery的一個子集。cheerio的語法和jQuery完全一致,在使用cheerio時,幾乎感覺不到它和jQuery的差異。在解析HTML方面,毫無疑問,cheerio是更好的選擇。如下代碼使用cheerio解析haha.html文件。
cheerio=require('cheerio') html=require('fs').readFileSync("haha.html").toString('utf8') $=cheerio.load(html) console.log($('h1'))
只需20余行,便可實現簡單的github爬蟲,此爬蟲只爬取了一頁repo列表。
var axios=require("axios") var cheerio=require("cheerio") axios.get("https://github.com/weiyinfu?tab=repositories").then(resp=> { var $=cheerio.load(resp.data) var lis=$("#user-repositories-list li") var repos=[] for (var i=0; i < lis.length; i++) { var li=lis.eq(i) var repo={ repoName: li.find("h3").text().trim(), repoUrl: li.find("h3 a").attr("href").trim(), repoDesc: li.find("p").text().trim(), language: li.find("[itemprop=programmingLanguage]").text().trim(), star: li.find(".muted-link.mr-3").eq(0).text().trim(), fork: li.find(".muted-link.mr-3").eq(1).text().trim(), forkedFrom: li.find(".f6.text-gray.mb-1 a").text().trim() } repos.push(repo) } console.log(repos) })
三、更豐富的功能
爬蟲不是目的,而是達成目的的一種手段。獲取數據也不是目的,從數據中提取統計信息并呈現給人才是最終目的。
在github爬蟲的基礎上,我們可以擴展出更加豐富的功能:使用echarts等圖表展示結果。
要想讓更多人使用此爬蟲工具獲取自己的github統計信息,就需要將做成一個網站的形式,通過搜索頁面輸入用戶名,啟動爬蟲立即爬取github信息,然后使用echarts進行統計展示。網站肯定也要用js作為后端,這樣才能和js爬蟲無縫銜接,不然還要考慮跨語言調用。js后端有兩大web框架express和koa,二者API非常相似,并無優劣之分,但express更加流行。
如上設計有一處用戶體驗不佳的地方:當啟動爬蟲爬取github信息時,用戶可能需要等待好幾秒,這個過程不能讓用戶干等著。一種解決思路是:讓用戶看到爬蟲爬取的進度或者爬取過程??梢酝ㄟ^websocket向用戶推送爬取過程信息并在前端進行展示。展示時,使用類似控制臺的界面進行展示。
如何存儲爬取到的數據呢?使用MongoDB或者文件都可以,最好實現兩種存儲方式,讓系統的存儲方式變得可配置。使用MongoDB時,用到js中的連接池框架generic-pool。
整個項目用到的庫包括:
試用地址:
https://weiyinfu.cn/githubstatistic/search.html?
案例地址:https://github.com/weiyinfu/GithubStatistic
原文鏈接:https://zhuanlan.zhihu.com/p/53763115
日常開發中,我們經常需要在用戶瀏覽頁面時進行一些動態操作,比如實現無限滾動加載更多內容、調整布局、或觸發動畫效果。為了實現這些功能,準確獲取整個網頁文檔的高度是關鍵的一步。今天,我們就結合一個實際業務場景,來看一下如何用JavaScript獲取整個文檔的高度。
假設你在開發一個電商網站,需要在用戶滾動到底部時自動加載更多商品。為了實現這個功能,我們需要精確地獲取當前網頁的高度,并判斷用戶是否已經滾動到頁面底部。
要獲取文檔的高度,可以使用scrollHeight、offsetHeight和clientHeight這些屬性的最大值。
示例代碼
在這個場景中,我們可以這樣編寫代碼:
// 獲取文檔的高度
function getDocumentHeight() {
const body=document.body;
const html=document.documentElement;
return Math.max(
body.scrollHeight,
body.offsetHeight,
html.clientHeight,
html.scrollHeight,
html.offsetHeight
);
}
// 監聽滾動事件,加載更多內容
window.addEventListener('scroll', ()=> {
const scrollTop=window.scrollY || document.documentElement.scrollTop;
const windowHeight=window.innerHeight;
const documentHeight=getDocumentHeight();
// 判斷是否滾動到底部
if (scrollTop + windowHeight >=documentHeight) {
loadMoreProducts();
}
});
// 模擬加載更多商品的函數
function loadMoreProducts() {
console.log('加載更多商品...');
// 這里可以加入實際的加載更多商品的代碼邏輯
}
屬性解釋
通過取這些屬性的最大值,我們可以得到整個文檔的高度,確保在任何情況下都能準確測量。
在某些情況下,比如需要獲取元素的精確位置和尺寸時,可以使用getBoundingClientRect方法。這種方法返回一個包含元素尺寸及其相對于視口位置的對象。
示例代碼
在我們這個加載更多商品的場景中,也可以使用這種方法來獲取文檔高度:
// 獲取文檔的高度
function getDocumentHeight() {
const body=document.body;
const html=document.documentElement;
return Math.max(
body.getBoundingClientRect().height,
html.getBoundingClientRect().height
);
}
// 監聽滾動事件,加載更多內容
window.addEventListener('scroll', ()=> {
const scrollTop=window.scrollY || document.documentElement.scrollTop;
const windowHeight=window.innerHeight;
const documentHeight=getDocumentHeight();
// 判斷是否滾動到底部
if (scrollTop + windowHeight >=documentHeight) {
loadMoreProducts();
}
});
// 模擬加載更多商品的函數
function loadMoreProducts() {
console.log('加載更多商品...');
// 這里可以加入實際的加載更多商品的代碼邏輯
}
通過這篇文章,我們結合實際業務場景,了解了如何用JavaScript獲取整個文檔的高度。不論是通過scrollHeight、offsetHeight和clientHeight組合,還是使用getBoundingClientRect方法,都能幫助我們在實際開發中實現動態加載和布局調整的功能。希望這些技術能幫助你在日常開發中更加得心應手!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。