您好我有关于更改DOM中元素的问题。我有一种情况,每当我点击按钮时它会显示一个div。 2秒后,初始div被另一个div替换,该div还有一个函数调用,再次删除div。
现在是棘手的部分。我想要的是每当我再次隐藏div时,第三次点击该按钮将再次显示div。
让我再解释一下。想象一下,我遇到了以下情况:
第三个子弹是棘手的。我怎样才能做到这一点?因为当我第三次点击按钮1时,它不再显示任何内容,因为我没有将其更改回原始状态
到目前为止我的代码JSFIDDLE
function Test(){
var target = window.event.target || window.event.srcElement;
console.log(target);
var content = arguments[0];
console.log(content);
$( "body" ).append( "<div class='red'>"+content+"</div>" );
setTimeout(function(){
$( ".press" ).replaceWith( "<button class='press' onclick='UnTest()'>button 1</button>" );
}, 2000);
}
function UnTest(){
$( ".red").remove();
}
请注意由于实施限制,如果点击按钮,我无法在我的功能中查看(例如$(".red").click()
)
答案 0 :(得分:2)
使用变量计算点击次数,最初等于0.然后,每次单击按钮时,将变量增加1并检查变量是奇数还是偶数。如果它很奇怪,你可以添加div
,如果它甚至你删除了div
:
var clicked = 0;
function Test() {
clicked++;
var content = arguments[0];
if (clicked % 2 === 1) {
$("body").append("<div class='red'>" + content + "</div>");
} else {
$(".red").remove();
clicked = 0;
}
}
小提琴:https://jsfiddle.net/2mvqmtwq/5/
提示:当变量均匀时,您可以将变量重置为0。
答案 1 :(得分:2)
有几种方法可以实现这一点,但快速解决方案可能只是切换按钮的onclick
属性(而不是完全替换它)。
// In setTimeout
setTimeout(function(){
$('.press').attr('onclick', 'UnTest()');
}, 2000);
function UnTest(){
$( ".red").remove();
$('.press').attr('onclick', 'Test("one")');
}
https://jsfiddle.net/2mvqmtwq/1/
这还允许您添加多个.red
div(类似于原始小提琴),然后单击一下(另一个答案不考虑,而是将其视为简单的可见性切换)
修改:对于多个按钮/实例(根据您的评论),您需要一个排序标识符。通过声明我们可以使用的target
,您的原始代码变得简单了。我们说我们有三个按钮:
<button class="press" onclick="Test('one')">button 1</button>
<button class="press" onclick="Test('two')">button 2</button>
<button class="press" onclick="Test('three')">button 3</button>
除了引用我们传递的字符串值(您声明为content
)之外,我们更新的JS不会发生太大的变化:
setTimeout(function(){
$(target).attr('onclick', 'UnTest("' + content + '")');
}, 2000);
除了引用您在顶部声明的target
之外(还允许我们保持每个按钮实例的唯一性)。
这里是我所做的所有更改的更新小提琴(附加参数,红框的范围类名称等):
答案 2 :(得分:1)
这是一个死的简单修复。我认为通过一些重构,我们可以更干净地完成这一切。但是既然你提到了实施限制,我不想提供可能打破这些限制的解决方案。
只需在UnTest()函数中添加逻辑
即可function UnTest(){
$( ".red").remove();
$( ".press" ).replaceWith( "<button class='press' onclick='Test(\"hello\")'>button 1</button>" );
}
答案 3 :(得分:1)
如何编写一些干净的代码,避免使用内联事件处理程序?
你可能做的是:
gsub("[-.?!]", "***", gsub("(?![-.?!'])[[:punct:]]", "", txt, perl=T))
div
是否已存在。如果是,只需切换它的显示而不是删除它。这只是一个关于如何做到这一点的演示。这个也适用于多个按钮/ div。正如我之前所说,我已经删除了内联事件处理程序,并将div类和函数参数添加为数据属性。您可以随意编辑代码以满足您的需求。
div
&#13;
$(document).on("click", ".press", function() {
var $this = $(this);
var $div = $("div." + $this.data("class"));
if ($div.length) {
$div.toggle();
return;
}
$( "body" ).append( $("<div/>", {
'class': $this.data("class"),
'html': $this.data("param")
}) );
});
&#13;
button{ margin:10px}
div {
width:200px;
height:50px;
}
.red {
background-color:red;
}
.blue {
background-color:blue;
}
.green {
background-color:green;
}
.orange {
background-color:orange;
}
&#13;