jQuery replaceWith() - 重新使用删除的值
jQuery replaceWith() - re-using the removed values
我正在使用 jQuery 为键盘用户删除靠在一起的相同 link。我仍然希望鼠标用户能够根据需要单击 'more' link,因此我将 link 重新悬停。
我所做的是有效的,但似乎有点废话。我在 Jquery api 中读到 replaceWith() returns 被替换的值,但是它把它们保存在哪里?我怎样才能在需要时取回它们?
我知道原始值进入某种数组。看起来应该可以在第一个函数中创建一个命名数组,然后在第二个函数中访问它的正确值。我对数组真的很不好,欢迎任何帮助。
jQuery(function ($) {
// dedupe links in post list widgets
$( ".widget li" ).each(function( i ) {
var firstA = $(this).children( 'a:first-child' );
var myH = $( firstA ).attr( 'href' );
var dupeA = $( firstA ).siblings( 'a' );
var dupeH = $( dupeA ).attr( 'href' );
if( dupeH == myH ) {
$( dupeA ).replaceWith( '<span class="more-link">Open</span>' );
}
});
// replace link if needed
$( '.widget li' ).hover(function( i ) {
var myH = $(this).children( 'a:first-child' ).attr( 'href' );
$(this).children( 'span.more-link' ).replaceWith( '<a href="' + myH + '" class="more-link">Open</a>' ).addClass( 'hover' );
});
});
ul {
list-style-type: none;
}
li, li > * {
float: left;
clear: left;
display: block;
}
li {
padding-bottom: 1em;
}
li a:first-child ~ * {
padding-left: 1em;
}
.more-link {
border: 1px solid red;
padding: .3em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="widget">
<ul class="index-widget">
<li>
<a href="https://whosebug.com">Stack Overflow</a>
<time>14 May 2018</time>
<span class="index-excerpt">Answers questions</span>
<a href="https://whosebug.com" class="more-link">Open</a>
</li>
<li>
<a href="https://jquery.com">jQuery</a>
<time>15 May 2018</time>
<span class="index-excerpt">Prompts questions</span>
<a href="https://jquery.com" class="more-link">Open</a>
</li>
</ul>
</div>
</body>
进一步编辑:现在在此处编写代码。谢谢,zer00ne。
您只需要获取 replaceWith
函数的返回值,以便稍后重用它。
例如:
var replaced = $( dupeA ).replaceWith( '<span class="more-link">Open</span>' );
replaced
将成为对替换的 dupeA
元素的引用。所以稍后你可以简单地做:
$(this).children( 'span.more-link' ).replaceWith( replaced );
重新启用 dopeA
。
您将了解变量的范围,以便能够在您需要的地方使用 replaced
。在您的示例中,您需要将 replaced
定义为全局变量或在绑定两个事件函数(主执行函数)的范围内定义。
有关 replaceWith
函数的更多信息,请参见 here。
希望对您有所帮助!
编辑
我已将该功能应用到您的案例中,并稍作改进。
jQuery(function ($) {
$('.widget li').each(function(i, e) {
var firstA = $(this).children('a:first-child');
var myH = $(firstA).attr('href');
var dupeA = $(firstA).siblings('a');
var dupeH = $(dupeA).attr('href');
var replaced = false; // Set a variable to check if the item has been replaced
var repA; // Stored the replaced item
if(dupeH == myH) {
// Replaces the item and stores the item in a variable
repA = $(dupeA).replaceWith($('<span class="more-link">Open [replaced]</span>'));
// Only if replaced, the mouseneter event is set
$(e).mouseenter(function() {
// If the element has not been replaced yet
if(replaced === false) {
// Sets the element as replaced
replaced = true;
// Put back the replaced element
$(this).children('span.more-link').replaceWith(repA.addClass('hover'));
}
});
}
});
});
ul {
list-style-type: none;
}
li, li > * {
float: left;
clear: left;
display: block;
}
li {
padding-bottom: 1em;
}
li a:first-child ~ * {
padding-left: 1em;
}
.more-link {
border: 1px solid red;
padding: .3em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="widget">
<ul class="index-widget">
<li>
<a href="https://whosebug.com">Stack Overflow</a>
<time>14 May 2018</time>
<span class="index-excerpt">Answers questions</span>
<a href="https://whosebug.com" class="more-link">Open</a>
</li>
<li>
<a href="https://jquery.com">jQuery</a>
<time>15 May 2018</time>
<span class="index-excerpt">Prompts questions</span>
<a href="https://jquery.com" class="more-link">Open</a>
</li>
</ul>
</div>
</body>
我正在使用 jQuery 为键盘用户删除靠在一起的相同 link。我仍然希望鼠标用户能够根据需要单击 'more' link,因此我将 link 重新悬停。
我所做的是有效的,但似乎有点废话。我在 Jquery api 中读到 replaceWith() returns 被替换的值,但是它把它们保存在哪里?我怎样才能在需要时取回它们?
我知道原始值进入某种数组。看起来应该可以在第一个函数中创建一个命名数组,然后在第二个函数中访问它的正确值。我对数组真的很不好,欢迎任何帮助。
jQuery(function ($) {
// dedupe links in post list widgets
$( ".widget li" ).each(function( i ) {
var firstA = $(this).children( 'a:first-child' );
var myH = $( firstA ).attr( 'href' );
var dupeA = $( firstA ).siblings( 'a' );
var dupeH = $( dupeA ).attr( 'href' );
if( dupeH == myH ) {
$( dupeA ).replaceWith( '<span class="more-link">Open</span>' );
}
});
// replace link if needed
$( '.widget li' ).hover(function( i ) {
var myH = $(this).children( 'a:first-child' ).attr( 'href' );
$(this).children( 'span.more-link' ).replaceWith( '<a href="' + myH + '" class="more-link">Open</a>' ).addClass( 'hover' );
});
});
ul {
list-style-type: none;
}
li, li > * {
float: left;
clear: left;
display: block;
}
li {
padding-bottom: 1em;
}
li a:first-child ~ * {
padding-left: 1em;
}
.more-link {
border: 1px solid red;
padding: .3em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="widget">
<ul class="index-widget">
<li>
<a href="https://whosebug.com">Stack Overflow</a>
<time>14 May 2018</time>
<span class="index-excerpt">Answers questions</span>
<a href="https://whosebug.com" class="more-link">Open</a>
</li>
<li>
<a href="https://jquery.com">jQuery</a>
<time>15 May 2018</time>
<span class="index-excerpt">Prompts questions</span>
<a href="https://jquery.com" class="more-link">Open</a>
</li>
</ul>
</div>
</body>
进一步编辑:现在在此处编写代码。谢谢,zer00ne。
您只需要获取 replaceWith
函数的返回值,以便稍后重用它。
例如:
var replaced = $( dupeA ).replaceWith( '<span class="more-link">Open</span>' );
replaced
将成为对替换的 dupeA
元素的引用。所以稍后你可以简单地做:
$(this).children( 'span.more-link' ).replaceWith( replaced );
重新启用 dopeA
。
您将了解变量的范围,以便能够在您需要的地方使用 replaced
。在您的示例中,您需要将 replaced
定义为全局变量或在绑定两个事件函数(主执行函数)的范围内定义。
有关 replaceWith
函数的更多信息,请参见 here。
希望对您有所帮助!
编辑 我已将该功能应用到您的案例中,并稍作改进。
jQuery(function ($) {
$('.widget li').each(function(i, e) {
var firstA = $(this).children('a:first-child');
var myH = $(firstA).attr('href');
var dupeA = $(firstA).siblings('a');
var dupeH = $(dupeA).attr('href');
var replaced = false; // Set a variable to check if the item has been replaced
var repA; // Stored the replaced item
if(dupeH == myH) {
// Replaces the item and stores the item in a variable
repA = $(dupeA).replaceWith($('<span class="more-link">Open [replaced]</span>'));
// Only if replaced, the mouseneter event is set
$(e).mouseenter(function() {
// If the element has not been replaced yet
if(replaced === false) {
// Sets the element as replaced
replaced = true;
// Put back the replaced element
$(this).children('span.more-link').replaceWith(repA.addClass('hover'));
}
});
}
});
});
ul {
list-style-type: none;
}
li, li > * {
float: left;
clear: left;
display: block;
}
li {
padding-bottom: 1em;
}
li a:first-child ~ * {
padding-left: 1em;
}
.more-link {
border: 1px solid red;
padding: .3em;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<body>
<div class="widget">
<ul class="index-widget">
<li>
<a href="https://whosebug.com">Stack Overflow</a>
<time>14 May 2018</time>
<span class="index-excerpt">Answers questions</span>
<a href="https://whosebug.com" class="more-link">Open</a>
</li>
<li>
<a href="https://jquery.com">jQuery</a>
<time>15 May 2018</time>
<span class="index-excerpt">Prompts questions</span>
<a href="https://jquery.com" class="more-link">Open</a>
</li>
</ul>
</div>
</body>