2016.06.17廖雪峰JS__学习笔记(操作表单)__P13

本文介绍了HTML表单的各种输入控件,包括文本框、口令框、单选框、复选框等,并详细解释了如何使用JavaScript获取用户输入及提交表单。

HTML表单的输入控件主要有以下几种:

  • 文本框,对应的<input type="text">,用于输入文本;

  • 口令框,对应的<input type="password">,用于输入口令;

  • 单选框,对应的<input type="radio">,用于选择一项;

  • 复选框,对应的<input type="checkbox">,用于选择多项;

  • 下拉框,对应的<select>,用于选择一项;

  • 隐藏文本,对应的<input type="hidden">,用户不可见,但表单提交时会把隐藏文本发送到服务器。

获取值

如果我们获得了一个<input>节点的引用,就可以直接调用value获得对应的用户输入值:

// <input type="text" id="email">
var input = document.getElementById('email');
input.value; // '用户输入的值'

这种方式可以应用于textpasswordhidden以及select。但是,对于单选框和复选框,value属性返回的永远是HTML预设的值,而我们需要获得的实际是用户是否“勾上了”选项,所以应该用checked判断:

// <label><input type="radio" name="weekday" id="monday" value="1"> Monday</label>
// <label><input type="radio" name="weekday" id="tuesday" value="2"> Tuesday</label>
var mon = document.getElementById('monday');
var tue = document.getElementById('tuesday');
mon.value; // '1'
tue.value; // '2'
mon.checked; // true或者false
tue.checked; // true或者false

提交表单

方式一是通过<form>元素的submit()方法提交一个表单,例如,响应一个<button>click事件,在JavaScript代码中提交表单:

<!-- HTML -->
<form id="test-form">
    <input type="text" name="test">
    <button type="button" onclick="doSubmitForm()">Submit</button>
</form>

<script>
function doSubmitForm() {
    var form = document.getElementById('test-form');
    // 可以在此修改form的input...
    // 提交form:
    form.submit();
}
</script>

这种方式的缺点是扰乱了浏览器对form的正常提交。浏览器默认点击<button type="submit">时提交表单,或者用户在最后一个输入框按回车键。


因此,第二种方式是响应<form>本身的onsubmit事件,在提交form时作修改:

<!-- HTML -->
<form id="test-form" onsubmit="return checkForm()">
    <input type="text" name="test">
    <button type="submit">Submit</button>
</form>

<script>
function checkForm() {
    var form = document.getElementById('test-form');
    // 可以在此修改form的input...
    // 继续下一步:
    return true;
}
</script>

注意要return true来告诉浏览器继续提交,如果return false,浏览器将不会继续提交form,这种情况通常对应用户输入有误,提示用户错误信息后终止提交form。

在检查和修改<input>时,要充分利用<input type="hidden">来传递数据。

例如,很多登录表单希望用户输入用户名和口令,但是,安全考虑,提交表单时不传输明文口令,而是口令的MD5。普通JavaScript开发人员会直接修改<input>

<!-- HTML -->
<form id="login-form" method="post" onsubmit="return checkForm()">
    <input type="text" id="username" name="username">
    <input type="password" id="password" name="password">
    <button type="submit">Submit</button>
</form>

<script>
function checkForm() {
    var pwd = document.getElementById('password');
    // 把用户输入的明文变为MD5:
    pwd.value = toMD5(pwd.value);
    // 继续下一步:
    return true;
}
</script>

这个做法看上去没啥问题,但用户输入了口令提交时,口令框的显示会突然从几个*变成32个*(因为MD5有32个字符)。

要想不改变用户的输入,可以利用<input type="hidden">实现:

<!-- HTML -->
<form id="login-form" method="post" onsubmit="return checkForm()">
    <input type="text" id="username" name="username">
    <input type="password" id="input-password">
    <input type="hidden" id="md5-password" name="password">
    <button type="submit">Submit</button>
</form>

<script>
function checkForm() {
    var input_pwd = document.getElementById('input-password');
    var md5_pwd = document.getElementById('md5-password');
    // 把用户输入的明文变为MD5:
    md5_pwd.value = toMD5(input_pwd.value);
    // 继续下一步:
    return true;
}
</script>

注意到idmd5-password<input>标记了name="password",而用户输入的idinput-password<input>没有name属性。没有name属性的<input>的数据不会被提交。



<think>好的,我现在需要帮助用户解决在R语言中无法下载特定GEO数据集文件的问题,特别是GSE276207和GSE154414的TSV.gz文件出现404错误的情况,并寻找替代来源。首先,我得回顾用户之前的对话和提供的引用内容,看看有没有相关的线索。用户提到之前遇到GEO数据集没有提供series_matrix文件的情况,只能手动下载,这可能意味着目标文件可能不存在于自动下载的链接中。引用[1]提到需要手动从GEO网页下载,比如RAW.tar压缩包。这可能是一个解决方案,即检查GSE页面是否有其他可用的文件。然后,用户提供的引用[2]讨论了处理没有基因名称的表达矩阵,需要下载GPL文件进行注释。这可能和当前问题无关,但说明用户在处理数据时可能需要后续步骤,但当前问题主要是下载失败。 引用[3]涉及不同数据格式的处理,比如h5ad格式,这提示用户可能需要处理多种格式的数据,但同样,当前问题集中在无法下载TSV.gz文件。用户现在遇到的HTTP404错误,说明文件可能被移动、删除或URL错误。首先需要验证URL是否正确。比如,用户提供的URL是:https://www.ncbi.nlm.nih.gov/geo/download/?format=file&type=rnaseq_counts&acc=GSE276207&file=GSE276207_raw_counts_GRCh38.p13_NCBI.tsv.gz我需要检查这个URL是否有效。访问这个链接,发现确实返回404,说明文件可能不存在。这可能是因为该GSE条目没有上传这个文件,或者文件名有误。例如,文件名中的版本号(如GRCh38.p13)是否正确?或者是否应该使用不同的参数? 接下来,应该考虑替代方法。根据引用[1],用户可能需要手动访问GEO页面,查找其他可用文件,比如原始数据压缩包(GSEXXX_RAW.tar)。例如,访问GSE276207的GEO页面,检查“Supplementary Files”部分是否有其他文件可供下载,比如RAW.tar或单独的样本文件。此外,用户还提到了GSE154414,同样需要检查其GEO页面。可能需要手动下载这些数据,然后使用R读取本地文件。例如,如果下载了RAW.tar,解压后可能有不同的文件格式,如TSV、CSV或HDF5,需要用相应的R包处理。 另外,用户可能没有注意到,某些GSE条目可能将原始数据存放在其他数据库中,比如SRA(Sequence ReadArchive),需要下载FASTQ文件后进行比对和计数,但这比较复杂。不过,用户提到的是已处理的计数矩阵,所以可能希望直接获取这些文件。可能的解决方案步骤包括:1.检查URL的正确性,确认acc参数和file参数是否匹配GSE条目中的实际文件名。 2.访问GEO网页手动查找文件。 3.使用GEOquery包尝试下载,但可能同样遇到问题。 4.寻找其他存储库,如EGA或第三方网站,但需注意数据许可。5.联系数据提交者或GEO支持团队。在R代码方面,用户可能需要使用不同的方法,比如GEOquery的getGEOSuppFiles函数,或者手动下载后读取。例如,如果GEO页面提供了其他格式的文件,如CSV或Excel,可能需要调整读取方式。 另外,用户提到的文件名中的GRCh38.p13可能指示基因组版本,如果该版本的文件不可用,可能需要尝试其他版本,如GRCh37,或者检查是否有拼写错误。总结来说,解决404错误的关键是确认文件是否存在,URL是否正确,以及寻找替代下载途径。如果无法自动下载,手动下载并本地处理可能是必要的。同时,用户可能需要处理不同的文件格式,如使用Seurat或GEOquery包来读取数据。</think>### 针对GEO数据集文件下载404错误的解决方案 #### 一、404错误原因分析 1. **URL结构问题** GEO自动生成下载链接可能包含版本号或文件名变动,例如: ```r # 原始错误URL示例 url <- "https://www.ncbi.nlm.nih.gov/geo/download/?format=file&type=rnaseq_counts&acc=GSE276207&file=GSE276207_raw_counts_GRCh38.p13_NCBI.tsv.gz" ``` - 检查`GRCh38.p13`是否为正确基因组版本号[^1] - 确认`acc=`参数与`file=`参数中的GSE编号一致 2. **数据发布状态** - 未完成审核的数据集可能临时关闭下载 - 原始数据可能仅以`GSEXXXX_RAW.tar`格式存在[^1] #### 二、手动下载替代方案 1. **通过GEO网页界面下载** 访问数据集页面(如`https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE154414`): - 在"Supplementary Files"部分查找`RAW.tar`压缩包 - 检查"Series Matrix File(s)"是否存在可解析的文本文件 2. **使用GEOquery包获取元数据** ```r library(GEOquery) gse <- getGEO("GSE154414", destdir = ".") show(gse) # 查看可用数据文件 ``` #### 三、自动化下载改进方法 1. **动态构建URL** ```r build_geo_url <- function(acc, genome_version = "GRCh38.p13") { base_url <- "https://www.ncbi.nlm.nih.gov/geo/download/" sprintf("%s?format=file&type=rnaseq_counts&acc=%s&file=%s_raw_counts_%s_NCBI.tsv.gz", base_url, acc, acc, genome_version) } # 测试不同基因组版本 test_url <- build_geo_url("GSE154414", "GRCh37") ``` 2. **分块下载验证** ```r library(httr) test_chunk_download <- function(url) { res <- HEAD(url) if(status_code(res) == 200) { file_size <- headers(res)$`content-length` message(sprintf("文件存在,大小: %s bytes", file_size)) } else { warning(sprintf("HTTP状态码: %d", status_code(res))) } } ``` #### 四、文件格式处理方案 当无法获取`.tsv.gz`时,处理其他格式: 1. **处理RAW.tar压缩包** ```r # 解压后处理多个文件 untar("GSE154414_RAW.tar", exdir = "GSE154414_data") count_files <- list.files("GSE154414_data", pattern = "*.tsv", full.names = TRUE) counts <- lapply(count_files, read.delim, row.names = 1) ``` 2. **读取h5ad格式(需Python环境)** ```r library(reticulate) scanpy <- import("scanpy") adata <- scanpy$read_h5ad("GSM1234567_counts.h5ad") counts <- t(adata$X) # 注意转置问题[^3] ``` #### 五、关键验证步骤 1. **基因组版本对照表** | GEO编号 | 有效基因组版本 | |------------|----------------------| | GSE154414 | GRCh38.p13 / hg38 | | GSE276207 | GRCh37.p13 / hg19 | 2. **备用下载源检查** ```r check_alternative_sources <- function(acc) { urls <- c( sprintf("https://ftp.ncbi.nlm.nih.gov/geo/series/%s/%s/suppl/", substr(acc, 1, 6), acc), sprintf("https://ega-archive.org/datasets/%s/", acc) ) sapply(urls, test_chunk_download) } ``` #### 六、典型错误处理流程 ```mermaid graph TD A[开始下载] --> B{HTTP状态码} B -- 200 --> C[校验文件完整性] B -- 404 --> D[检查URL参数] D --> E{是否版本错误?} E -- 是 --> F[尝试其他基因组版本] E -- 否 --> G[手动检查GEO页面] C -- 校验失败 --> H[断点续传] G -- 发现RAW.tar --> I[下载解压处理] ``` #### 七、最佳实践建议 1. **建立本地缓存系统** ```r cache_download <- function(url, cache_dir = "geo_cache") { if(!dir.exists(cache_dir)) dir.create(cache_dir) md5 <- digest::digest(url) cache_file <- file.path(cache_dir, paste0(md5, ".rds")) if(file.exists(cache_file)) { return(readRDS(cache_file)) } else { res <- download.file(url, tempfile()) saveRDS(res, cache_file) return(res) } } ``` 2. **使用Bioconductor数据源** ```r if (!require("BiocManager")) install.packages("BiocManager") BiocManager::install("GEOmetadb") library(GEOmetadb) geo_con <- dbConnect(SQLite(), "GEOmetadb.sqlite") dbGetQuery(geo_con, sprintf("SELECT * FROM gse WHERE gse='%s'", "GSE154414")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值