如何根据文本查找HTML元素,然后分配ID
How to find an HTML element based on text and then assign an ID
我有以下测试代码:
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<DT>change me dynamically</DT>
<DD>
<input class=" text" type="text" name="contact_details" value="" id="contact_details" >
<P CLASS="descr"></P>
</DD>
<script type="text/javascript">
$(document).ready(function() {
//loop thorugh all controls. find all labels (nodeType 1. Find the "change my dynamically" text. assign ID to control for use later.)
$("*").contents().each(function() {
if(this.nodeType == 1)
this.nodeValue = this.nodeValue.replace("change me dynamically", "bingo! you found me!");
$(this).attr("id","theid");
alert(this.nodeValue);
});
});
$('#theid').click(function() {
alert('you did it!');
});
</script>
以下是我要做的:
- 找到其中包含"动态更改我"文本的
- 为分配一个ID,如"ID=theid"
我假设的nodeType是一个,因为我更改了代码,从一开始就分配了一个ID,然后设置了一个onclick事件。。。像这样:
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<DT id="theid">change me dynamically</DT>
<DD>
<input class=" text" type="text" name="contact_details" value="" id="contact_details" >
<P CLASS="descr"></P>
</DD>
<script type="text/javascript">
$(document).ready(function() {
//loop thorugh all controls. find all labels (nodeType 1. Find the "change my dynamically" text. assign ID to control for use later.)
$("*").contents().each(function() {
if(this.nodeType == 1)
this.nodeValue = this.nodeValue.replace("change me dynamically", "bingo! you found me!");
$(this).attr("id","theid");
alert(this.nodeValue);
});
});
$('#theid').click(function() {
alert(this.nodeType);
});
</script>
alert命令将"1"显示为nodeType。但我显然做错了什么,因为我无法更改文本。
另一条评论-我知道我可以找到所有的项目,而不是得到所有的内容。。。但我将对其他元素类型使用类似的逻辑,而不仅仅是s。谢谢
编辑1
HTML比我向您展示的要多得多。。。这是完整的HTML:
<div id="page">
<div id="header">
<div class="leader">
<a href="#Content" class="hide">[Skip to main content]</a>
</div>
<div id="logo">
<div class="leader"></div>
<a href="/">home</a> |
<a href="">about</a>
</p></span>
<div class="tailer"></div>
</div> <!-- header -->
<div id="main">
<div class="leader">
</div>
<div id="nav">
<div class="leader">
<h3 class="hide">[Main menu]</h3>
</div>
<ul>
<li>Applications
<ul>
<li class='selected'><a class='selected' href="">Voicemail</a></li>
</ul>
</li>
</ul>
<div class="tailer">
</div>
</div> <!-- nav -->
<a name="Content"></a>
<div id="content">
<div class="leader">
</div>
<form action="" method="POST">
<input class=" hidden" type="hidden" name="redir" value="" >
<input class=" hidden" type="hidden" name="id" value="" readonly="true" >
<DT>Mobile Number</DT>
<DD>
<input class="testclass text" type="text" name="mobile_number" value="5371" id="mobile_number" readonly="false" >
</DD>
<DT>Rule Name</DT>
<DD>
<input class=" text" type="text" name="rulename" value="" >
<P CLASS="descr">Give this rule a name</P>
</DD>
<DT>Rule Type:</DT>
<DD>
<select name="ruletypes" id="ruletypes" ><option selected value="" ></option></select>
<P CLASS="descr"></P>
</DD>
<DT>When to use this rule</DT>
<DD>
<select name="rule_condition" id="rule_condition" ><option selected value="" ></option></select>
<P CLASS="descr"></P>
</DD>
<DT>What's the person's number?</DT>
<DD>
<input class=" text" type="text" name="caller_id_number" value="" id="caller_id_number" >
<P CLASS="descr"></P>
</DD>
<DT>Start Time</DT>
<DD>
<input class=" text" type="text" name="start_time" value="" id="start_time" >
<P CLASS="descr"></P>
</DD>
<DT>End Time</DT>
<DD>
<input class=" text" type="text" name="end_time" value="" id="end_time" >
<P CLASS="descr"></P>
</DD>
<input class=" hidden" type="hidden" name="user_id" value="1" readonly="true" >
<DT>Contact Type</DT>
<DD>
<select name="contact_types" id="contact_types" ><option selected value="" ></option></select>
<P CLASS="descr"></P>
</DD>
<DT>change me dynamically</DT>
<DD>
<input class=" text" type="text" name="contact_details" value="" id="contact_details" >
<P CLASS="descr"></P>
</DD>
<DT> Order</DT>
<DT></DT><DD><input class="submit" type="submit" name="submit" value="Create Rule">
</DD>
</FORM></DL>
<div class="tailer">
</div>
</div> <!-- content -->
</div> <!-- main -->
<div id="footer">
<div class="leader">
</div>
<div class="tailer">
</div>
</div> <!-- footer -->
</div> <!-- page -->
这个怎么样?
$('body :contains("change me dynamically")').text(function(_, text){
return text.replace(/change me dynamically/, "bingo! you found me!");
}).attr('id', 'theId');
演示
使用:包含来选择具有特定文本的元素,然后使用.text()
回调返回修改后的文本。
还要注意的是,在将id
指定为同一个时,如果有多个元素具有相同的上下文,则最终会创建具有重复id的html。
此外,您还确保将点击事件绑定放置在document.ready
内部,并在此逻辑之后,以便将事件正确绑定到具有该id的元素。
编辑
基于您的更新:
$('body :contains("change me dynamically")').contents().each(function () {
var exp = /change me dynamically/;
if (this.nodeValue && exp.test(this.nodeValue)) {
var $parent = $(this).parent().attr('id', 'theId');
$parent.text(function(_, text){
return text.replace(exp, "bingo! you found me!");
});
}
});
演示
如果你只有一个实例,那么(假设你添加了id)
var exp = /change me dynamically/;
$('body :contains("change me dynamically")').last().text(function (_, text) {
return text.replace(exp, "bingo! you found me!");
}).attr('id', 'theId');
演示
问题是文本实际上是TEXT_NODE
(3)类型的单独节点,它是DT
元素节点的子节点。元素上的nodeValue将始终为null。您需要修改文本节点的nodeValue。
如果您真的想以这种方式实现代码,我建议查找TEXT_NODE
,检查它是否包含要匹配的文本,替换文本,然后更新父节点的id。
if (this.nodeType == this.TEXT_NODE) {
if (this.nodeValue.indexOf("change me dynamically") != -1) {
if (this.parentNode.tagName != 'SCRIPT') {
this.nodeValue = this.nodeValue.replace("change me dynamically",
"bingo! you found me!");
$(this.parentNode).attr("id","theid");
console.log(this.parentNode.tagName);
}
}
}
我还添加了一个检查,以确保如果脚本是内联的,则不会尝试匹配SCRIPT
标记中的文本。
还要注意,如果要在$('#theid')
节点上设置单击处理程序,则应在$(document).ready
函数中进行设置。否则,在您尝试设置处理程序时,$(document).ready
函数将不会运行,因此id还没有分配。
- 如何将HTML id分配给元素,以及如何将JavaScript应用于元素
- 在循环中分配json值时,值被覆盖
- 动态分配GA增强型电子商务跟踪器
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 如何从单选按钮中获取多个值,然后将它们分配到单个变量中并在页面上显示
- 等待函数完成,然后将返回值分配给变量JS
- 为什么我们被教导将document.getElementById(“id”)分配给一个变量,然后将该变量与属性一起使用
- 检查 Jquery 何时分配了一个类,然后做一些事情
- 在PHP中将文件行分配给数组,然后在JavaScript数组中访问它
- 随机为图像分配一个值,然后传递动画
- 当您将字符串文本传递给变量,然后将该字符串中的数据分配给新变量时,它叫什么
- 如何根据文本查找HTML元素,然后分配ID
- 缓存对象项的完整路径然后将其用于分配是行不通的
- 使用Javascript创建元素,然后分配onclick来调用pikadate
- 将对象分配给数组,然后根据位置从数组调用它
- 为什么要分配字符串'原型'到一个变量,然后使用它来设置对象的原型
- JavaScript帮助,将用户输入值分配给一个数组,然后分配给一个UL
- 从删除/复制的对象中提取属性,然后分配给其他对象
- Angular JS从Ajax分配到作用域,然后计算
- 为什么我必须先将外部函数分配给变量,然后才能调用它