无法在文档上执行查询选择器,id不是有效的选择器

9 html javascript css

我正在尝试创建一种编辑一堆注释的方法,并通过我可以生成的一些id来识别它们.我遇到的错误是:

SyntaxError:无法在'Document'上执行'querySelector':'#1234'不是有效的选择器.不过,我看不出这是可能的,因为我已清楚id=1234<p>.

此外,还有一些问题,当我评论其他所有内容并执行警报(id)时,这不适用于第二种形式,错误是:

TypeError:无法读取null的属性'classList'.

这是jfiddle:https://jsfiddle.net/wafqgq0L/2/

document.querySelector('.editable').addEventListener('click', function(event) {
 var index = event.target.id.indexOf('_');

 var id = event.target.id.substring(0,index);
	
	//actual data
	document.querySelector('#'+id).classList.add('hidden');
  
  //edit button
  document.querySelector("#"+id+"_edit").classList.add('hidden');
  
  //textarea
	document.querySelector("#"+id+"_editable").classList.remove('hidden');
  
  //save button
	document.querySelector("#"+id+"_save").classList.remove('hidden');

});
Run Code Online (Sandbox Code Playgroud)
.hidden {
  display: none;
}
Run Code Online (Sandbox Code Playgroud)
//all id will be like 12345_comment

<div class="editable">
<p id="1234">
  Some comment
</p>

<form action="form.php" method="post">
  <textarea id="1234_editable" class="hidden">Some comment</textarea>
  <a href="#" id="1234_edit">Edit</a>
  <a href="#" id="1234_save" class="hidden">Save</a>
</form>
</div>
<br><br>
<div class="editable">
<p id="123">
  Some comment
</p>

<form class="editable" action="form.php" method="post">
  <textarea id="123_editable" class="hidden">Some comment</textarea>
  <a href="#" id="123_edit">Edit</a>
  <a href="#" id="123_save" class="hidden">Save</a>
</form>
</div>
Run Code Online (Sandbox Code Playgroud)

blu*_*fus 12

如果使用HTML4 id必须以字母开头(https://www.w3.org/TR/html4/types.html#type-id)

如果使用HTML5,您可以使用数字.

ids 更改为以字母开头(如id="p12345")或使用HTML5(即<!DOCTYPE html>在文档顶部使用)

  • 实际上,`document.querySelector('#000")`无论文档的DocType如何都会抛出错误.有趣的问题...... (2认同)

小智 7

您可以为此使用模板字符串文字,因为 id 必须用引号引起来,否则它将不起作用,并确保在文档顶部使用 HTML5。有了这个,我没有更多的问题。

例如:

document.querySelector(`[data-id="${id}" ]`);
Run Code Online (Sandbox Code Playgroud)

或者,如果出于任何原因您不想使用模板文字,请添加以下代码行:

document.querySelector("[data-id=" + "\'" + id + "\'" + "]");
Run Code Online (Sandbox Code Playgroud)

\'在双引号中带有转义字符。

希望这可以帮助。


css*_*hus 4

您可能会发现 jQuery 更容易,并且它会自动跨浏览器(并且输入速度更快!)因为它已标记在您的问题上,所以这是 jQuery 解决方案:

编辑:该标签jQuery已于 2019 年 5 月 25 日 21:10(问题提出并回答 3 年后)从原始问题中删除,用户John带有莫名其妙的编辑评论“删除垃圾邮件标签”。

jsFiddle Demo

$('[id^=edit_]').click(function(){
    var id = this.id.split('_')[1];
    $('#'+id).addClass('hidden');
    $('#edit_'+id).addClass('hidden');

    $('#save_'+id).removeClass('hidden');  
    $('#editable_'+id).removeClass('hidden');  
});

$('[id^=save_]').click(function(){
    var id = this.id.split('_')[1];
    $('#'+id).removeClass('hidden');
    $('#edit_'+id).removeClass('hidden');

    $('#save_'+id).addClass('hidden');  
    $('#editable_'+id).addClass('hidden');  
});
Run Code Online (Sandbox Code Playgroud)

请注意,我交换了 id_number 和 idName_ 前缀。这使得使用starts with选择器定位这些元素变得更加容易:id^=

  • 这确实提供了一种解决方法,但没有解释为什么`document.querySelector('#000')`确实会抛出错误,而`document.querySelector('[id="000"]')`检索元素就像` document.getElementById('000')` 确实... (3认同)