单击即可进行多次更改
Make change multiple times on a single click
我试图让JavaScript在一次点击中多次更改文本,然后返回原始文本。我可以更改文本,但不能自动更改为另一段文本,也不能更改回原始文本。
因此,文本将从"原始文本"到"文本1"再到"文本2"再到到"文本3"等,根据我的需要,然后返回到"原始文本"
他是我目前掌握的代码
function changeText() {
document.getElementById('changingtext').innerHTML = 'text 1';
setTimeout("changeText()",3000);
}
这是html
<p id="changingtext" onclick="changeText()">original text</p>
如有任何帮助,我们将不胜感激。谢谢
如果您不介意将参数传递给函数:
function changeText(new_text) {
var original_text = document.getElementById('changingtext').innerHTML;
document.getElementById('changingtext').innerHTML = new_text;
setTimeout("changeText('"+original_text+"')",3000);
}
<p id="changingtext" onclick="changeText('text 1')">original text</p>
这里有一种方法。
var originalText,
messages = ['text 1', 'text 2', 'text 3'],
currentItem = 0;
function changeText() {
// capture the original text
originalText = originalText || document.getElementById('changingtext').innerHTML;
// get element
var elem = document.getElementById('changingtext');
// Check if we hit the last message
// if so, go back to original and stop
if (currentItem >= messages.length) {
elem.innerHTML = originalText;
} else {
elem.innerHTML = messages[currentItem++];
setTimeout("changeText()", 3000);
}
}
<p id="changingtext" onclick="changeText()">original text</p>
此解决方案使用文本数组进行循环,将原始文本添加为该数组中的最后一项。
Fiddle
Javascript
var changeTexts = ['text 1','text 2','text 3','text 4','text 5'];
function changeText(index) {
var element = document.getElementById('changingtext');
if(index >= changeTexts.length){
changeTexts.splice(-1,1);
return;
}
if(index === 0) changeTexts.push(element.innerHTML);
element.innerHTML = changeTexts[index];
index++;
setTimeout(function(){ changeText(index); },1000);
}
HTML
<p id="changingtext" onclick="changeText(0)">original text</p>
您遇到的问题是,您在单击和timeout
时都调用函数changeText
,而该函数会更改文本,因此在单击和单击timeout
后,您在changeText
函数中将文本设置为相同的硬编码值。
最好的解决方案是,正如IrkenInvader和Uzbekhon(在撰写本文时)已经回答的那样,在changeText
函数中添加一个参数,以便进行更多的自定义。我的javascript与两者略有不同,但这更像是一种偏好,而不是更好的解决方案本身,然而,我将发布我的javascript还有另一个原因。问题是,您使用带字符串的setTimeout
,这与使用eval
相同,这是一个很大的禁忌,原因有很多,正如本文所解释的,以及您可以在谷歌上轻松找到的许多许多其他原因。
出于这个原因,我推荐这种组合:
function changeText(new_text) {
var original_text = document.getElementById('changingtext').innerHTML;
document.getElementById('changingtext').innerHTML = new_text;
if (original_text != new_text) {
setTimeout(changeText.bind(this, original_text), 3000);
}
}
<p id="changingtext" onclick="changeText('text 1')">original text</p>
您可以在这里看到,使用了function.bind
,并将其作为第一个参数传递。这将跳过使用eval
,并且仍然能够将函数参数传递到setTimeout
中指定的func
,同时保持跨浏览器兼容性。过去的IE 9,你也可以使用
setTimeout(changeText, 3000, original_text);
所以,如果你不需要IE 9或更低版本,那就干净多了。
- 使用clickToggle并在单击另一个元素时关闭元素
- 单击时将焦点更改为元素
- 单击F5时如何停止页面加载
- 通过单击表单中的按钮,在代码生成中使用javascript生成字母数字代码
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 单击jquery清除输入值
- 单击按钮以等待单击按钮
- 在单击href链接的同时下载文件
- 单击顶部导航时如何进行向下滚动效果(向下滑动).
- 使图像在单击时展开到不大于浏览器
- 单击按钮后如何逐个调用分区,上一个分区将隐藏
- 如何在单击复选框后调用控制器方法
- 单击页面上的链接后高度发生变化
- 使用jquery在单击时在单元格中输入值
- 将纯文本URL转换为可单击链接
- ASP.NET通过单击JavaScript按钮触发c#事件
- 单击更改图标并通过javascript添加一个css类
- 阻止在select2单击时调用ajax
- 复制图像路径以单击它
- 当值更改时,在servlet中自动获取textarea值,无需单击按钮