我希望你能帮助我......我想完全做到,四年前孩子在下面的贡献中问过jquery, how to run a function as soon as another function ends 。我知道这个问题早已解决了。我在这里找到了解决方案,经过长时间的探索如何处理以及现在是一大堆挫折之后,除了再次打开这个话题之外,我无能为力。所以这就是我想做的事情:
基本上我想要在单击元素(参考框)时定义要切入和/或切出的内容的行为。我有两个功能:
1.function' removeRefContent'
用于检查是否打开了其他引用的内容而不是单击的内容,如果是,则关闭
function: 'appendRefContent2EndOfLine'
只需添加点击的引用框的内容并显示它。
以下是基本代码段:
function displayRefContent(clickedRefID){
// check, if element is opened already
if ( $( 'div#' + clickedRefID + '_refAdditionalContent' ).length )) {
removeRefContent();
} else {
// check whether other element is opened and close
removeRefContent().then( appendRefContent2EndOfLine ( clickedRefID ) );
}
}
//这两个功能落后于
function appendRefContent2EndOfLine(requestedRefID){
// get refContent from reference storage container
var refContent = '<div id="' + requestedRefID + '_refAdditionalContent" class="refAdditionalContent">';
refContent = refContent + $( 'div#' + requestedRefID + '_additionalContentStorageContainer' ).html();
refContent = refContent + '</div>';
// find last refPreviewImage in elements row and store in variable lastElementInRowID
var lastElementInRowID = 0; //... some more code to find lastElementInRowID ...
// add refContent after last element in row and toggle in
$( 'div#' + lastElementInRowID + '_ref' ).after( refContent );
$( 'div#' + requestedRefID + '_refAdditionalContent' ).slideToggle( 500 );
}
var removeRefContent = function(){
var removeRefContentDeferred = $.Deferred();
$( 'div.refAdditionalContent' ).slideToggle( 500 , function() {
$( 'div.refAdditionalContent' ).remove( function() {
removeRefContentDeferred.resolve();
});
});
return removeRefContentDeferred.promise();
}
这两个功能都符合他们的意图。行的问题,行
removeRefContent()。then(appendRefContent2EndOfLine(clickedRefID));
请求。我想首先删除所有其他引用的内容(通过切换),并且只有在完成并且$(&#39; div.refAdditionalContent&#39;).remove完成后,才能执行appendRefContent2EndOfLine的另一个函数。 / p>
我阅读了很多关于异步,排队和序列的内容,但根本不明白,为什么我的解决方案不起作用。结果是,两个函数同时执行,导致冲突。
到目前为止,我认为在许多其他解决方案方法中,我选择的是最优雅的解决方案。但我非常愿意了解你的想法......
谢谢你们!
干杯弗兰克
答案 0 :(得分:0)
再次,更新的代码:
控制显示和隐藏元素内容的功能:
function displayRefContent ( clickedRefID ) {
if ( $( 'div#' + clickedRefID + '_refAdditionalContent' ).length ) { // check, if element is opened already, if yes then close only
removeRefContent();
} else {
if ( $( 'div.refAdditionalContent' ).length ) { // check whether other element is opened and close first, before open another element
removeRefContent().then( appendRefContent2EndOfLine ( clickedRefID ) );
} else {
appendRefContent2EndOfLine ( clickedRefID ); // if no other content element is opened, only open element
}
}
}
并且AT FIRST的两个函数淡出并删除对象,AFTERWARDS追加并淡入新对象
var removeRefContent = function () {
var defRemoveContent = $.Deferred();
$( 'div.refAdditionalContent' ).slideToggle( 500 , function()
$( 'div.refAdditionalContent' ).remove();
defRemoveContent.resolve();
});
return defRemoveContent.promise();
}
function appendRefContent2EndOfLine ( requestedRefID ) {
// get refContent from reference storage container (could be more elegant, but not relevant here)
var refContent = '<div id="' + requestedRefID + '_refAdditionalContent" class="refAdditionalContent">';
refContent = refContent + $( 'div#' + requestedRefID + '_additionalContentStorageContainer' ).html();
refContent = refContent + '</div>';
var lastElementInRowID = ...; // some code to find last refPreviewImage in elements row and store in variable lastElementInRowID
// add refContent after last element in row and toggle in
$( 'div#' + lastElementInRowID + '_ref' ).after( refContent );
$( 'div#' + requestedRefID + '_refAdditionalContent' ).slideToggle( 500 );
}
问题出在displayRefContent的情况下,其中已经打开了内容,需要先关闭然后再打开新内容。它同时执行,所以我不能影响顺序和时间(函数removeRefContent完成后函数appendRefContent2EndOfLine)。
感觉就像世界上最血腥的初学者,感到沮丧,没有更多的想法可以追随。还检查了,如果功能受到其他事情的影响,例如文档未完全加载事实,则在document.ready()之后加载内容。看不出任何影响。
谢谢,希望有人愿意帮忙 弗兰克