将递归函数转换为异步 CPS 实现 (javascript)

2023-12-31

这是我的功能。

    function duplicate_step_through_highlighted (element_jq, target_jq, char_cb) {
        console.log( element_jq);
        var contents = element_jq.contents();
        for (var i = 0 ; i < contents.length; ++i) {
            // if text node, step
            if (contents[i].nodeType === 3) {
                // insert empty text node
                var new_tn = document.createTextNode('');
                target_jq.append(new_tn);

                // iterate it 
                var text = contents[i].nodeValue;
                for (var j = 0; j < text.length; j++) {
                    char_cb(text[j],new_tn);
                    new_tn.nodeValue += text[j];
                    // *** I want an async delay here *** 
                }
            } else { // type should be 1: element
                // target_jq gets a duplicate element inserted, copying attrs
                var new_elem = $(contents[i].cloneNode(false)).appendTo(target_jq);
                duplicate_step_through_highlighted($(contents[i]),$(new_elem),char_cb);

                // then a recursive call is performed on the newly created element as target_jq
                // and the existing one as element_jq. char_cb is passed in
            }
        }
    }

我正在做的是通过一次重建一个字符来重建 HTML 元素。这样做有一个很好的理由,我想要它“输入”的视觉效果。

所以现在没有延迟,所以我的元素立即被复制。我已经检查结果是否一致,但我越来越清楚,我可能需要完全重写功能,以便能够在插入每个字符后插入异步延迟。

我是否需要重写它并有一个堆栈来跟踪我在元素中的位置?


你可能想看看我最近的answer https://stackoverflow.com/a/11657799/1048572 or 这个旧的 https://stackoverflow.com/a/10237157/1048572 (Demo http://jsfiddle.net/pZb8W/2/),关于如何实现这样的效果。


提示:不要将元素克隆到新元素中,只需隐藏它们并使它们逐个显示即可。

另外,除了原生 DOM 元素之外,根本不处理 jQuery 实例可能会更容易。所以是的,重写可能会做:-)而且我认为它也确实需要一个堆栈。

function animate(elements, callback) {
/* get: array with hidden elements to be displayes, callback function */
    var i = 0;
    (function iterate() {
        if (i < elements.length) {
            elements[i].style.display = "block"; // show
            animateNode(elements[i], iterate); 
            i++;
        } else if (callback)
            callback();
    })();
    function animateNode(element, callback) {
        var pieces = [];
        if (element.nodeType==1) {
            while (element.hasChildNodes())
                pieces.push(element.removeChild(element.firstChild));
            setTimeout(function childStep() {
                if (pieces.length) {
                    animateNode(pieces[0], childStep); 
                    element.appendChild(pieces.shift());
                } else
                    callback();
            }, 1000/60);
        } else if (element.nodeType==3) {
            pieces = element.data.match(/.{0,2}/g); // 2: Number of chars per frame
            element.data = "";
            (function addText(){
                element.data += pieces.shift();
                setTimeout(pieces.length
                    ? addText
                    : callback,
                  1000/60);
            })();
        }
    }
}

animate($("#foo").children());

jsfiddle.net 上的演示 http://jsfiddle.net/y9PJg/24/

怎么运行的:

  • The addText函数向当前文本节点添加一些字符,并为其自身设置超时 - 动画!如果一切都完成了,它会调用callback功能。
  • childStep在子节点上运行动画,并将其自身作为回调传递,直到没有子节点离开 - 然后调用callback功能。
  • 两者一起,animateNode递归地遍历节点树并按顺序对文本节点进行动画处理。
  • the iterate函数调用animateNode(在解除它们之后)在所有输入元素上,通过将其自身作为回调传递。所有输入元素完成后,它调用外部callback这是作为第二个参数给出的animate.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将递归函数转换为异步 CPS 实现 (javascript) 的相关文章

  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • 除了更改标题之外,如何在 Firefox 中强制另存为对话框?

    有没有办法在 ff 中强制打开 www example com example pdf 的另存为对话框 我无法更改标题 如果您可以将文件以 Base64 格式输出到客户端 则可以使用 data uri 进行下载 location href
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • Jquery/Javascript 上传和下载文件,无需后端

    是否可以在没有后端服务器的情况下在 JavaScript 函数中下载和上传文件 我需要导出和导入由 JavaScript 函数生成的 XML 我想创建按钮 保存 xml 来保存文件 但我不知道是否可行 另一方面 我希望将 XML 文件直接上
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 提交表单并重定向页面

    我在 SO 上看到了很多与此相关的其他问题 但没有一个对我有用 我正在尝试提交POST表单 然后将用户重定向到另一个页面 但我无法同时实现这两种情况 我可以获取重定向或帖子 但不能同时获取两者 这是我现在所拥有的
  • Grails 在 javascript 内的 GSP 站点中使用 grails var

    我有一个在 GSP 文件中的 javascript 代码中使用 grails 变量值的问题 例如 我有一个会话值session getAttribute selectedValue 我想在 javascript 代码部分使用这个值 我现在的
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • 使用 JQuery 更改元素的顺序

    有人知道我做错了什么吗 我正在尝试更改某些图像的显示顺序 我希望每次按下按钮时图像都会向右 向左移动一个位置 这是我尝试过的 但没有运气 任何帮助或见解将不胜感激 rightShift click function img hide var
  • Laravel 中只向登录用户显示按钮

    如果我以 John 身份登录 如何才能只显示 John 的红色按钮而不显示 Susan 的红色按钮 测试系统环境 Win10 Laravel5 4 Mysql5 7 19 table class table table responsive
  • jQuery 获取元素内的鼠标位置

    我希望制作一个控件 用户可以在 div 内单击 然后拖动鼠标 然后松开鼠标以指示他们想要的内容有多长 这是针对日历控件的 因此用户将指示特定事件的时间长度 看起来最好的方法是在父 div 上注册一个 mousedown 事件 而父 div
  • 我可以使用 jQuery 打开下拉列表吗

    对于 HTML 中的下拉列表
  • Jquery 验证不能正确验证数字?

    我在使用 jquery 非侵入式验证验证数字时遇到问题 我使用的版本是 ASP NET MVC 3 jQuery 1 9 1 jQuery 用户界面 1 10 1 JQuery 验证 1 11 0 我试图验证的输入是
  • Safari 支持 JavaScript window.onerror 吗?

    我有一个附加到 window onerror 的函数 window onerror function errorMsg url line window alert asdf 这在 firefox chrome 和 IE 中工作正常 但在 s
  • 如何更改此 jquery 插件的时区/时间戳?

    我正在使用这个名为 timeago 的插件 在这里找到 timeago yarp com 它工作得很好 只是它在似乎不同的时区运行 我住在美国东部 费城时区 当我将准确的 EST 时间放入 timeago 插件时 比如 2011 05 28
  • 为什么 jquery 没有检测到单选按钮未被选中的情况? [复制]

    这个问题在这里已经有答案了 可能的重复 JQuery radioButton change 在取消选择期间不会触发 https stackoverflow com questions 5176803 jquery radiobutton c
  • 将 MQTTNet 服务器与 MQTT.js 客户端结合使用

    我已经启动了一个 MQTT 服务器 就像this https github com chkr1011 MQTTnet tree master例子 该代码托管在 ASP Net Core 2 0 应用程序中 但我尝试过控制台应用程序 但没有成
  • jQuery 对象相等

    如何确定两个 jQuery 对象是否相等 我希望能够在数组中搜索特定的 jQuery 对象 inArray jqobj my array 1 alert deviceTypeRoot deviceTypeRoot False alert d
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp

随机推荐

  • 如何使用nodejs/express上传和读取文件

    有各种各样关于此的帖子 但我仍然不明白 我想上传 csv 并读取和处理其内容 我的玉文件是这个 views import jade extends layout block content h1 title form action impo
  • 扩展 Google 地图 + D3 示例以添加路径或线路

    我正在尝试修改这个Google 地图 D3 示例 http bl ocks org 1125458包括点之间的线 我采取的方法是为每行添加新的 svg 元素 我成功创建了一组新的 svg 元素 var markerLink layer se
  • Java 字符串参数

    我来自 net 背景 想知道创建返回布尔值并修改通过参数传入的字符串的方法的可接受方式 我知道字符串在 Java 中是不可变的 因此下面的代码片段将始终生成一个空字符串 我只能返回布尔值 不能抛出异常 如果我需要将 String 类包装在
  • 301 重定向在 WordPress 中无法通过 .htaccess 工作

    我尝试在 WordPress 中的 htaccess 文件中应用两个 301 重定向 但收到 404 错误 这是我所拥有的 BEGIN WordPress
  • C++ 参数协方差

    我想知道为什么 C 不支持参数的协方差 如下例所示 或者是否有办法实现它 class base public virtual base func base ptr return new base class derived public b
  • C#中抽象类不能被密封?

    我在某处读过 抽象和密封修饰符相当于静态类 我还发现 当你声明一个静态类时 编译器会在内部将该类标记为抽象和密封 并在 IL 代码中创建一个私有构造函数 所以 我决定这样做 static class A public static void
  • Vue.js:vuex 操作中未捕获的承诺

    我了解 vuex actions 返回承诺 但我还没有找到处理错误的理想模式在 vuex 中 我当前的方法是在我的 axios 插件上使用错误拦截器 然后将错误提交到我的 vuex 存储 in 插件 axios js export defa
  • System.Net.FtpClient openwrite 不会上传文件,除非我在退出前插入睡眠

    我正在使用 System Net FtpClient 程序集将文件上传到测试 FTP 站点 当我运行下面的代码时 文件不会出现在远程位置 除非我按照下面的方式使用 Thread Sleep 我不想使用 using System using
  • 如何知道哪个列表项对用户可见?

    我通过我的应用程序录制了视频 并将其存储在存储卡中 在我获取这些视频并将其添加到列表视图后 根据屏幕尺寸 用户只能看到一个视频 如果用户上下滚动并停止 那时我想知道哪一个在用户面前 如果有人知道解决方案请帮助我 或任何其他方法 提前致谢 好
  • Apache Lucene TokenStream 合同违规

    使用 Appache Lucene TokenStream 删除停用词 导致错误 TokenStream contract violation reset close call missing reset called multiple t
  • Ceres Solver:无法禁用日志记录(google glog)

    我在一个项目中使用 ceres 求解器 当我调用ceres Solve函数后 库开始输出如下行 iterative schur complement solver cc 88 No parameter blocks left in the
  • 根据另一个 NSArray 字符串的排序对自定义对象的 NSArray 进行排序

    我有两个NSArray我想要以相同方式排序的对象 一个包含NSString对象 其他自定义Attribute对象 这是我的 关键 NSArray 的样子 The master order NSArray stringOrder NSArra
  • spring-boot 与 tomcat 和 cxf-servlet

    我正在尝试使用 spring boot 来建立嵌入式 Tomcat 我想在应用程序中使用 CXF 来提供一组 Web 服务 但我不知道如何建立 CXF servlet 我的主课看起来像这样 Configuration EnableAutoC
  • 在 Android 中使用相机活动

    如果您想使用使用本机 Android 相机的内置相机 Activity 只需执行以下操作即可 Intent camera new Intent MediaStore ACTION IMAGE CAPTURE this startActivi
  • 为什么我们仍然在 .NET 中使用数据集?

    数据集是 NET 1 0 中最重要的东西之一 即使现在使用 NET 3 5 我仍然发现自己必须使用它们 特别是当我必须调用一个返回数据集的存储过程时 我最终会得到该数据集手动转换为对象以使其更易于使用 我从来没有真正喜欢过数据集 并且发现它
  • django 将 .values_list('datetimefield') 转换为日期

    我想将带有日期时间对象的 value list 字段转换为日期对象 values list time finished flat True 给我 2016 03 22T18 52 53 486Z 我想要的是 2016 03 22 谢谢你 您
  • Autofac多次注册组件

    在上一个关于如何可视化依赖关系图的问题中 https stackoverflow com a 59247007 1955317我为现在用来可视化我的依赖关系图的代码奠定了基础 因为它是由 Autofac 解析的 运行代码 我得到一棵树 生成
  • 为什么java进程使用的内存比预期多得多

    系统信息 操作系统 archlinux JDK OpenJDK IcedTea 2 4 3 ArchLinux 版本 7 u45 2 4 3 1 x86 64 运行应用程序 https github com aemoncannon ensi
  • 是否可以将观察者添加到tableView.contentOffset?

    我需要跟踪 tableView contentOffset y 是否可以将观察者添加到 tableView contentOffset 我认为这是不可能的 因为 contentOffset 不继承 NSObject 类 还有其他解决办法吗
  • 将递归函数转换为异步 CPS 实现 (javascript)

    这是我的功能 function duplicate step through highlighted element jq target jq char cb console log element jq var contents elem